const others = d.langStats.filter(x=>x!==topLang).map(x=>`${(x.lang||'-').toUpperCase()} ${Math.round((x.total/total)*100)}%`).join(' • ');
$('#kpiLangBreak').textContent = others;
}else{ $('#kpiTopLang').textContent='-'; $('#kpiLangBreak').textContent=''; }
}
function updateCharts(d){
chartPerDay.data.labels = d.perDay.map(r=>r.d); chartPerDay.data.datasets[0].data = d.perDay.map(r=>Number(r.c)); chartPerDay.update();
const f = (d.foundStats.find(r=>r.result==='found')||{}).total||0; const n=(d.foundStats.find(r=>r.result==='not_found')||{}).total||0;
chartFound.data.datasets[0].data = [f,n]; chartFound.update();
chartLang.data.labels = d.langStats.map(r=>r.lang||'-'); chartLang.data.datasets[0].data = d.langStats.map(r=>Number(r.total)); chartLang.update();
chartCost.data.labels = d.avgCost.map(r=>r.code); chartCost.data.datasets[0].data = d.avgCost.map(r=>Number(r.cost)); chartCost.update();
}
function updateTable(d){
const tbody = $('#topTableBody'); tbody.innerHTML='';
d.topQueries.sort((a,b)=>Number(b.total)-Number(a.total)).slice(0,100).forEach((r,i)=>{
const tr = document.createElement('tr');
const pct = r.foundRate!=null? Math.round(Number(r.foundRate)*100):'';
tr.innerHTML = `
${i+1} |
${r.query} |
${fmt(r.total)} |
${pct? pct+'%':''} | `;
tbody.appendChild(tr);
});
}
function exportXlsx(){
const wb = XLSX.utils.book_new();
const s1 = XLSX.utils.json_to_sheet(currentData.topQueries);
XLSX.utils.book_append_sheet(wb, s1, 'TopQueries');
const s2 = XLSX.utils.json_to_sheet(currentData.perDay);
XLSX.utils.book_append_sheet(wb, s2, 'PerDay');
const s3 = XLSX.utils.json_to_sheet(currentData.langStats);
XLSX.utils.book_append_sheet(wb, s3, 'Lang');
const s4 = XLSX.utils.json_to_sheet(currentData.foundStats);
XLSX.utils.book_append_sheet(wb, s4, 'Found');
const s5 = XLSX.utils.json_to_sheet(currentData.avgCost);
XLSX.utils.book_append_sheet(wb, s5, 'AvgCost');
XLSX.writeFile(wb, `lily-report_${$('#startDate').value}_${$('#endDate').value}.xlsx`);
}
function setQuickRange(tag){
const t=todayStr(0);
if(tag==='today'){ $('#startDate').value=t; $('#endDate').value=t; }
if(tag==='7d'){ $('#startDate').value=todayStr(-7); $('#endDate').value=t; }
if(tag==='30d'){ $('#startDate').value=todayStr(-30); $('#endDate').value=t; }
}
async function fetchStats(){
const qs = new URLSearchParams({
start: $('#startDate').value,
end: $('#endDate').value,
lang: $('#langSel').value,
device:$('#devSel').value,
ref: $('#refInput').value.trim()
});
$('#statusBar').textContent='กำลังดึงข้อมูล…';
try{
const res = await fetch(`${API_BASE}/stats.php?${qs.toString()}`);
const data = await res.json(); currentData = data;
updateKpis(data); updateCharts(data); updateTable(data);
$('#statusBar').textContent = 'อัปเดตล่าสุด: '+new Date().toLocaleString();
}catch(e){ console.error(e); $('#statusBar').textContent='ดึงข้อมูลไม่สำเร็จ'; }
}
// init
window.addEventListener('DOMContentLoaded', ()=>{
ensureCharts();
setQuickRange('7d'); // ค่าเริ่มต้น 7 วัน
document.querySelectorAll('.qbtn').forEach(b=> b.addEventListener('click', e=>{ setQuickRange(e.target.dataset.qrange); }));
$('#applyBtn').addEventListener('click', fetchStats);
$('#exportBtn').addEventListener('click', exportXlsx);
fetchStats();
});