Symptoms: ${log.selectedSymptoms.join(', ') || 'None'}
Severity: ${log.severity || 'N/A'}
${log.notes ? `
Notes: ${log.notes}
` : ''}
`;
}).join('');
}
function renderSummary() {
if (userLogs.length === 0) {
summaryContent.innerHTML = '';
summaryPlaceholder.classList.remove('hidden');
downloadPdfBtn.disabled = true;
return;
}
summaryPlaceholder.classList.add('hidden');
downloadPdfBtn.disabled = false;
const symptomCounts = {};
const severityCounts = { Mild: 0, Moderate: 0, Severe: 0 };
const triggerFoods = {};
userLogs.forEach(log => {
log.selectedSymptoms.forEach(s => {
symptomCounts[s] = (symptomCounts[s] || 0) + 1;
});
if (log.severity) {
severityCounts[log.severity]++;
if(log.severity === 'Severe') {
triggerFoods[log.dairyItem] = (triggerFoods[log.dairyItem] || 0) + 1;
}
}
});
const mostCommonSymptom = Object.keys(symptomCounts).sort((a, b) => symptomCounts[b] - symptomCounts[a])[0] || 'None';
const topTriggerFood = Object.keys(triggerFoods).sort((a, b) => triggerFoods[b] - triggerFoods[a])[0] || 'None';
summaryContent.innerHTML = `
Total Entries:
${userLogs.length}
Most Common Symptom:
${mostCommonSymptom}
Top Trigger for Severe Symptoms:
${topTriggerFood}
Severity Breakdown:
Mild: ${severityCounts.Mild}, Mod: ${severityCounts.Moderate}, Sev: ${severityCounts.Severe}
`;
}
// --- PDF Generation ---
async function generatePdf() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });
// Header
doc.setFont('Inter', 'bold');
doc.setFontSize(24);
doc.setTextColor('#2563eb'); // blue-600
doc.text('Dairy Intolerance Log Report', 105, 20, { align: 'center' });
doc.setFont('Inter', 'normal');
doc.setFontSize(10);
doc.setTextColor('#64748b'); // slate-500
doc.text(`Report generated on: ${new Date().toLocaleDateString('en-US')}`, 105, 27, { align: 'center' });
doc.setLineWidth(0.5);
doc.setDrawColor('#93c5fd'); // blue-300
doc.line(20, 35, 190, 35);
// Summary Section
doc.setFont('Inter', 'bold');
doc.setFontSize(16);
doc.setTextColor('#1d4ed8'); // blue-700
doc.text('Summary', 20, 45);
const summaryEl = summaryContent.cloneNode(true);
const summaryText = Array.from(summaryEl.querySelectorAll('p')).map(p => p.textContent).join('\n');
doc.setFont('Inter', 'normal');
doc.setFontSize(11);
doc.setTextColor('#334155'); // slate-700
doc.text(summaryText.replace(/:/g, ':\n').replace(/,/g, '\n'), 22, 53, { lineHeightFactor: 1.5 });
// Log Entries Section
let startY = 100;
doc.setFont('Inter', 'bold');
doc.setFontSize(16);
doc.setTextColor('#1d4ed8'); // blue-700
doc.text('Detailed Log Entries', 20, startY);
startY += 8;
userLogs.slice(0, 15).forEach(log => { // Limit to 15 entries for PDF space
if (startY > 270) return; // Stop if we run out of page
const consumedDate = log.consumedAt.toDate();
doc.setFillColor(241, 245, 249); // slate-100
doc.rect(20, startY-5, 170, 22, 'F');
doc.setFont('Inter', 'bold');
doc.setFontSize(12);
doc.setTextColor('#1e293b'); // slate-800
doc.text(log.dairyItem, 22, startY);
doc.setFont('Inter', 'normal');
doc.setFontSize(9);
doc.setTextColor('#64748b'); // slate-500
doc.text(consumedDate.toLocaleString(), 110, startY);
startY += 7;
doc.setFontSize(10);
doc.setTextColor('#334155'); // slate-700
doc.text(`Symptoms: ${log.selectedSymptoms.join(', ') || 'None'} (Severity: ${log.severity})`, 22, startY);
startY += 15;
});
doc.save('Dairy_Intolerance_Report.pdf');
}
// --- Event Listeners ---
Object.keys(tabs).forEach(tabName => {
if (tabs[tabName]) tabs[tabName].addEventListener('click', () => setActiveTab(tabName));
});
if (logForm) logForm.addEventListener('submit', handleFormSubmit);
if (downloadPdfBtn) downloadPdfBtn.addEventListener('click', generatePdf);
if (logContainer) {
logContainer.addEventListener('click', (e) => {
if (e.target.classList.contains('delete-btn')) {
const logId = e.target.dataset.id;
deleteLog(logId);
}
});
}
// --- Initial Load ---
populateSymptoms();
setActiveTab('logEntry');