function OperacaoScreen() {
  const { PageHeader, Card, Badge, Button, Input } = window.VRticeDesignSystem_d763eb;
  const cfg = window.VX_SUPABASE || {};
  // Um cliente por montagem da tela (antes era recriado a cada render) e só com o Supabase configurado.
  const client = React.useMemo(() => (cfg.url && cfg.anonKey && window.supabase?.createClient) ? window.supabase.createClient(cfg.url, cfg.anonKey, { auth:{persistSession:true,autoRefreshToken:true} }) : null, [cfg.url, cfg.anonKey]);
  const [ctx,setCtx] = React.useState(null), [bids,setBids] = React.useState([]), [proposals,setProposals] = React.useState([]), [contracts,setContracts] = React.useState([]), [plans,setPlans] = React.useState([]);
  const [selected,setSelected] = React.useState(''), [title,setTitle] = React.useState(''), [value,setValue] = React.useState(''), [margin,setMargin] = React.useState(''), [busy,setBusy] = React.useState(false), [error,setError] = React.useState('');
  const money = v => v == null ? '—' : Number(v).toLocaleString('pt-BR',{style:'currency',currency:'BRL'});
  const load = async () => {
    if (!client) return;
    setBusy(true); setError('');
    try {
      const {data:s} = await client.auth.getSession(); if (!s?.session?.user) throw new Error('Sessão não encontrada.');
      const {data:c, error:ce} = await client.from('user_active_contexts').select('organization_id,environment_id').eq('user_id',s.session.user.id).single(); if (ce) throw ce;
      setCtx(c);
      const [{data:b,error:be},{data:p,error:pe},{data:k,error:ke},{data:e,error:ee}] = await Promise.all([
        client.from('bids').select('id,title,estimated_value,status,opening_date,licitacao_id,opportunity_assessments(id,final_decision,go_no_go_score,match_score)').eq('organization_id',c.organization_id).order('created_at',{ascending:false}).limit(50),
        client.from('proposals').select('*').eq('organization_id',c.organization_id).order('created_at',{ascending:false}),
        client.from('contracts').select('*').eq('organization_id',c.organization_id).order('created_at',{ascending:false}),
        client.from('execution_plans').select('*').eq('organization_id',c.organization_id).order('created_at',{ascending:false})
      ]);
      if (be||pe||ke||ee) throw (be||pe||ke||ee);
      setBids(b||[]); setProposals(p||[]); setContracts(k||[]); setPlans(e||[]);
    } catch(e){ setError(e.message||String(e)); } finally { setBusy(false); }
  };
  React.useEffect(()=>{ load(); },[]);
  const eligible = bids.filter(b => (b.opportunity_assessments||[]).some(a => a.final_decision === 'PARTICIPAR'));
  const createProposal = async () => {
    const bid = bids.find(x=>x.id===selected); if (!bid || !ctx || !client) return;
    setBusy(true); setError('');
    try {
      const assessment = (bid.opportunity_assessments||[]).find(a=>a.final_decision==='PARTICIPAR') || null;
      const {error:e} = await client.from('proposals').insert({
        organization_id:ctx.organization_id, environment_id:ctx.environment_id, bid_id:bid.id,
        opportunity_assessment_id:assessment?.id||null, title:title||('Proposta — '+bid.title),
        total_value:value?Number(value):bid.estimated_value||null, margin_pct:margin?Number(margin):null
      });
      if(e) throw e; setSelected(''); setTitle(''); setValue(''); setMargin(''); await load();
    } catch(e){setError(e.message||String(e));} finally{setBusy(false);}
  };
  const convertContract = async p => {
    if(!ctx||!client) return; setBusy(true); setError('');
    try {
      const {data:c,error:e}=await client.from('contracts').insert({
        organization_id:ctx.organization_id, bid_id:p.bid_id, proposal_id:p.id,
        number:'A DEFINIR', total_value:p.total_value, status:'ATIVO'
      }).select('*').single();
      if(e) throw e;
      // O contrato já foi criado; se marcar a proposta falhar, avisa em vez de esconder a falha parcial.
      const {error:ue}=await client.from('proposals').update({status:'VENCEDORA'}).eq('id',p.id);
      if(ue) { await load(); throw new Error('Contrato '+(c?.id||'')+' criado, mas a proposta não foi marcada como vencedora: '+(ue.message||ue)+'. Não converta de novo; marque a proposta manualmente.'); }
      await load();
    } catch(e){setError(e.message||String(e));} finally{setBusy(false);}
  };
  const openExecution = async c => {
    if(!ctx||!client) return; setBusy(true); setError('');
    try {
      const {error:e}=await client.from('execution_plans').insert({
        organization_id:ctx.organization_id, environment_id:ctx.environment_id, contract_id:c.id,
        status:'PLANEJAMENTO', start_date:c.start_date, end_date:c.end_date, progress_pct:0
      });
      if(e) throw e; await load();
    } catch(e){setError(e.message||String(e));} finally{setBusy(false);}
  };
  const stage = (label,count,desc) => <Card variant="analysis" padding={22} gap={8}><span style={{fontSize:11,letterSpacing:'.14em',color:'var(--text-subtle)'}}>{label}</span><strong style={{fontSize:30}}>{count}</strong><span style={{fontSize:13,color:'var(--text-muted)'}}>{desc}</span></Card>;
  return <BlockGrid.Auto id="operacao"><PageHeader eyebrow="ORQUESTAÇÃO OPERACIONAL" title="Opportunity → Proposta → Contrato → Execução" description="Um único cockpit para transformar uma decisão comercial em operação executável." />
    {error && <div style={{padding:12,marginBottom:18,border:'1px solid var(--border-danger)',borderRadius:10,color:'var(--text-danger)'}}>{error}</div>}
    <div style={{display:'grid',gridTemplateColumns:'repeat(4,minmax(0,1fr))',gap:14,marginBottom:24}}>
      {stage('OPORTUNIDADES APROVADAS',eligible.length,'Go/No-Go = PARTICIPAR')}
      {stage('PROPOSTAS',proposals.length,'Pacotes em elaboração e envio')}
      {stage('CONTRATOS',contracts.length,'Contratos operacionais')}
      {stage('EXECUÇÃO',plans.length,'Planos de execução ativos')}
    </div>
    <div style={{display:'grid',gridTemplateColumns:'minmax(0,1fr) minmax(320px,.8fr)',gap:18,alignItems:'start'}}>
      <Card padding={24} gap={14}><div style={{display:'flex',justifyContent:'space-between',alignItems:'center'}}><strong>Fila operacional</strong><Button size="sm" variant="secondary" onClick={load} disabled={busy}>Atualizar</Button></div>
        {proposals.length===0 && contracts.length===0 && plans.length===0 ? <div style={{padding:18,border:'1px dashed var(--border-default)',borderRadius:10,color:'var(--text-muted)'}}>Nenhum objeto operacional persistido ainda. Comece por uma oportunidade com decisão PARTICIPAR.</div> :
        <div style={{display:'flex',flexDirection:'column',gap:10}}>
          {proposals.map(p=><div key={p.id} style={{padding:16,border:'1px solid var(--border-default)',borderRadius:12,display:'flex',justifyContent:'space-between',gap:12,alignItems:'center'}}><div><strong>{p.title}</strong><div style={{fontSize:12,color:'var(--text-muted)',marginTop:4}}>{money(p.total_value)} · margem {p.margin_pct??'—'}%</div></div><div style={{display:'flex',gap:8,alignItems:'center'}}><Badge tone={p.status==='VENCEDORA'?'success':'warning'}>{p.status}</Badge>{p.status!=='VENCEDORA' && <Button size="sm" onClick={()=>convertContract(p)}>Converter em contrato</Button>}</div></div>)}
          {contracts.map(c=><div key={c.id} style={{padding:16,border:'1px solid var(--border-default)',borderRadius:12,display:'flex',justifyContent:'space-between',gap:12,alignItems:'center'}}><div><strong>Contrato {c.number}</strong><div style={{fontSize:12,color:'var(--text-muted)',marginTop:4}}>{money(c.total_value)}</div></div><div style={{display:'flex',gap:8,alignItems:'center'}}><Badge>{c.status}</Badge>{!plans.some(x=>x.contract_id===c.id) && <Button size="sm" onClick={()=>openExecution(c)}>Abrir execução</Button>}</div></div>)}
          {plans.map(x=><div key={x.id} style={{padding:16,border:'1px solid var(--border-default)',borderRadius:12}}><div style={{display:'flex',justifyContent:'space-between'}}><strong>Execução</strong><Badge tone={x.status==='EM_EXECUCAO'?'success':'warning'}>{x.status}</Badge></div><div style={{fontSize:12,color:'var(--text-muted)',marginTop:6}}>Progresso {x.progress_pct}%</div></div>)}
        </div>}
      </Card>
      <Card variant="analysis" padding={24} gap={14}><span style={{fontSize:11,letterSpacing:'.14em',color:'var(--text-subtle)'}}>CRIAR PROPOSTA</span>
        <label style={{display:'grid',gap:6,fontSize:12,color:'var(--text-muted)'}}>Oportunidade elegível<select value={selected} onChange={e=>setSelected(e.target.value)} style={{padding:'11px 12px',borderRadius:9,border:'1px solid var(--border-default)',background:'var(--surface-inset)',color:'var(--text-default)'}}><option value="">Selecione uma oportunidade</option>{eligible.map(b=><option key={b.id} value={b.id}>{b.title}</option>)}</select></label>
        <Input label="Título" value={title} onChange={e=>setTitle(e.target.value)} placeholder="Proposta — oportunidade" />
        <Input label="Valor da proposta" type="number" value={value} onChange={e=>setValue(e.target.value)} />
        <Input label="Margem (%)" type="number" value={margin} onChange={e=>setMargin(e.target.value)} />
        <Button onClick={createProposal} disabled={!selected||busy}>Criar proposta persistida</Button>
        <span style={{fontSize:12,color:'var(--text-subtle)'}}>A conversão para contrato só aparece depois que a proposta existe. A abertura da execução exige um contrato persistido.</span>
      </Card>
    </div>
  </BlockGrid.Auto>;
}
window.OperacaoScreen = OperacaoScreen;
