`;
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 = calculateImpact();
if (!results) return;
const bodyWeight = document.getElementById('body-weight').value || 'N/A';
const sessionDate = sessionDateInput.value ? new Date(sessionDateInput.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.setTextColor(30, 41, 59);
doc.text('Dehydration Impact Report', margin, y);
y += 15;
// User Info
doc.setFont('helvetica', 'bold');
doc.setFontSize(11);
doc.text('Body Weight:', margin, y);
doc.setFont('helvetica', 'normal');
doc.text(`${bodyWeight} lbs`, margin + 30, y);
doc.setFont('helvetica', 'bold');
doc.text('Date:', pageWidth / 2 + 20, y);
doc.setFont('helvetica', 'normal');
doc.text(sessionDate, pageWidth / 2 + 35, y);
y += 10;
doc.setDrawColor(226, 232, 240);
doc.line(margin, y, pageWidth - margin, y);
y += 10;
// Results Summary
const summaryData = [
{ label: 'Total Fluid Loss', value: `${(results.totalFluidLossMl / 29.5735).toFixed(1)} oz`, detail: '(From alcohol & activity)' },
{ label: 'Total Water Intake', value: `${(results.waterIntakeMl / 29.5735).toFixed(1)} oz` },
{ label: 'Net Fluid Balance', value: `${(results.netFluidBalanceMl / 29.5735).toFixed(1)} oz` },
{ label: 'Dehydration Level', value: `${results.dehydrationPercent.toFixed(2)}%` }
];
doc.setFontSize(10);
summaryData.forEach(item => {
doc.setFont('helvetica', 'bold');
doc.text(item.label + ':', margin, y);
doc.setFont('helvetica', 'normal');
doc.text(item.value, margin + 50, y);
if (item.detail) {
doc.setFont('helvetica', 'italic');
doc.setTextColor(107, 114, 128);
doc.text(item.detail, margin + 75, y);
doc.setTextColor(0, 0, 0);
}
y += 8;
});
y += 5;
// Final Status & Recommendation
doc.setFillColor(243, 244, 246);
doc.rect(margin, y, pageWidth - 2 * margin, 30, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(12);
doc.text('Overall Status:', margin + 5, y + 8);
doc.setTextColor(results.colorClass.includes('red') ? 220 : (results.colorClass.includes('yellow') ? 202 : 22), results.colorClass.includes('red') ? 38 : (results.colorClass.includes('yellow') ? 138 : 163), results.colorClass.includes('red') ? 38 : (results.colorClass.includes('yellow') ? 4 : 74));
doc.text(results.status, margin + 40, y + 8);
doc.setTextColor(55, 65, 81);
doc.setFont('helvetica', 'normal');
doc.setFontSize(10);
const recLines = doc.splitTextToSize(results.advice, pageWidth - (margin * 2) - 10);
doc.text(recLines, margin + 5, y + 16);
y += 40;
// Footer
doc.setFontSize(8);
doc.setTextColor(148, 163, 184);
doc.text(`This report is an estimation and for informational purposes only. It is not a substitute for medical advice.`, margin, pageHeight - 15);
doc.text(`Individual responses to alcohol and dehydration can vary.`, margin, pageHeight - 10);
doc.save(`Dehydration_Impact_Report.pdf`);
}
// --- EVENT LISTENERS ---
if(calculateBtn) calculateBtn.addEventListener('click', displayResults);
if(downloadPdfBtn) downloadPdfBtn.addEventListener('click', generatePdf);
if(addDrinkBtn) addDrinkBtn.addEventListener('click', addDrinkRow);
drinksContainer.addEventListener('click', (e) => {
if (e.target.classList.contains('remove-drink-btn')) {
const rowId = e.target.dataset.rowId;
const rowToRemove = document.getElementById(`drink-row-${rowId}`);
if (rowToRemove) {
rowToRemove.remove();
}
}
});
// --- INITIALIZATION ---
sessionDateInput.valueAsDate = new Date();
addDrinkRow(); // Start with one drink row by default
});
