`);
});
}
function renderSellerSelect() {
sellerSelect.innerHTML = sellers.map(s => `
`).join('');
}
// --- EVENT HANDLERS & FORMS ---
sellerSelect.addEventListener('change', renderDashboard);
weightsForm.addEventListener('input', (e) => {
if (e.target.classList.contains('weight-input')) {
const key = e.target.dataset.key;
scoreWeights[key] = parseFloat(e.target.value) || 0;
updateTotalWeight();
renderAll();
}
});
sellerForm.addEventListener('submit', (e) => {
e.preventDefault();
const data = {};
Object.keys(metricKeys).forEach(key => data[key] = parseFloat(document.getElementById(`seller-${key}`).value));
data.name = document.getElementById('seller-name').value;
if (editingSellerId) { Object.assign(sellers.find(s => s.id === editingSellerId), data); } else { data.id = Date.now(); sellers.push(data); }
resetSellerForm(); renderAll();
});
document.getElementById('seller-list').addEventListener('click', (e) => {
if (e.target.classList.contains('seller-edit')) setupEditForm(parseInt(e.target.dataset.id));
if (e.target.classList.contains('seller-delete')) deleteSeller(parseInt(e.target.dataset.id));
});
document.getElementById('seller-form').addEventListener('click', (e) => {
if (e.target.id === 'cancel-edit-btn') resetSellerForm();
});
function resetSellerForm() { sellerForm.reset(); editingSellerId = null; document.getElementById('seller-form-title').textContent = 'Add New Seller'; document.getElementById('cancel-edit-btn').style.display = 'none'; }
function setupEditForm(id) { const s=sellers.find(s=>s.id===id); if(!s)return; document.getElementById('seller-id').value=s.id; document.getElementById('seller-name').value=s.name; Object.keys(metricKeys).forEach(k=>document.getElementById(`seller-${k}`).value=s[k]); editingSellerId=id; document.getElementById('seller-form-title').textContent='Edit Seller'; document.getElementById('cancel-edit-btn').style.display='inline-block';}
function deleteSeller(id) { if (confirm('Delete seller?')) { sellers = sellers.filter(s => s.id !== id); renderAll(); } }
function updateTotalWeight() { const total = Object.values(scoreWeights).reduce((a, b) => a + b, 0); const el = document.getElementById('total-weight'); el.textContent = `${total}%`; el.style.color = total !== 100 ? '#ef4444' : '#16a34a'; }
downloadPdfBtn.addEventListener('click', generatePdf);
// --- TABS & NAVIGATION ---
window.switchTab = (tabName) => { currentTab = tabName; Object.values(tabBtns).forEach(b=>b.classList.replace('tab-active', 'tab-inactive')); Object.values(tabContents).forEach(c=>c.style.display='none'); tabBtns[tabName].classList.replace('tab-inactive', 'tab-active'); tabContents[tabName].style.display = 'block'; };
window.navigateTabs = (dir) => { if (dir==='next' && currentTab==='verifier') switchTab('config'); else if (dir==='prev' && currentTab==='config') switchTab('verifier'); };
// --- PDF GENERATION ---
async function generatePdf() {
const { jsPDF } = window.jspdf;
const pdfReportElement = document.getElementById('pdf-report');
const seller = sellers.find(s => s.id === parseInt(sellerSelect.value));
if (!seller) return alert('Please select a seller.');
const { score } = calculateScore(seller);
document.getElementById('pdf-date').textContent = new Date().toLocaleDateString('en-US');
document.getElementById('pdf-seller-name').textContent = seller.name;
document.getElementById('pdf-score').textContent = score.toFixed(0);
document.getElementById('pdf-assessment').textContent = document.getElementById('trust-assessment').textContent;
document.getElementById('pdf-score-card').style.backgroundColor = {Verified: '#f0fdf4', 'Review Manually': '#fefce8', 'High Risk': '#fee2e2'}[document.getElementById('trust-assessment').textContent];
document.querySelector('#pdf-score-card p').style.color = document.getElementById('score-circle').style.borderColor;
const pdfTableBody = document.getElementById('pdf-table-body');
pdfTableBody.innerHTML = '';
Object.keys(metricKeys).forEach(key => {
const value = key === 'identity' ? (seller[key] ? 'Verified' : 'Unverified') : seller[key].toLocaleString();
pdfTableBody.insertAdjacentHTML('beforeend', `
| ${metricKeys[key].label} | ${value} | ${scoreWeights[key]}% |
`);
});
document.getElementById('pdf-chart-image').src = scoreChart.toBase64Image();
const canvas = await html2canvas(pdfReportElement, { scale: 2 });
const imgData = canvas.toDataURL('image/jpeg', 0.85);
const pdf = new jsPDF('p', 'mm', 'a4');
const pdfWidth = pdf.internal.pageSize.getWidth();
const pdfHeight = (canvas.height * pdfWidth) / canvas.width;
pdf.addImage(imgData, 'JPEG', 0, 0, pdfWidth, pdfHeight);
pdf.save(`Seller-Verification-${seller.name}.pdf`);
}
// --- INITIALIZATION ---
function init() {
scoreWeights = { age: 15, sales: 25, reviews: 30, chargebacks: 20, identity: 10 };
sellers = [
{ id: 1, name: 'Premium Tech Outlet', age: 800, sales: 6200, reviews: 4.8, chargebacks: 0.5, identity: 1 },
{ id: 2, name: 'QuickShip Goods', age: 120, sales: 850, reviews: 4.5, chargebacks: 1.2, identity: 1 },
{ id: 3, name: 'Bargain Bin', age: 30, sales: 200, reviews: 3.8, chargebacks: 2.5, identity: 0 },
{ id: 4, name: 'Global Exports Inc.', age: 1500, sales: 10000, reviews: 4.2, chargebacks: 1.8, identity: 1 }
];
renderAll();
}
init();
});