// Navegação entre perfis: setas anterior/próximo na ordem da lista de Prospects + busca com autocomplete por qualquer coluna.
const PPN_FIELDS=[['Empresa','name'],['CNPJ','cnpj'],['Cidade','city'],['UF','uf'],['Setor','sector'],['CNAE','cnae'],['Porte','size'],['Responsável','owner'],['Origem','origin'],['Próxima ação','next']];
const ppnNorm=v=>String(v==null?'':v).normalize('NFD').replace(/[̀-ͯ]/g,'').toLowerCase();
function ProspectNavBar({p,go,onCandidate}){
 const{IconButton}=window.VRticeDesignSystem_d763eb;const all=useProspects();const C=window.VXCommercial;
 const[q,setQ]=React.useState(''),[open,setOpen]=React.useState(false),[ai,setAi]=React.useState(0);
 const ids=all.map(x=>x.id),pref=(window.VX_PROSPECT_ORDER||[]).filter(id=>ids.includes(id)),order=pref.includes(p.id)?pref:[...all].sort((a,b)=>(b.total||0)-(a.total||0)).map(x=>x.id);
 const idx=order.indexOf(p.id),prev=idx>0?order[idx-1]:null,next=idx>=0&&idx<order.length-1?order[idx+1]:null;
 const have=new Set(all.map(x=>String(x.cnpj||'').replace(/\D/g,'')));const cands=(window.VX_PX_CAND||[]).filter(c=>!have.has(String(c.cnpj||'').replace(/\D/g,'')));
 const terms=ppnNorm(q).split(/\s+/).filter(Boolean);
 const hit=r=>{const hay=ppnNorm(PPN_FIELDS.map(f=>r[f[1]]).join(' ')+' '+((C.STG[r.stage]||{}).label||'')+' '+r.contracts);return terms.every(t=>hay.includes(t))};
 const why=r=>{const f=PPN_FIELDS.slice(1).find(f=>terms.some(t=>ppnNorm(r[f[1]]).includes(t)));return f?f[0]+' '+r[f[1]]:''};
 const groups=terms.length?[{t:'PROSPECTS ATIVOS',it:all.filter(x=>x.id!==p.id&&hit(x)).slice(0,6)},{t:'CANDIDATAS (AINDA SEM PERFIL)',it:cands.filter(hit).slice(0,4)}].filter(g=>g.it.length):[];
 const flat=groups.flatMap(g=>g.it);
 const pick=r=>{setOpen(false);setQ('');if(r.candidate)onCandidate(r);else go('prospect',{id:r.id})};
 const key=e=>{if(e.key==='ArrowDown'){e.preventDefault();setAi(i=>Math.min(flat.length-1,i+1))}else if(e.key==='ArrowUp'){e.preventDefault();setAi(i=>Math.max(0,i-1))}else if(e.key==='Enter'&&flat[ai]){e.preventDefault();pick(flat[ai])}else if(e.key==='Escape'){setOpen(false)}};
 let n=-1;
 return <div style={{display:'flex',alignItems:'center',gap:8,flexWrap:'wrap'}}>
  <IconButton icon="ph-caret-left" aria-label="Prospect anterior" disabled={!prev} onClick={()=>prev&&go('prospect',{id:prev})}/>
  <span style={{...cxMono,fontSize:12,color:'var(--text-muted)',minWidth:48,textAlign:'center'}}>{idx>=0?(idx+1)+' / '+order.length:'—'}</span>
  <IconButton icon="ph-caret-right" aria-label="Próximo prospect" disabled={!next} onClick={()=>next&&go('prospect',{id:next})}/>
  <div style={{position:'relative',width:280}} onKeyDown={key}>
   <div style={{display:'flex',alignItems:'center',gap:8,height:40,padding:'0 12px',borderRadius:12,border:'1px solid var(--border-field)',background:'var(--surface-field, transparent)'}}><i className="ph ph-magnifying-glass" style={{fontSize:16,color:'var(--text-muted)'}}/><input value={q} onChange={e=>{setQ(e.target.value);setOpen(true);setAi(0)}} onFocus={()=>setOpen(true)} onBlur={()=>setTimeout(()=>setOpen(false),150)} aria-label="Buscar outro prospect" placeholder="Buscar prospect, CNPJ, cidade, CNAE…" style={{all:'unset',flex:1,minWidth:0,fontSize:13,color:'var(--text-primary)',fontFamily:'inherit'}}/></div>
   {open&&terms.length>0&&<div role="listbox" style={{position:'absolute',top:46,right:0,width:360,maxWidth:'80vw',maxHeight:360,overflowY:'auto',zIndex:50,padding:6,background:'var(--surface-dialog)',border:'1px solid var(--border-field)',borderRadius:14,boxShadow:'var(--shadow-modal)'}}>
    {!flat.length&&<span style={{display:'block',padding:'14px 12px',fontSize:13,color:'var(--text-muted)'}}>Nenhum prospect encontrado para “{q}”.</span>}
    {groups.map(g=><div key={g.t}><span style={{...vxEyebrow,display:'block',padding:'8px 10px 4px'}}>{g.t}</span>{g.it.map(r=>{n++;const k=n;return <button key={r.id} type="button" role="option" aria-selected={k===ai} onMouseDown={e=>e.preventDefault()} onMouseEnter={()=>setAi(k)} onClick={()=>pick(r)} style={{all:'unset',boxSizing:'border-box',width:'100%',cursor:'pointer',display:'flex',flexDirection:'column',gap:2,padding:'8px 10px',borderRadius:10,background:k===ai?'var(--action-selected-bg, var(--overlay-05))':'transparent'}}><span style={{fontSize:14,fontWeight:600,color:'var(--text-primary)'}}>{r.name}</span><span style={{fontSize:12,color:'var(--text-muted)'}}>{[(r.city&&r.city!=='—'?r.city+' - ':'')+r.uf,why(r)].filter(Boolean).join(' · ')}</span></button>})}</div>)}
   </div>}
  </div>
 </div>}
const prvBrl=n=>Number(n||0).toLocaleString('pt-BR',{style:'currency',currency:'BRL',maximumFractionDigits:0});
const prvMonth=k=>{const[y,m]=k.split('-');return['jan','fev','mar','abr','mai','jun','jul','ago','set','out','nov','dez'][Number(m)-1]+'/'+y.slice(2)};
// Valores públicos dos últimos 12 meses (contratos e resultados do PNCP/Compras.gov). Não é o faturamento total da empresa.
function ProspectProcurementsPanel({p}){const{Badge}=window.VRticeDesignSystem_d763eb;const[r,setR]=React.useState(null);const[all,setAll]=React.useState(false);
 React.useEffect(()=>{let live=true;setR(null);if(!p.empresaId){setR([]);return}window.VxSalesIntelligence.servedProcurements(p.empresaId).then(x=>live&&setR(x)).catch(()=>live&&setR(false));return()=>{live=false}},[p.empresaId]);
 const list=Array.isArray(r)?r:[];const shown=all?list:list.slice(0,10);const dt=v=>v?new Date(String(v).slice(0,10)+'T00:00:00').toLocaleDateString('pt-BR'):'—';
 const ext=(href,label)=>href?<a href={href} target="_blank" rel="noopener noreferrer" style={{color:'var(--text-accent)',textDecoration:'none',whiteSpace:'nowrap'}}>{label} <i className="ph ph-arrow-square-out" style={{fontSize:12}}/></a>:null;
 return <CcPanel title="Licitações atendidas" sub="Resultados públicos do PNCP / Compras.gov em que esta empresa é a fornecedora. Os links abrem o portal oficial do PNCP." gap={14}>
  {r===null&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Carregando…</span>}
  {r===false&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Não foi possível carregar as licitações.</span>}
  {Array.isArray(r)&&!list.length&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Nenhuma licitação com resultado registrada para esta empresa.</span>}
  {list.length>0&&<><span style={{fontSize:12,color:'var(--text-muted)'}}>{list.length} licitação(ões) · homologado total {prvBrl(list.reduce((t,x)=>t+x.homologado,0))}</span>
  {shown.map(x=><div key={x.id} style={{borderTop:'1px solid var(--border-subtle)',paddingTop:12,display:'flex',flexDirection:'column',gap:6}}>
   <div style={{display:'flex',gap:10,flexWrap:'wrap',alignItems:'baseline',justifyContent:'space-between'}}><strong style={{fontWeight:600,overflowWrap:'anywhere',flex:'1 1 320px'}}>{x.objeto||'Objeto não informado'}</strong><span style={{...cxMono,fontSize:14}}>{x.homologado?prvBrl(x.homologado):'—'}</span></div>
   <span style={{fontSize:12,color:'var(--text-muted)'}}>{[x.orgao||x.orgaoCnpj,x.uf,x.processo&&('processo '+x.processo),x.itens>1&&(x.itens+' itens')].filter(Boolean).join(' · ')}</span>
   <div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(150px,1fr))',gap:'6px 16px',fontSize:12}}>
    {[['Valor estimado da licitação (todos os itens e fornecedores)',x.estimado!=null?prvBrl(x.estimado):'não informado'],['Estimado dos itens ganhos por esta empresa',x.itensComEstimado>0?prvBrl(x.estimadoItens)+(x.itensComEstimado<x.itens?' (só '+x.itensComEstimado+' de '+x.itens+' itens)':''):'não coletado'],['Homologado para esta empresa ('+x.itens+(x.itens===1?' item':' itens')+')',x.homologado?prvBrl(x.homologado):'—'],['Valor contratado',x.contratos.length?prvBrl(x.contratos.reduce((t,k)=>t+Number(k.valor_global||0),0)):'contrato não localizado'],['Edital publicado em',dt(x.publicadoEm)],['Resultado em',dt(x.resultadoEm)]].map(f=><div key={f[0]}><span style={{display:'block',color:'var(--text-muted)'}}>{f[0]}</span><span style={cxMono}>{f[1]}</span></div>)}
   </div>
   <div style={{display:'flex',gap:14,flexWrap:'wrap',fontSize:13,alignItems:'center'}}><span style={{...cxMono,fontSize:12,color:'var(--text-muted)'}}>{x.id}</span>{ext(x.link,'Abrir licitação no PNCP')}{x.cancelados>0&&<Badge tone="warning">{x.cancelados} item(ns) cancelado(s)</Badge>}{x.contratos.length===0&&<Badge tone="neutral">Contrato não localizado</Badge>}</div>
   {x.contratos.map(k=><div key={k.numero_controle_pncp_contrato} style={{fontSize:12,color:'var(--text-secondary)',display:'flex',flexDirection:'column',gap:2,paddingLeft:10,borderLeft:'2px solid var(--border-subtle)'}}><div style={{display:'flex',gap:10,flexWrap:'wrap'}}><strong>Contrato {k.numero_contrato||k.numero_controle_pncp_contrato}</strong><span>{prvBrl(k.valor_global)}</span><span>vigência {dt(k.data_inicio)} a {dt(k.data_fim)}</span>{[k.tipo,k.categoria].filter(Boolean).length>0&&<span>{[k.tipo,k.categoria].filter(Boolean).join(' · ')}</span>}{ext(k.link,'Abrir contrato no PNCP')}</div>{k.objeto&&k.objeto!==x.objeto&&<span style={{color:'var(--text-muted)',overflowWrap:'anywhere'}}>Objeto do contrato: {k.objeto}</span>}</div>)}
  </div>)}
  {list.length>10&&<button type="button" onClick={()=>setAll(v=>!v)} style={{all:'unset',cursor:'pointer',fontSize:13,color:'var(--text-accent)'}}>{all?'Mostrar menos':'Mostrar todas ('+list.length+')'}</button>}</>}
 </CcPanel>}
function ProspectFaturamentoPanel({p}){const{Button}=window.VRticeDesignSystem_d763eb;const{go}=useShell();const V=window.VxSalesIntelligence;const[r,setR]=React.useState(null);
 React.useEffect(()=>{let live=true;setR(null);V.revenueByAccount([p.id]).then(x=>live&&setR(x[p.id]||false)).catch(()=>live&&setR(false));return()=>{live=false}},[p.id]);
 const src=k=>(V.REV_SOURCES.find(s=>s[0]===k)||[k,k])[1];const rows=r?r.months.map((m,i)=>({m,v:r.perMonth[i]})):[];const max=Math.max(1,...rows.map(x=>x.v?x.v.amount:0));
 const edit=<Button size="sm" variant="secondary" icon="ph-pencil-simple" onClick={()=>go('crm',{id:p.id})}>Informar no CRM</Button>;
 return <CcPanel title="Faturamento mensal · últimos 12 meses" sub="Valores informados por fonte (nota fiscal, balanço, base de crédito ou manual). Mês vazio = sem informação; nada é estimado." gap={14} action={edit}>
  {r===null&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Carregando…</span>}
  {r===false&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Não foi possível carregar o faturamento informado.</span>}
  {r&&(r.filledCount?<>
   <div style={{display:'flex',gap:24,flexWrap:'wrap'}}><div><span style={vxEyebrow}>TOTAL INFORMADO</span><strong style={{display:'block',fontSize:20,marginTop:4,...cxMono}}>{prvBrl(r.total)}</strong><span style={{fontSize:12,color:'var(--text-muted)'}}>{r.filledCount} de 12 meses com informação</span></div><div><span style={vxEyebrow}>MÉDIA DOS MESES INFORMADOS</span><strong style={{display:'block',fontSize:20,marginTop:4,...cxMono}}>{prvBrl(r.avg)}</strong></div></div>
   <div role="img" aria-label="Faturamento informado por mês" style={{display:'flex',alignItems:'flex-end',gap:6,height:90,paddingTop:8}}>{rows.map(x=><div key={x.m} title={prvMonth(x.m)+' · '+(x.v?prvBrl(x.v.amount)+' ('+src(x.v.source)+')':'sem informação')} style={{flex:1,display:'flex',alignItems:'flex-end',height:'100%'}}><span style={{flex:1,height:x.v?Math.max(3,Math.round(100*x.v.amount/max))+'%':'0%',background:'var(--text-accent)',borderRadius:'3px 3px 0 0'}}/></div>)}</div>
   <div style={{display:'flex',gap:6}}>{rows.map(x=><span key={x.m} style={{flex:1,fontSize:10,color:'var(--text-muted)',textAlign:'center'}}>{prvMonth(x.m).slice(0,3)}</span>)}</div>
   <div style={{overflowX:'auto'}}><table style={{width:'100%',borderCollapse:'collapse',fontSize:12}}><thead><tr style={{color:'var(--text-muted)',textAlign:'left'}}><th style={{padding:'4px 8px 4px 0'}}>Mês</th><th style={{padding:'4px 8px'}}>Faturamento</th><th style={{padding:'4px 8px'}}>Fonte</th></tr></thead><tbody>{rows.map(x=><tr key={x.m} style={{borderTop:'1px solid var(--border-subtle)'}}><td style={{padding:'4px 8px 4px 0'}}>{prvMonth(x.m)}</td><td style={{padding:'4px 8px',...cxMono}}>{x.v?prvBrl(x.v.amount):'—'}</td><td style={{padding:'4px 8px',color:'var(--text-muted)'}}>{x.v?src(x.v.source)+(x.v.alternatives.length?' (+'+x.v.alternatives.length+' outra(s) fonte(s) não somada(s))':''):'—'}</td></tr>)}</tbody></table></div>
  </>:<span style={{fontSize:13,color:'var(--text-muted)'}}>Nenhum faturamento informado nos últimos 12 meses. Use “Informar no CRM” quando houver nota fiscal, balanço ou dado de outra base.</span>)}
 </CcPanel>}
function ProspectRevenuePanel({p}){const{Badge}=window.VRticeDesignSystem_d763eb;const[r,setR]=React.useState(null);
 React.useEffect(()=>{let live=true;setR(null);if(!p.empresaId){setR(false);return}window.VxSalesIntelligence.publicRevenue12m([p.empresaId]).then(x=>live&&setR(x[p.empresaId]||false)).catch(()=>live&&setR(false));return()=>{live=false}},[p.empresaId]);
 const rows=r?r.months.map((m,i)=>({m,c:r.contracts[i],a:r.awarded[i]})):[];const max=Math.max(1,...rows.flatMap(x=>[x.c,x.a]));const sum=k=>rows.reduce((t,x)=>t+x[k],0);
 const tc=sum('c'),ta=sum('a');
 return <CcPanel title="Valores públicos · últimos 12 meses" sub="Contratos e resultados do PNCP / Compras.gov. Não é o faturamento total da empresa." gap={14}>
  {r===null&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Carregando…</span>}
  {r===false&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Sem dados públicos para esta empresa.</span>}
  {r&&<>
   <div style={{display:'flex',gap:24,flexWrap:'wrap'}}>
    <div><span style={vxEyebrow}>CONTRATADO (12 M)</span><strong style={{display:'block',fontSize:20,marginTop:4,...cxMono}}>{prvBrl(tc)}</strong><span style={{fontSize:12,color:'var(--text-muted)'}}>média {prvBrl(tc/12)}/mês · {r.contractCount} contrato(s)</span></div>
    <div><span style={vxEyebrow}>HOMOLOGADO (12 M)</span><strong style={{display:'block',fontSize:20,marginTop:4,...cxMono}}>{prvBrl(ta)}</strong><span style={{fontSize:12,color:'var(--text-muted)'}}>média {prvBrl(ta/12)}/mês · {r.awardedCount} resultado(s)</span></div>
   </div>
   <div role="img" aria-label="Valores públicos por mês" style={{display:'flex',alignItems:'flex-end',gap:6,height:110,paddingTop:8}}>
    {rows.map(x=><div key={x.m} title={prvMonth(x.m)+' · contratado '+prvBrl(x.c)+' · homologado '+prvBrl(x.a)} style={{flex:1,display:'flex',alignItems:'flex-end',gap:2,height:'100%'}}>
     <span style={{flex:1,height:Math.max(x.c?3:0,Math.round(100*x.c/max))+'%',background:'var(--text-accent)',borderRadius:'3px 3px 0 0'}}/>
     <span style={{flex:1,height:Math.max(x.a?3:0,Math.round(100*x.a/max))+'%',background:'var(--border-field)',borderRadius:'3px 3px 0 0'}}/></div>)}
   </div>
   <div style={{display:'flex',gap:6}}>{rows.map(x=><span key={x.m} style={{flex:1,fontSize:10,color:'var(--text-muted)',textAlign:'center'}}>{prvMonth(x.m).slice(0,3)}</span>)}</div>
   <div style={{display:'flex',gap:16,fontSize:12,color:'var(--text-muted)',flexWrap:'wrap'}}><span><i style={{display:'inline-block',width:10,height:10,background:'var(--text-accent)',borderRadius:2,marginRight:6}}/>Contratado (mês de início do contrato)</span><span><i style={{display:'inline-block',width:10,height:10,background:'var(--border-field)',borderRadius:2,marginRight:6}}/>Homologado (mês do resultado)</span></div>
   {!tc&&!ta&&<span style={{fontSize:13,color:'var(--text-muted)'}}>Nenhum contrato ou resultado com valor nos últimos 12 meses.</span>}
   <div style={{overflowX:'auto'}}><table style={{width:'100%',borderCollapse:'collapse',fontSize:12}}><thead><tr style={{color:'var(--text-muted)',textAlign:'left'}}><th style={{padding:'4px 8px 4px 0'}}>Mês</th><th style={{padding:'4px 8px'}}>Contratado</th><th style={{padding:'4px 8px'}}>Homologado</th></tr></thead><tbody>{rows.map(x=><tr key={x.m} style={{borderTop:'1px solid var(--border-subtle)'}}><td style={{padding:'4px 8px 4px 0'}}>{prvMonth(x.m)}</td><td style={{padding:'4px 8px',...cxMono}}>{x.c?prvBrl(x.c):'—'}</td><td style={{padding:'4px 8px',...cxMono}}>{x.a?prvBrl(x.a):'—'}</td></tr>)}</tbody></table></div>
  </>}
 </CcPanel>}
const pdFmtPhone=v=>{const d=String(v||'').replace(/\D/g,'');return d.length===11?'('+d.slice(0,2)+') '+d.slice(2,7)+'-'+d.slice(7):d.length===10?'('+d.slice(0,2)+') '+d.slice(2,6)+'-'+d.slice(6):d};
const pdCep=v=>{const d=String(v||'').replace(/\D/g,'');return d.length===8?d.slice(0,5)+'-'+d.slice(5):d};
// Endereço do cadastro público de CNPJ (Receita, via BrasilAPI). Só junta o que a fonte informou; nada é completado.
const pdFmtAddress=p=>{const a=p.addr||{};if(!a.street&&!a.cep)return'';const l1=[a.street,a.number&&('nº '+a.number),a.complement].filter(Boolean).join(', ');const l2=[a.district,(p.city&&p.city!=='—'?p.city:'')&&((p.city)+(p.uf?'/'+p.uf:'')),a.cep&&('CEP '+pdCep(a.cep))].filter(Boolean).join(' · ');return[l1,l2].filter(Boolean).join(' — ')};
const pdContactNote=p=>p.contactCheckedAt?'Fonte: cadastro de CNPJ da Receita Federal · consultado em '+new Date(p.contactCheckedAt).toLocaleDateString('pt-BR'):'Contato público ainda não consultado';
function ProspectContactBar({p}){const{Tag}=window.VRticeDesignSystem_d763eb;const{go}=useShell();const m=(p.profile&&p.profile.manual_contact)||{};
 const items=[p.phone&&{k:'p',icon:'ph-phone',label:pdFmtPhone(p.phone),href:'tel:+55'+p.phone},p.phone2&&{k:'p2',icon:'ph-phone',label:pdFmtPhone(p.phone2),href:'tel:+55'+p.phone2},p.email&&{k:'e',icon:'ph-envelope-simple',label:p.email,href:'mailto:'+p.email}].filter(Boolean);
 const man=[m.phone&&{k:'mp',icon:'ph-phone',label:pdFmtPhone(m.phone),href:'tel:+55'+m.phone},m.phone2&&{k:'mp2',icon:'ph-phone',label:pdFmtPhone(m.phone2),href:'tel:+55'+m.phone2},m.email&&{k:'me',icon:'ph-envelope-simple',label:m.email,href:'mailto:'+m.email}].filter(Boolean);
 const edit=<button type="button" aria-label="Editar contato no CRM" title="Editar no CRM" onClick={()=>go('crm',{id:p.id,field:'contact'})} style={{all:'unset',cursor:'pointer',display:'inline-flex',alignItems:'center',justifyContent:'center',width:28,height:28,borderRadius:8,color:'var(--text-muted)',border:'1px solid var(--border-subtle)'}}><i className="ph ph-pencil-simple" style={{fontSize:14}}/></button>;
 const link=i=><a key={i.k} href={i.href} style={{display:'inline-flex',gap:8,alignItems:'center',fontSize:15,color:'var(--text-accent)',textDecoration:'none'}}><i className={'ph '+i.icon}/>{i.label}</a>;
 return <div style={{display:'flex',gap:12,flexWrap:'wrap',alignItems:'center',marginBottom:16}}>{items.map(link)}{!items.length&&!man.length&&<span style={{fontSize:13,color:'var(--text-muted)'}}>{p.contactCheckedAt?'Telefone e e-mail não informados no cadastro público da Receita.':'Contato público ainda não consultado.'}</span>}{items.length>0&&<span style={{fontSize:12,color:'var(--text-muted)'}}>{pdContactNote(p)}</span>}{man.map(link)}{man.length>0&&<span style={{fontSize:12,color:'var(--text-muted)'}}>Informado manualmente{m.updated_at?' · '+new Date(m.updated_at).toLocaleDateString('pt-BR'):''}</span>}{edit}{(()=>{const pub=pdFmtAddress(p),ma=m.address;return pub||ma?<div style={{flexBasis:'100%',display:'flex',gap:8,alignItems:'center',flexWrap:'wrap',fontSize:14,color:'var(--text-primary)'}}><i className="ph ph-map-pin" style={{color:'var(--text-muted)'}}/>{pub&&<span>{pub}</span>}{pub&&<span style={{fontSize:12,color:'var(--text-muted)'}}>Fonte: Receita Federal{p.addr&&p.addr.checkedAt?' · consultado em '+new Date(p.addr.checkedAt).toLocaleDateString('pt-BR'):''}</span>}{ma&&<span>{ma}</span>}{ma&&<span style={{fontSize:12,color:'var(--text-muted)'}}>Informado manualmente</span>}</div>:<span style={{flexBasis:'100%',fontSize:13,color:'var(--text-muted)'}}>Endereço ainda não consultado na Receita Federal.</span>})()}</div>}
function ProspectProfileScreen({params}){const{Card,EmptyState,Button,PageHeader,Badge,Tag,DataField,Select,Avatar}=window.VRticeDesignSystem_d763eb;const{go,toast,bp}=useShell();const p=useProspects().find(x=>x.id===(params&&params.id));const[d,setD]=React.useState(null);const[tab,setTab]=React.useState('decision');const[candPick,setCandPick]=React.useState(null);React.useEffect(()=>{if(p)window.VxSalesIntelligence.accountDetails(p.id).then(setD)},[p?.id]);if(!p)return <Card variant="panel" padding={24}><EmptyState variant="block" icon="ph-magnifying-glass" title="Prospect não encontrado" action={<Button onClick={()=>go('prospects')}>Voltar</Button>}/></Card>;const details=d||{contacts:[],activities:[],tasks:[]};const reloadDetails=()=>window.VxSalesIntelligence.accountDetails(p.id).then(setD);const register=async(type,subject)=>{try{await window.VxSalesIntelligence.activity(p.id,type,subject);toast('Atividade registrada')}catch(e){toast(e.message||'Falha ao registrar','ph-warning')}};return <BlockGrid.Auto id="prospect-profile"><PageHeader size="lg" eyebrow="COMERCIAL · PROSPECT" title={p.name} description={(p.city||'—')+' - '+(p.uf||'—')+' · '+(p.sector||'—')+' · '+(p.cnpj||'—')} actions={<><ProspectNavBar p={p} go={go} onCandidate={setCandPick}/><PBtn perm="commercial_intelligence.edit" icon="ph-phone-call" onClick={()=>register('CALL','Contato comercial')}>Registrar contato</PBtn><PBtn perm="commercial_intelligence.create" variant="secondary" icon="ph-calendar-check" onClick={()=>window.VxSalesIntelligence.task(p.id,p.next||'Próxima ação').then(()=>toast('Tarefa criada'),err=>toast(err.message||'Falha ao criar a tarefa','ph-warning'))}>Criar tarefa</PBtn></>}/><div style={{display:'flex',gap:8,flexWrap:'wrap',marginBottom:20}}><StageBadge stage={p.stage}/><Badge variant="meta" tone={p.temp==='Quente'?'danger':p.temp==='Morno'?'warning':'info'}>{p.temp}</Badge><Tag>{p.origin}</Tag></div><ProspectContactBar p={p}/><ProspectDecisionStrip p={p}/><div style={{display:'flex',gap:20,flexWrap:'wrap',alignItems:'flex-start',marginTop:20}}><div style={{flex:'999 1 520px',minWidth:0,display:'flex',flexDirection:'column',gap:20}}><Card variant="card" padding={bp==='mobile'?20:28} gap={20}><div style={{display:'flex',gap:12,flexWrap:'wrap'}}>{['decision','overview','intel','commercial','timeline'].map(x=><Button key={x} size="sm" variant={tab===x?'tonal':'ghost'} onClick={()=>setTab(x)}>{({decision:'Decisão',overview:'Visão geral',intel:'Inteligência',commercial:'Comercial',timeline:'Timeline'})[x]}</Button>)}</div>{tab==='decision'&&<ProspectDecisionTab p={p} details={details}/>}{tab==='overview'&&<><div style={cxGrid(200,20)}><DataField label="Razão social">{p.name}</DataField><DataField label="CNPJ" mono>{p.cnpj||'—'}</DataField><DataField label="CNAE" mono>{p.cnae||'—'}</DataField><DataField label="Porte">{p.size||'—'}</DataField><DataField label="Telefone" mono>{p.phone?pdFmtPhone(p.phone):'—'}</DataField><DataField label="E-mail">{p.email||'—'}</DataField><DataField label="Endereço (Receita Federal)">{pdFmtAddress(p)||'—'}</DataField><DataField label="Contratos 12 meses" mono>{p.contracts}</DataField><DataField label="Valor público" mono>{cxBrl(p.value)}</DataField><DataField label="Confiança dos dados" mono>{p.confidence}%</DataField><DataField label="Vitórias confirmadas" mono>{p.public_wins_count||0}</DataField><DataField label="Próxima ação">{p.next}</DataField></div><div><span style={vxEyebrow}>ESTÁGIO</span><div style={{display:'flex',gap:8,flexWrap:'wrap',marginTop:10}}>{window.VXCommercial.STAGES.map(s=><PBtn perm="commercial_intelligence.edit" key={s[0]} size="sm" variant={s[0]===p.stage?'tonal':'ghost'} onClick={()=>window.VxSalesIntelligence.stage(p.id,s[0]).then(()=>toast('Estágio: '+s[1]),err=>toast(err.message||'Falha ao alterar o estágio','ph-warning'))}>{s[1]}</PBtn>)}</div></div></>}{tab==='intel'&&<><CcPanel title="Sinais públicos" gap={14}><div style={cxGrid(180)}><DataField label="Score ICP" mono>{p.icp}</DataField><DataField label="Score Opportunity" mono>{p.opp}</DataField><DataField label="Contratos 12m" mono>{p.contracts}</DataField><DataField label="Valor público 12m" mono>{cxBrl(p.value)}</DataField><DataField label="Vitórias" mono>{p.public_wins_count||0}</DataField></div><pre style={{margin:0,whiteSpace:'pre-wrap',fontSize:11,color:'var(--text-muted)',fontFamily:'var(--font-mono)'}}>{JSON.stringify(p.breakdown||{},null,2)}</pre></CcPanel></>}{tab==='commercial'&&<><ProspectContactsPanel p={p} details={details} onChanged={reloadDetails}/><CcPanel title="Tarefas" sub={details.tasks.length+' registradas'}>{details.tasks.length?details.tasks.map(t=><div key={t.id} style={{padding:'10px 0',borderTop:'1px solid var(--border-subtle)'}}><strong>{t.title}</strong><span style={{display:'block',fontSize:12,color:'var(--text-muted)'}}>{t.due_at?new Date(t.due_at).toLocaleString('pt-BR'):'sem prazo'} · {t.status}</span></div>):<EmptyState>Nenhuma tarefa registrada.</EmptyState>}</CcPanel></>}{tab==='timeline'&&<CcPanel title="Timeline" sub="Atividades persistidas">{details.activities.length?details.activities.map(a=><div key={a.id} style={{display:'flex',gap:12,padding:'12px 0',borderTop:'1px solid var(--border-subtle)'}}><i className="ph ph-circle" style={{fontSize:10,color:'var(--text-accent)',marginTop:5}}/><span><strong>{a.subject||a.type}</strong><span style={{display:'block',fontSize:12,color:'var(--text-muted)'}}>{new Date(a.occurred_at).toLocaleString('pt-BR')} · {a.type}</span></span></div>):<EmptyState>Nenhuma atividade registrada ainda.</EmptyState>}</CcPanel>}</Card><ProspectProcurementsPanel p={p}/><ProspectFaturamentoPanel p={p}/><ProspectRevenuePanel p={p}/><ProspectChangeLog changes={details.changes} loading={!d} bp={bp}/></div><div style={{flex:'1 1 300px',maxWidth:bp==='desktop'?360:'none',display:'flex',flexDirection:'column',gap:20}}><CcPanel title="Decision Engine" gap={16} action={<ScoreChip v={p.total} size="lg"/>}><ScoreRow label="ICP Fit" v={p.icp} why="Recorrência, resultados, contratos, valor, segmento, complexidade, geografia e compradores."/><ScoreRow label="Opportunity" v={p.opp} why="Atividade pública recente, intensidade, recência, diversidade e sinais de renovação."/><ScoreRow label="Pain Propensity" v={p.pain} why="Proxy observável de complexidade operacional; não substitui descoberta."/><ScoreRow label="Readiness" v={p.readiness} why="Qualidade do contato, decisor, estágio, notas e próxima ação."/><ScoreRow label="Engagement" v={p.eng} why="Respostas, reuniões, atividade recente e qualidade do contato."/><ScoreRow label="Strategic Fit" v={p.strategic} why="Prioridade estratégica definida pelo Vértice."/></CcPanel><CcPanel title="Responsável"><Select options={p.owner?['Sem responsável',p.owner]:['Sem responsável']} value={p.owner||'Sem responsável'} onChange={e=>window.VxSalesIntelligence.assign(p.id,e.target.value==='Sem responsável'?null:e.target.value).then(()=>toast('Responsável atualizado'))}/></CcPanel></div></div>{candPick&&<CandidateDrawer c={candPick} onClose={()=>setCandPick(null)} onCreated={q=>{setCandPick(null);if(q&&q.id)go('prospect',{id:q.id})}}/>}</BlockGrid.Auto>}
const PCT_ROLES=['Sócio / proprietário','Diretor','Presidente / CEO','Gerente','Compras / suprimentos','Administrativo','Outro'];
const PCT_STATUS={VERIFIED:['Verificado','success'],UNVERIFIED:['Não verificado','neutral'],INVALID:['Inválido','danger'],OPT_OUT:['Não contatar','warning']};
// Contatos e decisores: lista + entrada manual. Salvar recalcula o score (Prontidão/Engajamento) pelo motor do banco.
function ProspectContactsPanel({p,details,onChanged}){const{Input,Select,Button,Badge,Tag,Avatar,EmptyState}=window.VRticeDesignSystem_d763eb;const{toast}=useShell();
 const[open,setOpen]=React.useState(false),[busy,setBusy]=React.useState(false),[f,setF]=React.useState({name:'',role:PCT_ROLES[0],other:'',phone:'',email:'',status:'UNVERIFIED'});
 const set=k=>e=>setF(o=>({...o,[k]:e.target.value}));
 const role=f.role==='Outro'?f.other:f.role,decisionRole=/(diretor|owner|socio|sócio|ceo|presidente|gerente|propriet|administr|compras|suprimentos)/i.test(role);
 const save=async()=>{setBusy(true);try{await window.VxSalesIntelligence.addContact(p.id,{name:f.name,role_title:role,phone:f.phone,email:f.email,status:f.status});toast('Contato salvo · score atualizado','ph-check');setF({name:'',role:PCT_ROLES[0],other:'',phone:'',email:'',status:'UNVERIFIED'});setOpen(false);onChanged&&onChanged()}catch(e){toast(e.message||'Falha ao salvar contato','ph-warning')}finally{setBusy(false)}};
 const mark=async(c,st)=>{try{await window.VxSalesIntelligence.setContactStatus(p.id,c.id,st);toast('Contato atualizado · score atualizado','ph-check');onChanged&&onChanged()}catch(e){toast(e.message||'Falha ao atualizar','ph-warning')}};
 return <CcPanel title="Contatos e decisores" sub={(details.contacts.length)+' registrados · o que você informar aqui atualiza Prontidão e Engajamento'} action={<PBtn perm="commercial_intelligence.create" size="sm" variant="secondary" icon="ph-user-plus" onClick={()=>setOpen(o=>!o)}>{open?'Cancelar':'Adicionar contato'}</PBtn>}>
  {open&&<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(200px,1fr))',gap:12,padding:'4px 0 16px'}}>
   <Input label="Nome" value={f.name} onChange={set('name')} placeholder="Nome do contato"/>
   <Select label="Cargo" options={PCT_ROLES} value={f.role} onChange={set('role')}/>
   {f.role==='Outro'&&<Input label="Cargo (texto)" value={f.other} onChange={set('other')} placeholder="Ex.: Coordenador de TI"/>}
   <Input label="Telefone" value={f.phone} onChange={set('phone')} placeholder="DDD + número"/>
   <Input label="E-mail" value={f.email} onChange={set('email')} placeholder="nome@empresa.com.br"/>
   <Select label="Situação" options={['Não verificado','Verificado']} value={f.status==='VERIFIED'?'Verificado':'Não verificado'} onChange={e=>setF(o=>({...o,status:e.target.value==='Verificado'?'VERIFIED':'UNVERIFIED'}))}/>
   <div style={{gridColumn:'1 / -1',fontSize:12,color:'var(--text-muted)'}}>{decisionRole?'Este cargo conta como decisor no cálculo de Prontidão.':'Este cargo não conta como decisor no cálculo.'} Fonte registrada: informado manualmente. Marque “Verificado” só se você confirmou o contato.</div>
   <div><Button loading={busy} disabled={busy||f.name.trim().length<2} onClick={save}>Salvar contato</Button></div>
  </div>}
  {details.contacts.length?details.contacts.map(c=>{const st=PCT_STATUS[c.status]||PCT_STATUS.UNVERIFIED;return <div key={c.id} style={{display:'flex',gap:12,alignItems:'center',flexWrap:'wrap',padding:'12px 0',borderTop:'1px solid var(--border-subtle)'}}><Avatar name={c.name} size={36}/><span style={{display:'flex',flexDirection:'column',gap:2,flex:'1 1 200px',minWidth:0}}><strong>{c.name}</strong><span style={{fontSize:12,color:'var(--text-muted)'}}>{c.role_title||'—'} · {[c.phone&&pdFmtPhone(c.phone),c.email].filter(Boolean).join(' · ')||'sem contato'}</span></span>{c.source==='MANUAL'&&<Tag>Manual</Tag>}<Badge variant="meta" tone={st[1]}>{st[0]}</Badge>{c.status!=='VERIFIED'&&c.status!=='OPT_OUT'&&<PBtn perm="commercial_intelligence.edit" size="sm" variant="ghost" onClick={()=>mark(c,'VERIFIED')}>Marcar verificado</PBtn>}</div>}):<EmptyState>Nenhum contato registrado. Se descobrir quem decide, adicione acima: o rating é recalculado.</EmptyState>}
 </CcPanel>}
function ProspectChangeLog({changes,loading,bp}){
  const{Card,EmptyState,Button,Tag}=window.VRticeDesignSystem_d763eb;
  const[f,setF]=React.useState('all');const[all,setAll]=React.useState(false);
  const list=(changes||[]).filter(c=>f==='all'||c.source===f);
  const shown=all?list:list.slice(0,10);
  const fmt=iso=>{try{return new Date(iso).toLocaleString('pt-BR',{timeZone:'America/Sao_Paulo',day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'})}catch(e){return '—'}};
  return <Card variant="card" padding={bp==='mobile'?20:28} gap={16}>
    <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',gap:12,flexWrap:'wrap'}}>
      <span style={{display:'flex',flexDirection:'column',gap:2}}><strong style={{fontSize:16}}>Histórico de alterações</strong><span style={{fontSize:12,color:'var(--text-muted)'}}>Atualizações do sistema (dados, scores, enriquecimento) e alterações manuais</span></span>
      <div style={{display:'flex',gap:8}}>{[['all','Todas'],['SYSTEM','Sistema'],['MANUAL','Manuais']].map(([k,l])=><Button key={k} size="sm" variant={f===k?'tonal':'ghost'} onClick={()=>{setF(k);setAll(false)}}>{l}</Button>)}</div>
    </div>
    {loading?<span style={{fontSize:13,color:'var(--text-muted)'}}>Carregando…</span>
    :changes===null?<EmptyState>O histórico de alterações ainda não está disponível neste ambiente.</EmptyState>
    :!shown.length?<EmptyState>Nenhuma alteração registrada{f!=='all'?' nesta categoria':' ainda'}.</EmptyState>
    :<div style={{display:'flex',flexDirection:'column'}}>{shown.map(c=><div key={c.id} style={{display:'flex',gap:12,padding:'12px 0',borderTop:'1px solid var(--border-subtle)',minWidth:0}}>
      <i className={'ph '+(c.source==='MANUAL'?'ph-user':'ph-gear')} style={{fontSize:16,color:c.source==='MANUAL'?'var(--text-accent)':'var(--text-muted)',marginTop:2}}/>
      <span style={{display:'flex',flexDirection:'column',gap:3,minWidth:0,flex:1}}>
        <span style={{fontSize:14,overflowWrap:'anywhere'}}>{c.summary}</span>
        <span style={{fontSize:12,color:'var(--text-muted)'}}>{fmt(c.created_at)} · {c.source==='MANUAL'?(c.actor_name||'Usuário'):'Sistema'}</span>
      </span>
      <Tag>{c.source==='MANUAL'?'Manual':'Sistema'}</Tag>
    </div>)}</div>}
    {!loading&&list.length>10&&<Button size="sm" variant="link" onClick={()=>setAll(!all)}>{all?'Mostrar menos':'Ver todas as '+list.length+' alterações'}</Button>}
  </Card>}
function ScoreRow({label,v,why}){const{ProgressBar}=window.VRticeDesignSystem_d763eb;return <div style={{display:'flex',flexDirection:'column',gap:5}}><div style={{display:'flex',justifyContent:'space-between'}}><span>{label}</span><span style={cxMono}>{v}</span></div><ProgressBar value={v} height={4}/><span style={{fontSize:12,color:'var(--text-subtle)'}}>{why}</span></div>}
// Decisão do prospect (layout aprovado no Claude Design, tela "Perfil do prospect" > aba Decisão).
// Todos os valores vêm da view commercial_account_intelligence (0044) e do score_breakdown; nada é simulado.
const PD_LEVEL = v => v >= 75 ? 'Alta' : v >= 50 ? 'Média' : 'Baixa';
const PD_LEVEL_TONE = { Alta: 'success', Média: 'info', Baixa: 'neutral' };
const PD_PRIO = v => v >= 75 ? 'P1' : v >= 60 ? 'P2' : 'P3';
const PD_PRIO_TONE = { P1: 'danger', P2: 'warning', P3: 'neutral' };
const PD_PRIO_HINT = { P1: 'Abordar nesta semana', P2: 'Abordar em até 15 dias', P3: 'Manter em nutrição' };
const pdTone = v => VX_TONE[v >= 80 ? 'success' : v >= 60 ? 'info' : 'neutral'];
const PD_SHOWN = ['label', 'name', 'profile', 'type', 'description', 'summary'];
const pdProfileEntries = p => Object.entries(p.profile || {}).filter(([k, v]) => !PD_SHOWN.includes(k) && v !== null && v !== '' && typeof v !== 'object');
const pdProfileLabel = p => { const pr = p.profile || {}; return pr.label || pr.name || pr.profile || pr.type || null; };
const pdProfileText = p => { const pr = p.profile || {}; return pr.description || pr.summary || null; };
const pdKey = k => k.replace(/_/g, ' ').replace(/^./, c => c.toUpperCase());

// As seis dimensões e seus pesos reais (breakdown.weights; padrão do perfil ICP v2 quando ausente).
function pdDimensions(p) {
  const bd = p.breakdown || {}, w = bd.weights || {}, rd = bd.readiness || {};
  const wt = (k, d) => Number.isFinite(Number(w[k])) ? Number(w[k]) : d;
  return [
    { key: 'icp', label: 'ICP Fit', v: p.icp, w: wt('icp', 25), tag: 'ICP Fit', icon: 'ph-target', ev: (bd.icp_fit && bd.icp_fit.evidence) ? (bd.icp_fit.evidence.contracts_36m || 0) + ' contratos e ' + (bd.icp_fit.evidence.valid_results_36m || 0) + ' resultados válidos em 36 meses' : null },
    { key: 'opp', label: 'Opportunity', v: p.opp, w: wt('opportunity', 20), tag: 'Opportunity', icon: 'ph-binoculars', ev: bd.opportunity ? (bd.opportunity.recent_procurement_activity || 0) + ' licitações em 90 dias · ' + (bd.opportunity.contracts_12m || 0) + ' contratos em 12 meses' : null },
    { key: 'pain', label: 'Dor', v: p.pain, w: wt('pain', 15), tag: 'Dor', icon: 'ph-first-aid-kit', ev: 'Proxy observável de complexidade operacional; não substitui a descoberta' },
    { key: 'ready', label: 'Prontidão', v: p.readiness, w: wt('readiness', 15), tag: 'Prontidão', icon: 'ph-rocket-launch', ev: bd.readiness ? (rd.verified_contacts || 0) + ' contato(s) verificado(s) · ' + (rd.decision_contacts || 0) + ' decisor(es) mapeado(s)' + (rd.next_action ? ' · próxima ação definida' : ' · sem próxima ação') : null },
    { key: 'eng', label: 'Engagement', v: p.eng, w: wt('engagement', 10), tag: 'Engagement', icon: 'ph-chats-circle', ev: bd.engagement ? (bd.engagement.responses_90d || 0) + ' respostas e ' + (bd.engagement.meetings_90d || 0) + ' reuniões em 90 dias' : (p.last == null ? 'Sem interação registrada' : 'Última interação há ' + p.last + ' d') },
    { key: 'strat', label: 'Valor estratégico', v: p.strategic, w: wt('strategic', 15), tag: 'Valor estratégico', icon: 'ph-diamond', ev: (p.profile && p.profile.strategic_fit != null) ? 'Definido pelo Vértice no perfil comercial (strategic_fit)' : 'Não definido no perfil comercial; usa o padrão 50' },
  ];
}

function ProspectDecisionStrip({ p }) {
  const { Card, Badge, ProgressBar } = window.VRticeDesignSystem_d763eb;
  const prio = PD_PRIO(p.priority), label = pdProfileLabel(p), text = pdProfileText(p);
  const eyebrow = (icon, t) => <span style={{ display: 'flex', gap: 6, alignItems: 'center', minWidth: 0 }}><i className={'ph ' + icon} style={{ fontSize: 15, color: 'var(--text-muted)', flex: 'none' }} /><span style={{ ...vxEyebrow, fontSize: 10, letterSpacing: '0.1em', lineHeight: 1.25 }}>{t}</span></span>;
  const hint = { fontSize: 11, lineHeight: 1.35, color: 'var(--text-subtle)' };
  const score = (icon, title, v, badge, why, suffix = '') => (
    <Card variant="flat" padding={14} gap={8}>
      {eyebrow(icon, title)}
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>
        <span style={{ ...cxMono, fontSize: 'clamp(20px, 1.9vw, 26px)', fontWeight: 600, color: pdTone(v), lineHeight: 1 }}>{v}{suffix}</span>
        {badge}
      </div>
      <ProgressBar value={v} height={4} />
      <span style={hint}>{why}</span>
    </Card>
  );
  const lv = v => <Badge variant="meta" tone={PD_LEVEL_TONE[PD_LEVEL(v)]}>{PD_LEVEL(v)}</Badge>;
  const dims = pdDimensions(p);
  // Uma única linha: as colunas dividem a largura e, se não couberem legíveis (mín. 150px), a linha rola na horizontal.
  return (
    <div style={{ display: 'grid', gridAutoFlow: 'column', gridAutoColumns: 'minmax(150px, 1fr)', gap: 12, overflowX: 'auto', paddingBottom: 4 }}>
      {score('ph-first-aid-kit', 'DOR', p.pain, lv(p.pain), dims[2].ev)}
      {score('ph-rocket-launch', 'PRONTIDÃO', p.readiness, lv(p.readiness), dims[3].ev || 'Sem dados de prontidão')}
      {score('ph-diamond', 'VALOR ESTRATÉGICO', p.strategic, lv(p.strategic), dims[5].ev)}
      {score('ph-flag', 'PRIORIDADE', p.priority, <Badge variant="meta" tone={PD_PRIO_TONE[prio]}>{prio}</Badge>, PD_PRIO_HINT[prio])}
      {score('ph-seal-check', 'CONFIANÇA DOS DADOS', p.confidence, lv(p.confidence), p.confidence >= 75 ? 'Cadastro, contratos e contatos sustentam a leitura' : 'Dados insuficientes para uma decisão forte', '%')}
      <Card variant="flat" padding={14} gap={8}>
        {eyebrow('ph-identification-badge', 'PERFIL COMERCIAL')}
        <strong style={{ fontSize: 15, lineHeight: 1.25 }}>{label || 'Não definido'}</strong>
        <span style={hint}>{text || (label ? 'Perfil registrado pelo Vértice' : 'Defina o perfil comercial para qualificar a abordagem')}</span>
      </Card>
    </div>
  );
}

function ProspectDecisionTab({ p, details }) {
  const { Table, MeterCell, ProgressBar, Alert, Badge, Tag, DataField } = window.VRticeDesignSystem_d763eb;
  const { bp } = useShell();
  const dims = pdDimensions(p), total = dims.reduce((a, d) => a + d.w, 0) || 1;
  const rows = [...dims.map(d => ({ a: d.label, b: d.w + '%', c: d.v, d: '+' + (d.v * d.w / total).toFixed(1) })), { a: 'Prioridade', b: '100%', c: p.priority, d: String(p.priority) }];
  const contactEv = { key: 'contact', icon: 'ph-phone', v: p.phone || p.email ? 100 : 0, tag: 'Contato',
    ev: p.phone || p.email ? [p.phone && pdFmtPhone(p.phone), p.email].filter(Boolean).join(' · ') + ' (' + pdContactNote(p) + ')' : (p.contactCheckedAt ? 'Telefone e e-mail não informados no cadastro público da Receita' : 'Contato público ainda não consultado') };
  const evidence = [...dims.filter(d => d.ev), contactEv];
  const hasContacts = (details.contacts || []).length > 0;
  const sources = [
    ['Cadastro', 25, !!(p.cnpj && p.cnae), 'CNPJ e CNAE da base pública'],
    ['Contratos', 25, p.contracts > 0 || p.value > 0, 'Contratos públicos nos últimos 36 meses'],
    ['Resultados', 20, (p.public_wins_count || 0) > 0, 'Resultados homologados'],
    ['Contatos', 15, hasContacts, hasContacts ? details.contacts.length + ' contato(s) registrado(s)' : 'Nenhum contato registrado'],
  ];
  const entries = pdProfileEntries(p);
  const Pn = ({ title, sub, action, children, pad }) => <CcPanel title={title} sub={sub} action={action} gap={16} pad={pad}>{children}</CcPanel>;
  return <>
    <Pn title="Como a prioridade é calculada" sub="Seis dimensões ponderadas pelo perfil de ranking ativo">
      <div style={{ overflowX: 'auto', margin: bp === 'mobile' ? '0 -20px -8px' : '0 -32px -12px' }}>
        <VxTable id="prospect-dimensoes" cellX={bp === 'mobile' ? 20 : 32} rowY={14} minWidth={520} columns={[
          { key: 'a', label: 'Dimensão', strong: true, width: 'minmax(140px,1.4fr)' },
          { key: 'b', label: 'Peso', mono: true, muted: true },
          { key: 'c', label: 'Valor', width: '160px', render: r => <MeterCell value={String(r.c)} pct={r.c} /> },
          { key: 'd', label: 'Contribuição', mono: true }]} rows={rows} />
      </div>
    </Pn>
    <Pn title="Evidências" sub="Sinais que sustentam cada dimensão">
      <div style={{ display: 'flex', flexDirection: 'column' }}>
        {evidence.map((d, k) => <div key={d.key} style={{ display: 'flex', gap: 12, alignItems: 'center', padding: '12px 0', flexWrap: 'wrap', ...cxRow(k) }}>
          <i className={'ph ' + d.icon} style={{ fontSize: 20, color: pdTone(d.v) }} />
          <span style={{ flex: '1 1 240px', fontSize: 14 }}>{d.ev}</span><Tag>{d.tag}</Tag>
        </div>)}
      </div>
    </Pn>
    <Pn title="Confiança dos dados" sub="Completude por fonte" action={<Badge variant="meta" tone={PD_LEVEL_TONE[PD_LEVEL(p.confidence)]}>{p.confidence}%</Badge>}>
      {sources.map(([l, w, ok, why]) => <ProgressBar key={l} label={l} valueLabel={(ok ? 'Presente' : 'Ausente') + ' · ' + why} value={ok ? 100 : 0} height={6} />)}
      {p.confidence < 75 && <Alert tone="warning" title="Priorize a verificação dos dados">{hasContacts ? 'A prioridade pode mudar após a revalidação dos dados.' : 'Registre ao menos um contato verificado; a prioridade pode mudar após a revalidação dos dados.'}</Alert>}
    </Pn>
    <Pn title="Perfil comercial">
      {entries.length ? <div style={cxGrid(200, 20)}>{entries.map(([k, v]) => <DataField key={k} label={pdKey(k)} mono={typeof v === 'number'}>{String(v)}</DataField>)}</div>
        : <span style={{ fontSize: 13, color: 'var(--text-muted)' }}>Nenhum atributo comercial definido para esta conta.</span>}
    </Pn>
  </>;
}

window.ProspectProfileScreen=ProspectProfileScreen;