// Discovery Engine cockpit (Prospects). Every number comes from get_discovery_cockpit /
// discovery_assessments; when a call fails or nothing ran yet the UI says so instead of showing samples.
const DC_STATUS = {
  SUCCESS: ['Atualizado', 'success'], PARTIAL: ['Parcial', 'warning'], ERROR: ['Erro', 'danger'],
  UPSTREAM_UNAVAILABLE: ['Fonte indisponível', 'danger'], NOT_RUN: ['Sem execução', 'neutral'],
};
const DC_DIMS = {
  recurrence: 'Recorrência', valid_results: 'Resultados válidos', contracts: 'Contratos', public_value: 'Valor público',
  segment_fit: 'Aderência ao segmento', complexity: 'Complexidade observável', geographic_diversity: 'Diversidade geográfica', buyer_diversity: 'Diversidade de compradores',
};
const DC_STALE_MS = 12 * 3600 * 1000;
const dcWhen = v => (v ? new Date(v).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' }) : '—');
const dcInt = v => Number(v || 0).toLocaleString('pt-BR');

function DcSource({ s }) {
  const { Tag } = window.VRticeDesignSystem_d763eb;
  const stale = s.last_success_at && Date.now() - new Date(s.last_success_at).getTime() > DC_STALE_MS;
  const [label, tone] = stale && s.last_status === 'SUCCESS' ? ['Desatualizado', 'warning'] : DC_STATUS[s.last_status] || ['Sem execução', 'neutral'];
  const name = s.source === 'COMPRAS_GOV' ? 'Compras.gov (resultados)' : 'PNCP (detalhe da contratação)';
  const hs = s.health_status;
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 4, padding: '10px 0', borderTop: '1px solid var(--border-subtle)' }}>
      <div style={{ display: 'flex', justifyContent: 'space-between', gap: 8, alignItems: 'center' }}>
        <strong style={{ fontSize: 13 }}>{name}</strong><Tag tone={tone}>{label}</Tag>
      </div>
      <span style={{ fontSize: 12, color: 'var(--text-muted)' }}>
        Última execução {dcWhen(s.last_run_at)} · último sucesso {dcWhen(s.last_success_at)}
        {s.last_http_status ? ' · HTTP ' + s.last_http_status : ''}
      </span>
      {s.source === 'COMPRAS_GOV' && s.window_start && (
        <span style={{ fontSize: 12, color: 'var(--text-muted)' }}>
          Janela {s.window_start} → {s.window_end} · próxima página {s.next_page}{s.total_pages != null ? ' de ' + s.total_pages : ''} · {s.status === 'COMPLETE' ? 'ciclo completo' : 'ciclo em andamento'}
        </span>
      )}
      {s.last_error && <span style={{ fontSize: 12, color: 'var(--status-danger-text)' }}>{s.last_error}</span>}
      {s.source === 'PNCP' && (
        <span style={{ fontSize: 12, color: hs && hs !== 'SUCCESS' ? 'var(--status-danger-text)' : 'var(--text-muted)' }}>
          Verificação de saúde: {hs ? (hs === 'SUCCESS' ? 'OK' : hs) + ' · HTTP ' + (s.health_http ?? '—') + ' · ' + dcWhen(s.health_at) : 'não verificada'}
          {s.health_detail ? ' (' + s.health_detail + ')' : ''}. A saúde da API não indica que a ingestão funcionou.
        </span>
      )}
    </div>
  );
}

function DcDetail({ a }) {
  const { Tag } = window.VRticeDesignSystem_d763eb;
  const dims = a.dimensions || {};
  const ev = a.evidence || {};
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 8, paddingTop: 10 }}>
      <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
        <Tag>Confiança dos dados {a.data_confidence}</Tag>
        <Tag tone={ev.contract_confirmed ? 'success' : 'info'}>{ev.contract_confirmed ? 'Contrato confirmado' : 'Resultado encontrado · contrato não confirmado'}</Tag>
        <Tag tone={a.eligible ? 'success' : 'neutral'}>{a.eligible ? 'Elegível à promoção' : 'Não elegível'}</Tag>
      </div>
      {Object.keys(DC_DIMS).map(k => dims[k] && (
        <div key={k} style={{ display: 'flex', justifyContent: 'space-between', gap: 10, fontSize: 12 }}>
          <span>{DC_DIMS[k]}</span>
          <span style={{ ...cxMono, color: 'var(--text-muted)' }}>{dims[k].score}/{dims[k].max} · {Object.entries(dims[k].evidence || {}).filter(([, v]) => v !== null && v !== false && v !== '').map(([n, v]) => n + ': ' + (typeof v === 'number' ? dcInt(v) : String(v))).join(' · ') || 'sem evidência'}</span>
        </div>
      ))}
      {(a.reasons || []).map((r, i) => <span key={i} style={{ fontSize: 12, color: 'var(--status-warning-text, var(--text-muted))' }}>• {r}</span>)}
    </div>
  );
}

function DiscoveryCockpit({ tick, running }) {
  const { Card, Tag, Button, Drawer, EmptyState } = window.VRticeDesignSystem_d763eb;
  const { go } = useShell();
  const [state, setState] = React.useState({ loading: true });
  const [drill, setDrill] = React.useState(null); // {title, filter}
  const [rows, setRows] = React.useState([]);
  const [open, setOpen] = React.useState(null);

  React.useEffect(() => {
    let alive = true;
    setState(s => ({ ...s, loading: true }));
    window.VxSalesIntelligence.discoveryCockpit().then(r => alive && setState({ loading: false, data: r.data, error: r.error }));
    return () => { alive = false; };
  }, [tick]);

  const showRows = async (title, filter) => {
    setDrill({ title, filter }); setOpen(null);
    const r = await window.VxSalesIntelligence.discoveryAssessments();
    setRows(r.data);
  };
  const d = state.data;
  const compras = (d?.sources || []).find(s => s.source === 'COMPRAS_GOV');
  const never = !state.loading && !state.error && (!d || (d.companies === 0 && !(d.sources || []).length));
  const tiles = d ? [
    ['Resultados varridos (última janela)', compras ? dcInt(compras.results_scanned_last_window) : '0'],
    ['Resultados retidos', dcInt(d.results_retained)],
    ['Empresas distintas', dcInt(d.companies)],
    ['Enriquecidas', dcInt(d.enriched)],
    ['ICP A', dcInt(d.grade_a), 'ICP A', a => a.grade === 'A'],
    ['ICP B', dcInt(d.grade_b), 'ICP B', a => a.grade === 'B'],
    ['ICP C', dcInt(d.grade_c), 'ICP C', a => a.grade === 'C'],
    ['Filtradas', dcInt(d.filtered), 'Filtradas (abaixo do corte)', a => a.grade === 'FILTERED'],
    ['Promovidas', dcInt(d.promoted), 'Promovidas', a => !!a.promoted_account_id],
    ['Aguardando promoção', dcInt(d.pending_promotion), 'Elegíveis aguardando promoção', a => a.eligible && !a.promoted_account_id],
    ['Alta prioridade (≥ 80)', dcInt(d.high_priority)],
  ] : [];
  const shown = drill ? rows.filter(drill.filter) : [];

  return (
    <Card variant="flat" padding={14} gap={10}>
      <div style={{ display: 'flex', justifyContent: 'space-between', gap: 12, flexWrap: 'wrap', alignItems: 'baseline' }}>
        <span style={{ ...vxEyebrow }}>DISCOVERY ENGINE · INTELIGÊNCIA PÚBLICA</span>
        <span style={{ fontSize: 12, color: 'var(--text-muted)' }}>
          {running ? 'Varredura em andamento…' : d?.last_scored_at ? 'Último cálculo de ICP ' + dcWhen(d.last_scored_at) : 'Nenhum cálculo de ICP ainda'}
        </span>
      </div>
      {state.loading && !d && <span style={{ fontSize: 13, color: 'var(--text-muted)' }}>Carregando contagens reais…</span>}
      {state.error && <span style={{ fontSize: 12, color: 'var(--text-muted)', display: 'flex', gap: 6, alignItems: 'center' }}><i className="ph ph-warning" />Não foi possível carregar o cockpit: {state.error}</span>}
      {never && <span style={{ fontSize: 12, color: 'var(--text-muted)' }}>Nenhuma varredura executada ainda. Use “Atualizar inteligência” para varrer os resultados públicos recentes.</span>}
      {d && !never && (
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(112px,1fr))', gap: 8 }}>
          {tiles.map(([label, value, title, filter]) => {
            const inner = <><span style={{ fontSize: 16, fontWeight: 700, lineHeight: 1.1, ...cxMono }}>{value}</span><span style={{ fontSize: 11, lineHeight: 1.25, color: 'var(--text-muted)' }}>{label}</span></>;
            const style = { display: 'flex', flexDirection: 'column', gap: 1, padding: '8px 10px', borderRadius: 10, border: '1px solid var(--border-subtle)', background: 'var(--surface-raised, transparent)', textAlign: 'left' };
            // Only tiles that can drill into rows are interactive; the rest are plain facts.
            return filter
              ? <button key={label} type="button" className="vx-chip" style={style} onClick={() => showRows(title, filter)}>{inner}</button>
              : <div key={label} style={style}>{inner}</div>;
          })}
        </div>
      )}
      {d && d.companies === 0 && !never && <span style={{ fontSize: 13, color: 'var(--text-muted)' }}>A última varredura não encontrou fornecedores com resultados válidos na janela.</span>}
      {d && (d.sources || []).length > 0 && <details><summary style={{ cursor: 'pointer', fontSize: 12, color: 'var(--text-muted)' }}>Fontes de dados ({d.sources.length})</summary><div style={{ marginTop: 8 }}>{d.sources.map(s => <DcSource key={s.source} s={s} />)}</div></details>}
      {drill && (
        <Drawer kicker="Discovery Engine" title={drill.title} subtitle={shown.length + ' empresas'} width={560} onClose={() => setDrill(null)}>
          {!shown.length && <EmptyState variant="block" icon="ph-magnifying-glass" title="Nenhuma empresa neste grupo">Nada foi classificado aqui na última varredura.</EmptyState>}
          {shown.map(a => (
            <div key={a.id} style={{ padding: '12px 0', borderTop: '1px solid var(--border-subtle)' }}>
              <div style={{ display: 'flex', justifyContent: 'space-between', gap: 10, alignItems: 'center' }}>
                <span style={{ display: 'flex', flexDirection: 'column', gap: 2, minWidth: 0 }}>
                  <strong style={{ fontSize: 14 }}>{a.name || a.cnpj}</strong>
                  <span style={{ ...cxMono, fontSize: 11, color: 'var(--text-subtle)' }}>{a.cnpj} · {a.uf || '—'} · CNAE {a.cnae || '—'}</span>
                </span>
                <span style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
                  <Tag>ICP {a.icp_score} · {a.grade === 'FILTERED' ? 'Filtrada' : a.grade}</Tag>
                  <Button size="sm" variant="secondary" onClick={() => setOpen(open === a.id ? null : a.id)}>{open === a.id ? 'Ocultar' : 'Evidências'}</Button>
                  {a.promoted_account_id && <Button size="sm" variant="link" onClick={() => { setDrill(null); go('prospect', { id: a.promoted_account_id }); }}>Abrir prospect</Button>}
                </span>
              </div>
              {open === a.id && <DcDetail a={a} />}
            </div>
          ))}
        </Drawer>
      )}
    </Card>
  );
}
window.DiscoveryCockpit = DiscoveryCockpit;
