/* Screen 1: Upload - 三端口上传 */
import { state } from '../state.js';
import { uploadFiles, parseSession, getRenderOptions } from '../api.js';
import { goStep, toast } from '../steps.js';
const PORTS = ['savings', 'ci', 'iul'];
const PORT_LABELS = { savings: '储蓄险', ci: '重疾险', iul: 'IUL' };
// 当前各端口状态
const portFiles = { savings: null, ci: null, iul: null };
const portCompanies = { savings: '', ci: '', iul: '' };
let companiesList = [];
function initCompanySelects() {
getRenderOptions().then((data) => {
companiesList = data.companies || [];
// IUL 专属公司列表(新加坡IUL市场)
const IUL_COMPANIES = ['transamerica', 'sunlife', 'manulife'];
// 储蓄险白名单: 排除大东方人寿 (great-eastern)
const SAVINGS_COMPANIES = companiesList
.filter((c) => c.id !== 'great-eastern')
.map((c) => ``).join('');
// 重疾险仅保留友邦 (aia) + 周大福 (ctf)
const CI_COMPANIES = ['aia', 'ctf'];
const ciOpts = companiesList
.filter((c) => CI_COMPANIES.includes(c.id))
.map((c) => ``).join('');
const iulOpts = companiesList
.filter((c) => IUL_COMPANIES.includes(c.id))
.map((c) => ``).join('');
PORTS.forEach((p) => {
const sel = document.getElementById(`company${p.charAt(0).toUpperCase() + p.slice(1)}`);
if (!sel) return;
let opts = '';
if (p === 'iul') opts = iulOpts;
else if (p === 'ci') opts = ciOpts;
else opts = SAVINGS_COMPANIES;
sel.innerHTML = '' + opts;
});
}).catch(() => {});
}
function updateUI() {
const count = PORTS.filter((p) => portFiles[p]).length;
document.getElementById('uploadFileCount').textContent = count;
const btn = document.getElementById('uploadStartBtn');
if (btn) btn.disabled = count === 0;
}
function setupPort(portType) {
const cap = portType.charAt(0).toUpperCase() + portType.slice(1);
const dz = document.getElementById(`dropzone${cap}`);
const input = dz?.querySelector('input[type="file"]');
if (!dz || dz.dataset.bound) return;
dz.dataset.bound = '1';
dz.onclick = () => input?.click();
input.onchange = (e) => {
const file = e.target.files?.[0];
if (!file) return;
if (!file.name.toLowerCase().endsWith('.pdf')) { toast(`${file.name} 不是PDF`, 'warning'); return; }
if (file.size > 30 * 1024 * 1024) { toast(`${file.name} 超过30MB`, 'error'); return; }
portFiles[portType] = file;
document.getElementById(`file${cap}Name`).textContent = file.name;
document.getElementById(`file${cap}`).classList.remove('hidden');
dz.querySelector('p').textContent = '✅ ' + file.name;
dz.classList.add('border-primary-container');
updateUI();
};
['dragenter', 'dragover'].forEach((ev) => dz.addEventListener(ev, (e) => { e.preventDefault(); dz.classList.add('drag-active'); }));
['dragleave', 'drop'].forEach((ev) => dz.addEventListener(ev, (e) => { e.preventDefault(); dz.classList.remove('drag-active'); }));
dz.addEventListener('drop', (e) => {
const file = e.dataTransfer.files?.[0];
if (file) {
input.files = e.dataTransfer.files;
input.dispatchEvent(new Event('change'));
}
});
// Company selector
const sel = document.getElementById(`company${cap}`);
if (sel) sel.onchange = () => { portCompanies[portType] = sel.value; };
}
export function initUpload() {
PORTS.forEach(setupPort);
initCompanySelects();
document.getElementById('uploadClearBtn').onclick = () => {
PORTS.forEach((p) => {
portFiles[p] = null;
const cap = p.charAt(0).toUpperCase() + p.slice(1);
const dz = document.getElementById(`dropzone${cap}`);
if (dz) {
dz.querySelector('p').textContent = '点击上传' + PORT_LABELS[p] + ' (PDF)';
dz.classList.remove('border-primary-container', 'drag-active');
}
document.getElementById(`file${cap}`).classList.add('hidden');
});
updateUI();
};
document.getElementById('uploadStartBtn').onclick = onStartParse;
updateUI();
}
async function onStartParse() {
// 验证: 已上传文件的端口必须选择公司
const missing = PORTS.filter((p) => portFiles[p] && !portCompanies[p]);
if (missing.length) {
const names = missing.map((p) => PORT_LABELS[p]).join('、');
toast(`请为 ${names} 选择公司`, 'warning');
return;
}
const btn = document.getElementById('uploadStartBtn');
btn.disabled = true;
btn.innerHTML = 'progress_activity 上传中...';
try {
const files = PORTS.filter((p) => portFiles[p]).map((p) => ({ file: portFiles[p], type: p }));
const { sessionId } = await uploadFiles(files, {
savings: portCompanies.savings,
ci: portCompanies.ci,
iul: portCompanies.iul,
});
state.sessionId = sessionId;
state.files = files.map((f) => ({ file: { name: f.file.name }, type: f.type }));
// Save company selections
state.savingsCompany = portCompanies.savings;
state.ciCompany = portCompanies.ci;
state.iulCompany = portCompanies.iul;
toast('文件已上传,开始 AI 解析...', 'success');
goStep('parsing');
const waitParse = setInterval(() => {
if (window.__triggerParse) { clearInterval(waitParse); window.__triggerParse(); }
}, 100);
setTimeout(() => clearInterval(waitParse), 5000);
} catch (err) {
toast('上传失败: ' + err.message, 'error');
btn.disabled = false;
btn.innerHTML = '开始 AI 解析';
}
}