const PX_COLS=[['loc','Localização'],['sector','Setor · CNAE'],['size','Porte'],['contracts','Contratos'],['owner','Responsável'],['last','Última atualização'],['created','Criado em'],['next','Próxima ação']];
const PX_COLS_DEF=['loc','sector','size','contracts','owner','last','created'];
const PX_DEF_W={n:300,l:170,se:170,z:110,c:140,sc:84,st:130,o:190,la:150,cr:150,nx:200};
const PX_ORDER_DEF=['n','l','se','z','c','sc','st','o','la','cr','nx'];
const pxLS=(k,d)=>{try{const v=JSON.parse(localStorage.getItem(k));return v==null?d:v}catch(e){return d}};
const pxLSet=(k,v)=>{try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}};
const pxMove=(order,from,to)=>{const a=order.filter(k=>k!==from),i=a.indexOf(to);if(i<0)return order;a.splice(i,0,from);return a};
const pxShift=(order,k,dir)=>{const i=order.indexOf(k),j=i+dir;if(i<0||j<0||j>=order.length)return order;const a=[...order];[a[i],a[j]]=[a[j],a[i]];return a};
const PX_F0={uf:[],sector:'Todos',size:[],stage:'Todos',origin:'Todas',owner:'Todos',min:0,smart:[]};
const PX_SMART=[{key:'icpnc',label:'Alto fit e sem contato',test:function(p){return p.icp>=80&&p.last==null;}},{key:'grow',label:'Muitos contratos (≥ 14)',test:function(p){return p.contracts>=14;}},{key:'due',label:'Ação para hoje ou atrasada',test:function(p){return p.due==='hoje'||(typeof p.due==='string'&&p.due.indexOf('atras')===0);}}];
const PX_VIEWS=[['all','Todos'],['hot','Alta prioridade'],['unassigned','Sem responsável'],['watch','Watchlist'],['acct','Prospects ativos'],['cand','Candidatas']];
// Empresas avaliadas pelo motor de descoberta que ainda não viraram prospect (promoção desligada ou fora do gate).
const PX_PORTE={'01':'ME','03':'EPP','05':'Demais',ME:'ME',EPP:'EPP',MICROEMPRESA:'ME','EMPRESA DE PEQUENO PORTE':'EPP',DEMAIS:'Demais'};
const pxCandidate=(a,x)=>{x=x||{};const e=x.emp||{},r=x.res||{};const cnae=e.cnae_principal||a.cnae||'';const uf=e.uf||a.uf||'—';return{id:'cand:'+a.id,name:e.razao_social||a.name||a.cnpj,cnpj:a.cnpj||e.cnpj,city:e.municipio||'—',uf:uf,sector:cnae?'CNAE '+cnae:'',cnae:cnae,size:e.porte?(PX_PORTE[String(e.porte).toUpperCase()]||String(e.porte)):'',contracts:r.count||0,value:r.total||0,potential:r.total||0,origin:'PNCP',stage:'CANDIDATE',owner:null,total:a.icp_score||0,icp:a.icp_score||0,opp:0,eng:0,last:null,next:'Aguardando enriquecimento',due:'—',temp:'Frio',fav:false,candidate:true,confidence:a.data_confidence||0,empresaId:a.empresa_id,grade:a.grade,reasons:a.reasons,createdAt:a.first_seen_at||a.scored_at||null,updatedAt:a.scored_at||a.first_seen_at||null,regStatus:a.registration_enrichment_status,ctrStatus:a.contract_enrichment_status}};
let PX_CAND_CACHE=null;
const PX_ENRICH={PENDING:'Pendente',ENRICHED:'Concluído',NO_DATA:'Sem dados',ERROR:'Erro'};
function CandidateDrawer({c,onClose,onCreated}){const{Drawer,Button,DataField,Badge}=window.VRticeDesignSystem_d763eb;const{toast,go}=useShell();const[busy,setBusy]=React.useState(false);const rs=Array.isArray(c.reasons)?c.reasons.filter(x=>typeof x==='string'):[];
 return <Drawer kicker={c.candidate?"Empresa candidata":"Prospect"} title={c.name} subtitle={c.candidate?"Avaliada pelo motor de descoberta; ainda não é um prospect.":((c.city&&c.city!=="—"?c.city+" - ":"")+c.uf)} width={460} onClose={onClose} footer={!c.candidate?<><Button variant="primary" block icon="ph-arrow-square-out" onClick={()=>go('prospect',{id:c.id})}>Abrir perfil completo</Button><Button variant="ghost" onClick={onClose}>Fechar</Button></>:<><PBtn perm="commercial_intelligence.create" block loading={busy} icon="ph-plus" onClick={async()=>{try{setBusy(true);const p=await window.VxSalesIntelligence.createFromEmpresa({id:c.empresaId,razao_social:c.name,cnpj:c.cnpj,uf:c.uf==='—'?null:c.uf,cnae_principal:c.cnae});toast('Empresa adicionada aos prospects','ph-check');onCreated(p)}catch(err){toast(err.message||'Não foi possível adicionar','ph-warning')}finally{setBusy(false)}}}>Adicionar e abrir perfil completo</PBtn><Button variant="ghost" onClick={onClose}>Fechar</Button></>}>
  {!c.candidate?<div style={cxGrid(180,16)}><DataField label="CNPJ" mono>{c.cnpj||'—'}</DataField><DataField label="Setor">{c.sector||'—'}</DataField><DataField label="Porte">{c.size||'—'}</DataField><DataField label="Contratos" mono>{c.contracts}</DataField><DataField label="Score" mono>{c.total}</DataField><DataField label="Próxima ação">{c.next||'—'}</DataField></div>:<><div style={cxGrid(180,16)}><DataField label="CNPJ" mono>{c.cnpj||'—'}</DataField><DataField label="UF">{c.uf}</DataField><DataField label="CNAE" mono>{c.cnae||'—'}</DataField><DataField label="Score ICP" mono>{c.total}</DataField><DataField label="Confiança dos dados" mono>{c.confidence}%</DataField><DataField label="Faixa"><Badge variant="meta" tone="neutral">{c.grade==='FILTERED'?'Fora do perfil':(c.grade||'—')}</Badge></DataField></div>
  <div style={{display:'flex',flexDirection:'column',gap:8,marginTop:20}}><span style={vxEyebrow}>ENRIQUECIMENTO</span><span style={{fontSize:14}}>Cadastro: {PX_ENRICH[c.regStatus]||c.regStatus||'—'}</span><span style={{fontSize:14}}>Contratos: {PX_ENRICH[c.ctrStatus]||c.ctrStatus||'—'}</span><span style={{fontSize:12,color:'var(--text-subtle)'}}>A nota sobe conforme cadastro e contratos forem concluídos pela rotina de descoberta.</span></div>
  {rs.length>0&&<div style={{display:'flex',flexDirection:'column',gap:6,marginTop:20}}><span style={vxEyebrow}>MOTIVOS DA AVALIAÇÃO</span>{rs.map((r,k)=><span key={k} style={{fontSize:13,color:'var(--text-muted)'}}>{r}</span>)}</div>}</>}
 </Drawer>}
CandidateDrawer.vxOverlay=true;
const PX_SIZE_RANK={ME:1,EPP:2,'Médio':3,Grande:4};
const PX_SORT_ACC={n:r=>r.name,l:r=>(r.uf&&r.uf!=='—'?r.uf:'')+' '+(r.city&&r.city!=='—'?r.city:''),se:r=>(r.sector||'')+' '+(r.cnae||''),z:r=>PX_SIZE_RANK[r.size]||null,c:r=>r.contracts,pot:r=>r.potential,sc:r=>r.total,st:r=>(window.VXCommercial.STG[r.stage]||{}).label||'',o:r=>r.owner||null,la:r=>r.updatedAt?Date.parse(r.updatedAt):null,cr:r=>r.createdAt?Date.parse(r.createdAt):null,nx:r=>r.next};
const PX_SORT_TEXT={n:1,l:1,se:1,st:1,o:1,nx:1};
const PX_PRESETS=[['Maior score',{k:'sc',d:'desc'}],['Maior valor potencial',{k:'pot',d:'desc'}],['Nome (A–Z)',{k:'n',d:'asc'}],['Atualização mais recente',{k:'la',d:'desc'}],['Mais contratos',{k:'c',d:'desc'}]];
const pxPreset=so=>{const i=PX_PRESETS.findIndex(p=>p[1].k===so.k&&p[1].d===so.d);return i<0?'custom':String(i)};
// Vazios ficam sempre no fim, em qualquer direção.
function pxSortRows(list,so){const g=PX_SORT_ACC[so.k]||PX_SORT_ACC.sc,dir=so.d==='asc'?1:-1,empty=v=>v==null||v===''||(typeof v==='string'&&!v.trim());return[...list].sort((a,b)=>{const x=g(a),y=g(b),ex=empty(x),ey=empty(y);if(ex||ey)return ex&&ey?0:ex?1:-1;return dir*(typeof x==='string'||typeof y==='string'?String(x).localeCompare(String(y),'pt-BR',{numeric:true,sensitivity:'base'}):x-y)})}
function PxSortHead({label,k,so,onSort}){const on=so.k===k;return <button type="button" aria-label={'Ordenar por '+label+(on?(so.d==='asc'?' (crescente)':' (decrescente)'):'')} onClick={e=>{e.stopPropagation();onSort(k)}} style={{all:'unset',cursor:'pointer',display:'inline-flex',alignItems:'center',gap:5,font:'inherit',color:on?'var(--text-primary)':'inherit',whiteSpace:'nowrap'}}>{label}<i className={'ph '+(on?(so.d==='asc'?'ph-arrow-up':'ph-arrow-down'):'ph-arrows-down-up')} style={{fontSize:12,opacity:on?1:.45}}/></button>}
function PxRowCheck({checked,label,onToggle}){const act=e=>{e.stopPropagation();e.preventDefault();onToggle()};return <span role="checkbox" aria-checked={checked} aria-label={label} tabIndex={0} className="vx-check" onClick={act} onKeyDown={e=>(e.key===' '||e.key==='Enter')&&act(e)}><span className="vx-check__box">{checked&&<i className="ph ph-check-fat" style={{fontSize:11,color:'var(--text-on-primary)'}}/>}</span></span>}
function Discovery({onClose,onCreated}){const{Drawer,Input,Select,Button,EmptyState}=window.VRticeDesignSystem_d763eb;const{toast}=useShell();const[q,setQ]=React.useState(''),[uf,setUf]=React.useState('Todos'),[rows,setRows]=React.useState([]),[busy,setBusy]=React.useState(false),[adding,setAdding]=React.useState(null);
 const search=async()=>{setBusy(true);const r=await window.VxSalesIntelligence.discover({q,uf:uf==='Todos'?'':uf,limit:50});setRows(r.data||[]);if(r.error)toast(r.error,'ph-warning');setBusy(false)};
 React.useEffect(()=>{search()},[]);
 return <Drawer kicker="Sales Intelligence" title="Descobrir empresas" subtitle="Base pública PNCP disponível para transformar empresas em prospects." width={560} onClose={onClose}>
  <div style={{display:'flex',gap:10,flexWrap:'wrap'}}><div style={{flex:'1 1 260px'}}><Input icon="ph-magnifying-glass" placeholder="Razão social, nome fantasia ou CNPJ" value={q} onChange={e=>setQ(e.target.value)} onKeyDown={e=>e.key==='Enter'&&search()}/></div><div style={{width:110}}><Select label="UF" options={['Todos','SP','RJ','MG','ES','PR','BA','PE','DF','GO','RS']} value={uf} onChange={e=>setUf(e.target.value)}/></div><Button loading={busy} onClick={search}>Buscar</Button></div>
  <div style={{display:'flex',flexDirection:'column',gap:8,marginTop:18}}>{!rows.length&&!busy?<EmptyState variant="block" icon="ph-database" title="Nenhuma empresa encontrada">Quando a ingestão PNCP estiver populada, esta busca permitirá transformar empresas públicas em prospects comerciais.</EmptyState>:rows.map(e=><div key={e.id} style={{display:'flex',gap:12,alignItems:'center',justifyContent:'space-between',padding:'12px 0',borderTop:'1px solid var(--border-subtle)'}}><span style={{display:'flex',flexDirection:'column',gap:3,minWidth:0}}><strong style={{fontSize:14}}>{e.razao_social||e.nome_fantasia||e.cnpj}</strong><span style={{fontSize:12,color:'var(--text-muted)'}}>{e.municipio||'—'} - {e.uf||'—'} · CNAE {e.cnae_principal||'—'} · {e.porte||'—'}</span><span style={{...cxMono,fontSize:11,color:'var(--text-subtle)'}}>{e.cnpj}</span></span><Button size="sm" variant="secondary" loading={adding===e.id} onClick={async()=>{try{setAdding(e.id);const p=await window.VxSalesIntelligence.createFromEmpresa(e);toast('Empresa adicionada aos prospects','ph-check');onCreated(p)}catch(err){toast(err.message||'Não foi possível adicionar','ph-warning')}finally{setAdding(null)}}}>Adicionar</Button></div>)}</div>
 </Drawer>}
Discovery.vxOverlay=true;
function PxRowActions({r,go,toast,onOpen}){const{Button,IconButton}=window.VRticeDesignSystem_d763eb;const{can}=useAccess();const[busy,setBusy]=React.useState(false);const stop=e=>e.stopPropagation();
 const add=async()=>{try{setBusy(true);const p=await window.VxSalesIntelligence.createFromEmpresa({id:r.empresaId,razao_social:r.name,cnpj:r.cnpj,uf:r.uf==='—'?null:r.uf,cnae_principal:r.cnae});toast('Empresa adicionada aos prospects','ph-check');if(p&&p.id)go('prospect',{id:p.id})}catch(err){toast(err.message||'Não foi possível adicionar','ph-warning')}finally{setBusy(false)}};
 const call=async()=>{try{await window.VxSalesIntelligence.activity(r.id,'CALL','Contato comercial');toast('Contato registrado','ph-phone-call')}catch(err){toast(err.message||'Falha ao registrar','ph-warning')}};
 return <span onClick={stop} style={{display:'inline-flex',alignItems:'center',gap:6,whiteSpace:'nowrap'}}>
  {r.candidate?<PBtn perm="commercial_intelligence.create" size="sm" icon="ph-plus" loading={busy} onClick={add}>Adicionar</PBtn>:<Button size="sm" variant="secondary" icon="ph-arrow-square-out" onClick={()=>go('prospect',{id:r.id})}>Abrir perfil</Button>}
  {!r.candidate&&can('commercial_intelligence.edit')&&<IconButton icon="ph-phone-call" aria-label={'Registrar contato com '+r.name} title="Registrar contato" onClick={call}/>}
  <IconButton icon="ph-sidebar-simple" aria-label={'Ver detalhes de '+r.name} title="Ver detalhes" onClick={()=>onOpen(r)}/>
 </span>}
const PX_TZ={timeZone:'America/Sao_Paulo'};
function pxCreatedParts(iso){if(!iso)return null;const d=new Date(iso);if(isNaN(d))return null;const ms=Date.now()-d.getTime();const rel=ms<60000?'agora':ms<3600000?'há '+Math.floor(ms/60000)+' min':ms<86400000?'há '+Math.floor(ms/3600000)+' h':'há '+Math.floor(ms/86400000)+' d';return{day:d.toLocaleDateString('pt-BR',{...PX_TZ,day:'2-digit',month:'2-digit',year:'numeric'}),time:d.toLocaleTimeString('pt-BR',{...PX_TZ,hour:'2-digit',minute:'2-digit'}),rel,isNew:ms<172800000}}
const pxEll={display:'block',minWidth:0,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap'};
function PxCell({children}){return <div style={{minWidth:0,maxWidth:'100%',overflow:'hidden'}}>{children}</div>}
function PxCreated({iso,noBadge}){const{Tag}=window.VRticeDesignSystem_d763eb;const c=pxCreatedParts(iso);if(!c)return <CxDash/>;return <span title={c.day+' '+c.time} style={{display:'flex',flexDirection:'column',gap:3}}><span style={{display:'flex',alignItems:'center',gap:6}}><span style={cxMono}>{c.day}</span>{c.isNew&&!noBadge&&<Tag tone="info">Novo</Tag>}</span><span style={{...cxMono,fontSize:12,color:'var(--text-subtle)'}}>{c.time} · {c.rel}</span></span>}
function PxColHead({k,label,w,def,onResize,reorder,dragK,overK,onDragK,onOverK,onMove,onShift}){const ref=React.useRef(null);const raf=React.useRef(0);const start=e=>{e.preventDefault();e.stopPropagation();const x0=e.clientX,w0=w;const el=e.currentTarget;try{el.setPointerCapture(e.pointerId)}catch(_){}const mv=ev=>{cancelAnimationFrame(raf.current);const nx=Math.max(70,Math.min(700,Math.round(w0+ev.clientX-x0)));raf.current=requestAnimationFrame(()=>onResize(k,nx))};const up=()=>{el.removeEventListener('pointermove',mv);el.removeEventListener('pointerup',up);el.removeEventListener('pointercancel',up)};el.addEventListener('pointermove',mv);el.addEventListener('pointerup',up);el.addEventListener('pointercancel',up)};const handleKey=e=>{if(e.target!==e.currentTarget&&e.target.tagName==='BUTTON'&&!e.altKey)return;if(e.altKey&&(e.key==='ArrowLeft'||e.key==='ArrowRight')){e.preventDefault();onShift(k,e.key==='ArrowLeft'?-1:1)}};const hl=overK===k&&dragK&&dragK!==k;return <div ref={ref} role="presentation" draggable={reorder} onDragStart={e=>{e.dataTransfer.effectAllowed='move';try{e.dataTransfer.setData('text/plain',k)}catch(_){}onDragK(k)}} onDragEnd={()=>{onDragK(null);onOverK(null)}} onDragOver={e=>{if(dragK){e.preventDefault();onOverK(k)}}} onDrop={e=>{e.preventDefault();if(dragK&&dragK!==k)onMove(dragK,k);onDragK(null);onOverK(null)}} onKeyDown={handleKey} style={{position:'relative',display:'flex',alignItems:'center',minWidth:0,cursor:reorder?'grab':undefined,boxShadow:hl?'-3px 0 0 var(--text-accent)':undefined,opacity:dragK===k?.45:1}} title={reorder?'Arraste para reordenar (ou Alt + setas)':undefined}>{label}<span role="separator" aria-orientation="vertical" aria-label="Ajustar largura da coluna" onPointerDown={start} onDoubleClick={e=>{e.stopPropagation();onResize(k,def)}} onClick={e=>e.stopPropagation()} style={{position:'absolute',right:-12,top:-8,bottom:-8,width:12,cursor:'col-resize',touchAction:'none',display:'flex',justifyContent:'center'}}><span style={{width:2,height:'100%',background:'var(--border-subtle)',borderRadius:1}}/></span></div>}
function ProspectsScreen(){const{PageHeader,Card,Table,Tag,Checkbox,Button,IconButton,Input,Select,Field,FilterChip,Slider,Drawer,EmptyState}=window.VRticeDesignSystem_d763eb;const{bp,toast,go}=useShell();const C=window.VXCommercial,P=useProspects();const[q,setQ]=React.useState(''),[view,setView]=React.useState('all'),[f,setF]=React.useState(PX_F0),[sort,setSort]=React.useState({k:'sc',d:'desc'}),[cols,setCols]=React.useState(()=>pxLS('vx-px-cols',PX_COLS_DEF)),[colW,setColW]=React.useState(()=>pxLS('vx-px-colw',{})),[colOrder,setColOrder]=React.useState(()=>pxLS('vx-px-colorder',PX_ORDER_DEF)),[dragK,setDragK]=React.useState(null),[overK,setOverK]=React.useState(null),[sel,setSel]=React.useState([]),[rail,setRail]=React.useState(false),[cm,setCm]=React.useState(false),[saved,setSaved]=React.useState(false),[disc,setDisc]=React.useState(false),[run,setRun]=React.useState(false),[tick,setTick]=React.useState(0),[cand,setCand]=React.useState(()=>PX_CAND_CACHE||[]),[candReady,setCandReady]=React.useState(()=>!!PX_CAND_CACHE),[candOpen,setCandOpen]=React.useState(null);
 React.useEffect(()=>{let live=true;window.VxSalesIntelligence.discoveryAssessments(500).then(r=>{if(!live)return;const l=(r.data||[]).filter(a=>a.promotion_status!=='PROMOTED'&&!a.promoted_account_id).map(a=>pxCandidate(a,r.extra&&r.extra[a.empresa_id]));PX_CAND_CACHE=l;window.VX_PX_CAND=l;setCand(l);setCandReady(true)});return()=>{live=false}},[tick]);
 const candAll=cand;const have=React.useMemo(()=>new Set(P.map(p=>String(p.cnpj||'').replace(/\D/g,''))),[P]);const candV=React.useMemo(()=>candAll.filter(c=>!have.has(String(c.cnpj||'').replace(/\D/g,''))),[candAll,have]);
 const A=React.useMemo(()=>P.concat(candV),[P,candV]);const openRow=r=>setCandOpen(r);React.useEffect(()=>{if(bp==='mobile')setRail(false)},[bp]);
 const refreshIntel=async()=>{setRun(true);try{const r=await window.VxSalesIntelligence.runDiscovery();const st=r.sourceStatus;toast(st==='UPSTREAM_UNAVAILABLE'?'Fonte pública indisponível: '+(r.error||'tente novamente mais tarde'):st==='ERROR'?'Falha na varredura: '+(r.error||'erro desconhecido'):r.skipped?'Descoberta desativada para este ambiente':(r.discovery?.scanned||0)+' resultados varridos · '+(r.promotion?.promoted||0)+' promovidos'+(r.discovery?.capped?' · limite de páginas atingido, continua na próxima execução':''),st==='SUCCESS'||st==='PARTIAL'?'ph-check':'ph-warning')}catch(e){toast(e.message||'Não foi possível atualizar a inteligência','ph-warning')}finally{setRun(false);setTick(t=>t+1)}};
 const owners=[...new Set(P.map(p=>p.owner).filter(Boolean))];const exportRows=list=>{const n=window.VxSafe.downloadCsv('prospects-'+new Date().toISOString().slice(0,10)+'.csv',['Tipo','Empresa','CNPJ','Cidade','UF','Segmento','Estágio','Responsável','Prioridade','ICP','Confiança dos dados'],list.map(r=>[r.candidate?'Candidata':'Prospect',r.name,r.cnpj,r.city,r.uf,r.sector,r.candidate?'':((C.STG[r.stage]||{}).label||''),r.owner||'',r.total==null?'':r.total,r.icp==null?'':r.icp,r.confidence==null?'':r.confidence]));toast(n+' linhas exportadas','ph-export')};const open=id=>go('prospect',{id}),tog=(k,v)=>setF(x=>({...x,[k]:x[k].includes(v)?x[k].filter(y=>y!==v):[...x[k],v]}));
 const rows=React.useMemo(()=>{const ql=q.toLowerCase();let r=A.filter(p=>(!ql||(p.name+' '+p.city+' '+p.sector+' '+p.cnpj+' '+p.cnae).toLowerCase().includes(ql))&&(!f.uf.length||f.uf.includes(p.uf))&&(f.sector==='Todos'||p.sector===f.sector)&&(!f.size.length||f.size.includes(p.size))&&(f.stage==='Todos'||(C.STG[p.stage]&&C.STG[p.stage].label===f.stage))&&(f.origin==='Todas'||p.origin===f.origin)&&(f.owner==='Todos'||(f.owner==='Sem responsável'?!p.owner:p.owner===f.owner))&&p.total>=f.min&&f.smart.every(k=>PX_SMART.find(s=>s.key===k)?.test(p)===true));if(view==='hot')r=r.filter(p=>p.total>=80);if(view==='unassigned')r=r.filter(p=>!p.owner);if(view==='watch')r=r.filter(p=>p.fav);if(view==='acct')r=r.filter(p=>!p.candidate);if(view==='cand')r=r.filter(p=>p.candidate);return pxSortRows(r,sort)},[A,q,view,f,sort]);
 const[ps,setPs]=React.useState(()=>{try{return localStorage.getItem('vx-prospects-ps')||'50'}catch(e){return '50'}}),[pg,setPg]=React.useState(0),[autoN,setAutoN]=React.useState(50),sentRef=React.useRef(null);
 const auto=ps==='auto',size=auto?50:(Number(ps)||50),pages=Math.max(1,Math.ceil(rows.length/size)),cur=Math.min(pg,pages-1),pageRows=auto?rows.slice(0,autoN):rows.slice(cur*size,cur*size+size);
 React.useEffect(()=>{setPg(0);setAutoN(50)},[rows,ps]);
 React.useEffect(()=>{if(!auto||!sentRef.current||typeof IntersectionObserver==='undefined')return;const io=new IntersectionObserver(es=>{if(es.some(e=>e.isIntersecting))setAutoN(n=>Math.min(n+50,rows.length))},{rootMargin:'400px'});io.observe(sentRef.current);return()=>io.disconnect()},[auto,rows.length,autoN,candReady]);
 React.useEffect(()=>{window.VX_PROSPECT_ORDER=rows.filter(r=>!r.candidate).map(r=>r.id)},[rows]);
 const sortBy=k=>setSort(o=>o.k===k?{k,d:o.d==='asc'?'desc':'asc'}:{k,d:PX_SORT_TEXT[k]?'asc':'desc'});
 const changePs=v=>{setPs(v);try{localStorage.setItem('vx-prospects-ps',v)}catch(e){}};
 const from=rows.length?(auto?1:cur*size+1):0,to=auto?Math.min(autoN,rows.length):Math.min(cur*size+size,rows.length);
 const Pager=<div style={{display:'flex',alignItems:'center',justifyContent:'space-between',gap:12,flexWrap:'wrap',padding:'12px 4px'}}><span style={{display:'flex',alignItems:'center',gap:10,fontSize:13,color:'var(--text-muted)'}}>Mostrar<span style={{width:210}}><Select aria-label="Itens por página" options={[['25','25 por página'],['50','50 por página'],['100','100 por página'],['200','200 por página'],['auto','Carregamento automático']].map(o=>({value:o[0],label:o[1]}))} value={ps} onChange={e=>changePs(e.target.value)}/></span></span><span style={{fontSize:13,color:'var(--text-muted)'}}>{from}–{to} de {rows.length}</span>{auto?(to<rows.length?<span ref={sentRef} style={{fontSize:13,color:'var(--text-subtle)'}}>Carregando mais…</span>:<span style={{fontSize:13,color:'var(--text-subtle)'}}>Fim da lista</span>):<span style={{display:'flex',gap:8}}><Button size="sm" variant="secondary" disabled={cur<=0} onClick={()=>setPg(cur-1)}>Anterior</Button><span style={{fontSize:13,alignSelf:'center'}}>{cur+1} / {pages}</span><Button size="sm" variant="secondary" disabled={cur>=pages-1} onClick={()=>setPg(cur+1)}>Próxima</Button></span>}</div>;
 const nf=f.uf.length+f.size.length+f.smart.length+(f.sector!=='Todos')+(f.stage!=='Todos')+(f.origin!=='Todas')+(f.owner!=='Todos')+(f.min>0),allSel=rows.length>0&&rows.every(r=>sel.includes(r.id)),show=k=>cols.includes(k),stop=e=>e.stopPropagation(),toggleRow=id=>setSel(s=>s.includes(id)?s.filter(x=>x!==id):[...s,id]),chk=id=><PxRowCheck checked={sel.includes(id)} label={'Selecionar '+(C.byId[id]?.name||'empresa')} onToggle={()=>toggleRow(id)}/>;
 const columnsRaw=[{key:'s',label:<span onClick={stop} style={{display:'flex'}}><Checkbox checked={allSel} onChange={()=>setSel(allSel?[]:rows.map(r=>r.id))}/></span>,width:'28px',render:r=>chk(r.id)},{key:'n',label:<PxSortHead label="Empresa" k="n" so={sort} onSort={sortBy}/>,width:'minmax(220px,2fr)',render:r=><span style={{display:'flex',flexDirection:'column',gap:3,minWidth:0}}><span title={r.name} style={{...pxEll,fontWeight:600}}>{r.name}{r.fav&&<i className="ph ph-star-fill" style={{fontSize:12,color:'var(--status-warning)',marginLeft:6}}/>}</span><span style={{...pxEll,...cxMono,fontSize:12,color:'var(--text-subtle)'}}>{r.cnpj||'—'}</span></span>},show('loc')&&{key:'l',label:<PxSortHead label="Localização" k="l" so={sort} onSort={sortBy}/>,render:r=><span title={r.city+' - '+r.uf} style={pxEll}>{r.city} - {r.uf}</span>},show('sector')&&{key:'se',label:<PxSortHead label="Setor · CNAE" k="se" so={sort} onSort={sortBy}/>,render:r=><span style={{display:'flex',flexDirection:'column',gap:3}}><span title={r.sector||''} style={pxEll}>{r.sector||'—'}</span><span title={r.cnae||''} style={{...pxEll,...cxMono,fontSize:12,color:'var(--text-subtle)'}}>{r.cnae||'—'}</span></span>},show('size')&&{key:'z',label:<PxSortHead label="Porte" k="z" so={sort} onSort={sortBy}/>,render:r=><Tag>{r.size||'—'}</Tag>},show('contracts')&&{key:'c',label:<PxSortHead label="Contratos" k="c" so={sort} onSort={sortBy}/>,render:r=><span style={{display:'flex',flexDirection:'column',gap:3}}><span style={cxMono}>{r.contracts}</span><span style={{...pxEll,...cxMono,fontSize:12,color:'var(--text-subtle)'}}>{cxBrl(r.value)}</span></span>},{key:'sc',label:<PxSortHead label="Score" k="sc" so={sort} onSort={sortBy}/>,width:'84px',render:r=><ScoreChip v={r.total}/>},{key:'st',label:<PxSortHead label="Estágio" k="st" so={sort} onSort={sortBy}/>,width:'130px',render:r=><StageBadge stage={r.stage}/>},show('owner')&&{key:'o',label:<PxSortHead label="Responsável" k="o" so={sort} onSort={sortBy}/>,render:r=><Person name={r.owner}/>},show('last')&&{key:'la',label:<PxSortHead label="Última atualização" k="la" so={sort} onSort={sortBy}/>,render:r=><PxCreated iso={r.updatedAt} noBadge/>},show('created')&&{key:'cr',label:<PxSortHead label="Criado em" k="cr" so={sort} onSort={sortBy}/>,render:r=><PxCreated iso={r.createdAt}/>},show('next')&&{key:'nx',label:<PxSortHead label="Próxima ação" k="nx" so={sort} onSort={sortBy}/>,render:r=><span style={{display:'flex',flexDirection:'column',gap:3}}><span title={r.next} style={pxEll}>{r.next}</span><span title={r.due} style={{...pxEll,fontSize:12,color:r.due.startsWith('atras')?'var(--status-danger-text)':'var(--text-subtle)'}}>{r.due}</span></span>},{key:'act',label:'Ações',width:'200px',render:r=><PxRowActions r={r} go={go} toast={toast} onOpen={openRow}/>}].filter(Boolean);
 const setW=React.useCallback((k,w)=>setColW(o=>{const n={...o,[k]:w};pxLSet('vx-px-colw',n);return n}),[]);
 const moveCol=(from,to)=>setColOrder(o=>{const n=pxMove(o,from,to);pxLSet('vx-px-colorder',n);return n});
 const shiftCol=(k,dir)=>setColOrder(o=>{const vis=o.filter(x=>columnsRaw.some(c=>c.key===x));const t=pxShift(vis,k,dir);if(t===vis)return o;const n=[...t,...o.filter(x=>!vis.includes(x))];pxLSet('vx-px-colorder',n);return n});
 const resetCols=()=>{setColW({});setColOrder(PX_ORDER_DEF);setCols(PX_COLS_DEF);pxLSet('vx-px-colw',{});pxLSet('vx-px-colorder',PX_ORDER_DEF);pxLSet('vx-px-cols',PX_COLS_DEF)};
 const byKey=Object.fromEntries(columnsRaw.map(c=>[c.key,c]));
 const dataCols=[...colOrder.filter(k=>byKey[k]),...columnsRaw.filter(c=>c.key!=='s'&&c.key!=='act'&&!colOrder.includes(c.key)).map(c=>c.key)].map(k=>{const c=byKey[k],w=colW[k]||PX_DEF_W[k]||150;const rd=c.render;return{...c,render:r=><PxCell>{rd(r)}</PxCell>,width:w+'px',label:<PxColHead k={k} w={w} def={PX_DEF_W[k]||150} label={c.label} reorder onResize={setW} dragK={dragK} overK={overK} onDragK={setDragK} onOverK={setOverK} onMove={moveCol} onShift={shiftCol}/>}});
 const columns=[byKey.s,...dataCols,byKey.act,{key:'fill',label:'',width:'minmax(0,1fr)',render:()=>null}];
 const tableMinW=[byKey.s,...dataCols,byKey.act].reduce((a,c)=>a+(parseInt(c.width,10)||200),0)+16*(dataCols.length+2)+32;

 const Rail=<div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(220px,1fr))',gap:20,alignItems:'start'}}><div style={{display:'flex',justifyContent:'space-between',gridColumn:'1 / -1'}}><span style={vxEyebrow}>FILTROS{nf?' · '+nf:''}</span>{nf>0&&<Button variant="link" onClick={()=>setF(PX_F0)}>Limpar</Button>}</div><Field label="Estado"><div style={{display:'flex',flexWrap:'wrap',gap:6}}>{['SP','RJ','MG','ES','PR','BA','PE','DF','GO','RS'].map(u=><FilterChip key={u} label={u} selected={f.uf.includes(u)} onClick={()=>tog('uf',u)}/>)}</div></Field><Select label="Setor" options={['Todos',...C.SECTORS.map(s=>s[0])]} value={f.sector} onChange={e=>setF({...f,sector:e.target.value})}/><Field label="Porte"><div style={{display:'flex',flexWrap:'wrap',gap:6}}>{['ME','EPP','Médio','Grande'].map(u=><FilterChip key={u} label={u} selected={f.size.includes(u)} onClick={()=>tog('size',u)}/>)}</div></Field><Slider label="Score mínimo" valueLabel={String(f.min)} min={0} max={100} value={f.min} onChange={v=>setF({...f,min:v})}/><Select label="Estágio comercial" options={['Todos',...C.STAGES.map(s=>s[1])]} value={f.stage} onChange={e=>setF({...f,stage:e.target.value})}/><Select label="Origem" options={['Todas',...C.ORIGINS]} value={f.origin} onChange={e=>setF({...f,origin:e.target.value})}/><Select label="Responsável" options={['Todos','Sem responsável',...owners]} value={f.owner} onChange={e=>setF({...f,owner:e.target.value})}/><span style={vxEyebrow}>FILTROS INTELIGENTES</span>{PX_SMART.map(s=>{const on=f.smart.includes(s.key);return <button key={s.key} type="button" className="vx-chip" onClick={()=>tog('smart',s.key)} style={{justifyContent:'flex-start',borderRadius:12,background:on?'var(--action-selected-bg)':undefined}}><i className="ph ph-lightning" style={{fontSize:14,color:'var(--text-accent)'}}/>{s.label}</button>})}</div>;
 return <BlockGrid.Auto id="prospects"><PageHeader size="lg" eyebrow="COMERCIAL · SALES INTELLIGENCE" title="Prospects" description={candReady?A.length+' empresas na base: '+P.length+' prospects ativos e '+candV.length+' candidatas em avaliação, a partir da inteligência pública.':'Carregando a base de empresas…'} actions={<><PBtn perm="commercial_intelligence.export" variant="secondary" icon="ph-export" disabled={!rows.length} onClick={()=>exportRows(rows)}>Exportar</PBtn><PBtn perm="commercial_intelligence.create" variant="secondary" icon="ph-plus" onClick={()=>setDisc(true)}>Adicionar CNPJ</PBtn><PBtn perm="integrations.manage" icon="ph-arrows-clockwise" loading={run} onClick={refreshIntel}>Atualizar inteligência</PBtn></>}/><ReadOnlyNote perm="commercial_intelligence.edit"/><CxLoadError/><div style={{display:'flex',gap:20,alignItems:'flex-start'}}><div style={{flex:1,minWidth:0,display:'flex',flexDirection:'column',gap:16}}>{rail&&bp!=='mobile'&&<Card variant="panel" padding={20}>{Rail}</Card>}<div style={{display:'flex',gap:12,flexWrap:'wrap',alignItems:'center'}}><div style={{flex:'1 1 260px'}}><Input icon="ph-magnifying-glass" placeholder="Buscar empresa, CNPJ, cidade ou CNAE" value={q} onChange={e=>setQ(e.target.value)}/></div><Button variant="secondary" icon="ph-funnel" onClick={()=>setRail(!rail)}>Filtros{nf?' · '+nf:''}</Button><div style={{width:240}}><Select compact aria-label="Ordenação" options={[...PX_PRESETS.map((p,i)=>({value:String(i),label:p[0]})),{value:'custom',label:'Personalizada (cabeçalho)',disabled:true}]} value={pxPreset(sort)} onChange={e=>{const p=PX_PRESETS[Number(e.target.value)];if(p)setSort(p[1])}}/></div><IconButton icon="ph-columns" label="Colunas" onClick={()=>setCm(!cm)}/></div>{cm&&<Card variant="panel" padding={16}><div style={{display:'flex',gap:18,flexWrap:'wrap',alignItems:'center'}}><strong style={{fontSize:13}}>Colunas visíveis</strong>{PX_COLS.map(([k,l])=><label key={k} style={{display:'flex',gap:8,alignItems:'center',fontSize:14}}><input type="checkbox" checked={cols.includes(k)} onChange={()=>{const n=cols.includes(k)?cols.filter(x=>x!==k):[...cols,k];setCols(n);pxLSet('vx-px-cols',n)}}/>{l}</label>)}<Button variant="link" onClick={resetCols}>Redefinir colunas</Button></div><span style={{fontSize:12,color:'var(--text-muted)'}}>Arraste os cabeçalhos para reordenar, arraste a borda para ajustar a largura (duplo clique restaura).</span></Card>}<div style={{display:'flex',gap:8,flexWrap:'wrap'}}>{PX_VIEWS.map(([k,l])=><FilterChip key={k} label={l} tone="info" selected={view===k} onClick={()=>setView(k)}/>)}<SoonBtn variant="link" icon="ph-bookmark-simple">Salvar view</SoonBtn></div>{sel.length>0&&<div style={{display:'flex',gap:10,alignItems:'center',flexWrap:'wrap',padding:'10px 14px',borderRadius:14,background:'var(--action-selected-bg)'}}><strong>{sel.length} selecionados</strong><SoonBtn size="sm" variant="secondary" icon="ph-user-plus">Atribuir</SoonBtn><PBtn perm="commercial_intelligence.export" size="sm" variant="secondary" icon="ph-export" onClick={()=>exportRows(rows.filter(r=>sel.includes(r.id)))}>Exportar</PBtn><Button size="sm" variant="link" onClick={()=>setSel([])}>Limpar</Button></div>}{bp==='mobile'?<div style={{display:'flex',flexDirection:'column',gap:10}}>{!rows.length&&<EmptyState variant="block" icon="ph-database" title="Nenhum prospect">Use “Descobrir empresas” para transformar registros PNCP em prospects.</EmptyState>}{pageRows.map(r=><Card key={r.id} variant="flat" padding={16} gap={10} interactive onClick={()=>openRow(r)}><div style={{display:'flex',justifyContent:'space-between',gap:10}}><span style={{display:'flex',flexDirection:'column',gap:3}}><strong>{r.name}</strong><span style={{fontSize:12,color:'var(--text-muted)'}}>{r.city} - {r.uf} · {r.sector}</span></span><ScoreChip v={r.total}/></div><div style={{display:'flex',justifyContent:'space-between'}}><StageBadge stage={r.stage}/><Person name={r.owner} size={24}/></div><span style={{fontSize:12,color:'var(--text-subtle)'}}>{r.next} · {r.due}</span><PxRowActions r={r} go={go} toast={toast} onOpen={openRow}/></Card>)}</div>:<Card variant="flat" padding={0} gap={0} style={{overflow:'hidden'}}><div style={{padding:'18px 24px'}}><span style={{fontSize:14,color:'var(--text-muted)'}}><strong style={{color:'var(--text-primary)'}}>{rows.length}</strong> resultados carregados</span></div>{!candReady?<div aria-busy="true" aria-label="Carregando" style={{display:'flex',flexDirection:'column',gap:14,padding:'8px 0'}}>{[0,1,2,3,4,5,6,7].map(k=><window.VRticeDesignSystem_d763eb.Skeleton key={k} height={44} radius={10}/>)}</div>:rows.length?<Table columns={columns} rows={pageRows} cellX={16} rowY={14} minWidth={tableMinW} onRowClick={openRow}/>:<div style={{padding:'0 24px 24px'}}><EmptyState variant="block" icon="ph-database" title="Nenhum prospect encontrado">A base comercial agora é alimentada pela camada real de Sales Intelligence.</EmptyState></div>}</Card>}{candReady&&rows.length>0&&Pager}</div></div><DiscoveryCockpit tick={tick} running={run}/>{rail&&bp==='mobile'&&<Drawer kicker="Prospects" title="Filtros" width={360} onClose={()=>setRail(false)} footer={<Button block onClick={()=>setRail(false)}>Ver {rows.length} resultados</Button>}>{Rail}</Drawer>}{candOpen&&<CandidateDrawer c={candOpen} onClose={()=>setCandOpen(null)} onCreated={p=>{setCandOpen(null);setSel([]);if(p&&p.id)go('prospect',{id:p.id})}}/>}{disc&&<Discovery onClose={()=>setDisc(false)} onCreated={()=>{setDisc(false);setSel([])}}/>}</BlockGrid.Auto>}
window.ProspectsScreen=ProspectsScreen;