`;
function renderCharts(chartData) {
const labels = state.historicalData.map(d => d.date);
const priceData = state.historicalData.map(d => d.close);
const chartDefaults = { scales: { x: { type: 'time', time: { unit: 'day' }, grid: { color: '#374151' } }, y: { grid: { color: '#374151' } } } };
Chart.defaults.color = '#d1d5db';
if (priceChart) priceChart.destroy();
priceChart = new Chart(document.getElementById('price-chart'), { type: 'line', data: { labels, datasets: [
{ label: 'Close Price', data: priceData, borderColor: '#e5e7eb', borderWidth: 2, pointRadius: 0 },
{ label: `SMA(${state.settings.shortMa})`, data: chartData.shortMa, borderColor: '#60a5fa', borderWidth: 1.5, pointRadius: 0 },
{ label: `SMA(${state.settings.longMa})`, data: chartData.longMa, borderColor: '#f59e0b', borderWidth: 1.5, pointRadius: 0 }
]}, options: chartDefaults });
if (rsiChart) rsiChart.destroy();
rsiChart = new Chart(document.getElementById('rsi-chart'), { type: 'line', data: { labels, datasets: [{ label: 'RSI', data: chartData.rsi, borderColor: '#a78bfa', borderWidth: 2, pointRadius: 0, fill: { target: 'origin', above: 'rgba(167, 139, 250, 0.1)', below: 'rgba(167, 139, 250, 0.1)' } }]}, options: { ...chartDefaults, scales: { ...chartDefaults.scales, y: { ...chartDefaults.scales.y, min: 0, max: 100 } } } });
}
runAnalysisBtn.addEventListener('click', runAnalysis);
// --- PDF GENERATION ---
async function generatePdfReport() {
const result = state.analysisResult;
if (!result) return alert("Please run an analysis first.");
downloadPdfBtn.disabled = true;
downloadPdfBtn.textContent = 'Generating...';
const priceChartImg = priceChart.toBase64Image();
const rsiChartImg = rsiChart.toBase64Image();
const { kpis } = result;
const createPdfKpi = (label, value, status = '') => ``;
const reportHtml = `
`;
const pdfTemplate = document.getElementById('pdf-template');
pdfTemplate.innerHTML = reportHtml;
pdfTemplate.classList.remove('invisible');
try {
const { jsPDF } = window.jspdf;
const canvas = await html2canvas(pdfTemplate.querySelector('.pdf-report-container'), { scale: 2 });
const imgData = canvas.toDataURL('image/png');
const pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' });
pdf.addImage(imgData, 'PNG', 0, 0, pdf.internal.pageSize.getWidth(), (canvas.height * pdf.internal.pageSize.getWidth()) / canvas.width);
pdf.save(`${state.settings.ticker.split(' ')[0]}_Market_Analysis.pdf`);
} catch(e) { console.error('PDF Generation Error:', e);
} finally {
downloadPdfBtn.disabled = false;
downloadPdfBtn.textContent = 'Download Analysis Report';
pdfTemplate.classList.add('invisible');
}
}
downloadPdfBtn.addEventListener('click', generatePdfReport);
// --- INITIALIZATION ---
generateSampleData();
populateSettingsUI();
renderDataTable();
attachDataListeners();
runAnalysis();
switchTab(0);
});
${label}
${value}
Futures Market Analysis
Contract: ${state.settings.ticker}
Date: ${new Date().toLocaleDateString()}
Key Indicator Summary
${createPdfKpi('Current Trend', kpis.trend, kpis.trend === 'Up' ? 'up' : kpis.trend === 'Down' ? 'down' : 'neutral')}
${createPdfKpi('RSI Value', kpis.rsi.toFixed(2))}
${createPdfKpi('RSI Condition', kpis.rsiCondition, 'neutral')}
${createPdfKpi('Volatility (ATR)', kpis.volatility.toFixed(2))}
