`;
// Update Chart
const chartCtx = document.getElementById('score-chart').getContext('2d');
if (scoreChartInstance) {
scoreChartInstance.destroy();
}
scoreChartInstance = new Chart(chartCtx, {
type: 'doughnut',
data: {
labels: ['Sleep Quality Score', ''],
datasets: [{
data: [results.percentage, 100 - results.percentage],
backgroundColor: [results.colorClass.replace('text-', 'bg-').replace('-600', '-500'), '#e5e7eb'],
borderColor: ['#ffffff'],
borderWidth: 4,
}]
},
options: {
responsive: true,
cutout: '70%',
plugins: {
legend: { display: false },
tooltip: { enabled: false }
}
}
});
resultsSection.style.display = 'block';
resultsSection.scrollIntoView({ behavior: 'smooth' });
}
/**
* Generates and downloads a PDF report.
*/
async function generatePdf() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' });
const results = calculateScore();
if (!results) return;
const userName = document.getElementById('user-name').value || 'N/A';
const assessmentDate = assessmentDateInput.value ? new Date(assessmentDateInput.value).toLocaleDateString() : 'N/A';
const pageHeight = doc.internal.pageSize.height;
const pageWidth = doc.internal.pageSize.width;
const margin = 15;
let y = margin;
// Header
doc.setFont('helvetica', 'bold');
doc.setFontSize(20);
doc.text('Sleep Quality Assessment Report', margin, y);
y += 15;
// User Info
doc.setFont('helvetica', 'bold');
doc.setFontSize(11);
doc.text('Name:', margin, y);
doc.setFont('helvetica', 'normal');
doc.text(userName, margin + 20, y);
doc.setFont('helvetica', 'bold');
doc.text('Date:', pageWidth / 2 + 20, y);
doc.setFont('helvetica', 'normal');
doc.text(assessmentDate, pageWidth / 2 + 35, y);
y += 10;
doc.setDrawColor(226, 232, 240);
doc.line(margin, y, pageWidth - margin, y);
y += 15;
// Result Summary
doc.setFont('helvetica', 'bold');
doc.setFontSize(14);
doc.text('Assessment Result', margin, y);
y += 10;
doc.setFontSize(12);
doc.text('Overall Sleep Quality:', margin, y);
doc.setFont('helvetica', 'bold');
if (results.level.includes('Good')) doc.setTextColor(34, 197, 94);
else if (results.level.includes('Moderate')) doc.setTextColor(234, 179, 8);
else doc.setTextColor(220, 38, 38);
doc.text(results.level, margin + 55, y);
doc.setTextColor(0, 0, 0);
y += 15;
// Recommendations
doc.setFont('helvetica', 'bold');
doc.setFontSize(12);
doc.text('Personalized Recommendations:', margin, y);
y += 8;
doc.setFont('helvetica', 'normal');
doc.setFontSize(10);
results.advice.forEach(item => {
const lines = doc.splitTextToSize(`- ${item}`, pageWidth - (margin * 2) - 5);
doc.text(lines, margin + 5, y);
y += lines.length * 5 + 2;
if (y > pageHeight - 25) { doc.addPage(); y = margin; }
});
if (results.advice.length === 0) {
doc.text('- Your habits indicate excellent sleep hygiene. Keep it up!', margin + 5, y);
y += 7;
}
// Footer
doc.setFontSize(8);
doc.setTextColor(148, 163, 184);
doc.text(`This self-assessment is for informational purposes and is not a substitute for a medical diagnosis.`, margin, pageHeight - 15);
doc.text(`If you have persistent sleep problems, consult a healthcare professional.`, margin, pageHeight - 10);
doc.save(`Sleep_Quality_Report_${userName.replace(/ /g, '_')}.pdf`);
}
// --- EVENT LISTENERS ---
if(calculateBtn) calculateBtn.addEventListener('click', displayResults);
if(downloadPdfBtn) downloadPdfBtn.addEventListener('click', generatePdf);
// --- INITIALIZATION ---
assessmentDateInput.valueAsDate = new Date();
});
