let S;const $=s=>document.querySelector(s);async function api(u,o){return fetch(u,{headers:{'content-type':'application/json'},...o}).then(r=>r.json())}function render(){let a=S.bms.flatMap(b=>b.accounts).find(x=>x.id===S.selected);$('#account').innerHTML=`● Facebook 已连接 ${S.user.name} / 当前广告账户:${a?.name||'未选择'} 已连接账号:${S.users.length}`;let box=$('#campaigns');box.innerHTML=`
`+S.campaigns.map(c=>` ${c.name}${c.status==='ACTIVE'?'投放中':'已暂停'} 预算 ¥${c.budget}/天
消耗¥${c.spend.toLocaleString()}
ROAS${c.roas}
`).join('');$('#all').onchange=e=>document.querySelectorAll('.pick').forEach(x=>x.checked=e.target.checked);$('#bulkRun').onclick=bulk;$('#rules').innerHTML=S.rules.map(r=>`${r.name}● 已启用
当 ${r.metric} ${r.operator} ${r.threshold} → ${r.action}
`).join('');$('#logs').innerHTML=(S.logs.length?S.logs:[{time:new Date().toISOString(),message:'暂无执行记录'}]).slice(0,8).map(l=>`${l.message}
`).join('')}async function load(){S=await api('/api/state');render()}async function toggle(id){S=await api('/api/campaigns/'+id+'/action',{method:'POST',body:JSON.stringify({action:'toggle'})});render()}async function bulk(){let ids=[...document.querySelectorAll('.pick:checked')].map(x=>x.value);if(!ids.length)return alert('请先选择广告系列');let action=$('#bulkAction').value;let delta=action==='budget'?Number(prompt('每个广告系列增加预算金额','200')):0;S=await api('/api/batch-actions',{method:'POST',body:JSON.stringify({campaignIds:ids,action,delta})});render()}$('#connect').onclick=()=>$('#modal').classList.remove('hidden');$('#close').onclick=()=>$('#modal').classList.add('hidden');$('#oauth').onclick=async()=>{S=await api('/api/connect',{method:'POST'});$('#modal').classList.add('hidden');render()};$('#addRule').onclick=async()=>{let name=prompt('规则名称','高 CPA 自动暂停');if(name){S=await api('/api/rules',{method:'POST',body:JSON.stringify({name,metric:'CPA',operator:'>',threshold:80,action:'暂停广告',enabled:true})});render()}};load();
$('#oauth').onclick=()=>{window.location.href='/auth/facebook'};