// modules-core.jsx — Dashboard, Analysis, Opportunities, Acquisitions, Maintenance
window.NA = window.NA || {};
window.NA.M = window.NA.M || {};
const { useState: useStateC, useEffect: useEffectC, useMemo: useMemoC, useRef: useRefC } = React;
const _na = window.NA;

// ============================================================
// DASHBOARD — Indicadores
// ============================================================
function ModuleDashboard({ t, lang }) {
  const [range, setRange] = useStateC("30d");
  const vehicles = _na.vehicles;
  const stocked = vehicles.filter(v => ["in_stock", "overdue", "in_settlement", "settled"].includes(v.status));
  const stockedTotal = stocked.reduce((s, v) => s + v.purchasePrice, 0);
  const oppValueOpen = stocked.reduce((s, v) => s + v.clientValue, 0);
  const soldTotal = vehicles.filter(v => v.status === "sold").reduce((s, v) => s + (v.clientValue || v.purchasePrice * 1.15), 0);
  const revenue = 552283.90, expenses = 9004.00, profit = revenue - expenses;

  const cashflow = [
    { label: "Dez/01", value: 35000, color: "var(--color-success)" },
    { label: "Jan", value: 18000, color: "var(--color-success)" },
    { label: "Fev", value: 22000, color: "var(--color-success)" },
    { label: "Mar", value: 12000, color: "var(--color-success)" },
    { label: "Abr/26", value: 180000, color: "var(--color-success)" },
    { label: "Mai/26", value: 540000, color: "var(--color-success)" },
  ];
  const monthProfit = [
    { label: "Abr", value: 0 }, { label: "26", value: 4500 }, { label: "Mai", value: 12000 },
    { label: "10", value: 16500 }, { label: "20", value: 21000 }, { label: "26", value: 24500 },
  ];
  const bankRanking = [
    { label: "BV", value: 6280 }, { label: "Digimais", value: 4280 }, { label: "PAM", value: 2180 }
  ];

  return (
    <div data-screen-label="Dashboard">
      <_na.PageHead icon="layout-dashboard" title={t("nav_dashboard")}
        subtitle={lang === "pt" ? "Visão executiva — receitas, estoque e oportunidades" : "Executive view — revenue, stock and opportunities"}
        right={
          <_na.Segmented value={range} onChange={setRange} options={[
            { value: "7d", label: "7d" }, { value: "30d", label: "30d" }, { value: "90d", label: "90d" }, { value: "mtd", label: lang === "pt" ? "Este mês" : "MTD" }
          ]} />
        }
      />

      {/* Top stats */}
      <div className="stat-strip" style={{ gridTemplateColumns: "repeat(3, 1fr)" }}>
        <_na.Stat label={lang === "pt" ? "Investimento parado em estoque" : "Capital tied in stock"} icon="archive"
          value={stockedTotal} isMoney lang={lang} accent="primary"
          hint={lang === "pt" ? "Aquisições fechadas ainda não vendidas" : "Acquisitions not yet sold"} />
        <_na.Stat label={lang === "pt" ? "Valor das oportunidades" : "Opportunities value"} icon="trending-up"
          value={oppValueOpen} isMoney lang={lang}
          hint={lang === "pt" ? "Soma de valor ao cliente em aberto" : "Sum of open client values"} />
        <_na.Stat label={lang === "pt" ? "Receita de vendas concretizadas" : "Closed sales revenue"} icon="check-circle"
          value={soldTotal} isMoney lang={lang} accent="success"
          delta="+18% vs 30d" deltaDir="up" />
      </div>

      {/* Cash control */}
      <div className="card" style={{ marginTop: 16 }}>
        <_na.CardHead title={lang === "pt" ? "Controle de caixa" : "Cash control"} icon="landmark"
          right={<span className="chip">{lang === "pt" ? "em tempo real" : "live"}</span>} />
        <_na.CardBody>
          <div className="stat-strip" style={{ gridTemplateColumns: "repeat(3, 1fr)", marginBottom: 16 }}>
            <_na.Stat label={lang === "pt" ? "Receitas (bruto)" : "Revenue (gross)"} value={revenue} isMoney lang={lang} accent="success" icon="arrow-up-right" />
            <_na.Stat label={lang === "pt" ? "Despesas totais" : "Total expenses"} value={expenses} isMoney lang={lang} accent="error" icon="arrow-down-right" />
            <_na.Stat label={lang === "pt" ? "Lucro real (sobrou)" : "Net profit"} value={profit} isMoney lang={lang} accent="success" icon="check" />
          </div>
          <_na.Tabs tabs={[
            { key: "all", label: lang === "pt" ? "Visão geral" : "Overview" },
            { key: "in", label: lang === "pt" ? "Receitas" : "Revenue" },
            { key: "out", label: lang === "pt" ? "Despesas" : "Expenses" },
            { key: "last", label: lang === "pt" ? "Últimos lançamentos" : "Last entries" },
          ]} active="all" onChange={() => {}} />
          <_na.BarChart data={cashflow} height={160} />
          <div style={{ display: "flex", gap: 16, marginTop: 12, fontSize: 11, color: "var(--fg2)" }}>
            <span><span style={{ display: "inline-block", width: 10, height: 10, background: "var(--color-success)", borderRadius: 2, marginRight: 6, verticalAlign: "middle" }}></span>{lang === "pt" ? "Receitas" : "Revenue"}</span>
            <span><span style={{ display: "inline-block", width: 10, height: 10, background: "var(--color-error)", borderRadius: 2, marginRight: 6, verticalAlign: "middle" }}></span>{lang === "pt" ? "Despesas" : "Expenses"}</span>
          </div>
        </_na.CardBody>
      </div>

      {/* Secondary stats */}
      <div className="stat-strip" style={{ gridTemplateColumns: "repeat(4, 1fr)", marginTop: 16 }}>
        <_na.Stat label={lang === "pt" ? "Oportunidades" : "Opportunities"} value={6} icon="trending-up" />
        <_na.Stat label={lang === "pt" ? "Ticket médio" : "Avg ticket"} value={133820.97} isMoney lang={lang} icon="receipt"
          hint={lang === "pt" ? "4 venda(s) realizadas" : "4 sale(s) closed"} />
        <_na.Stat label={lang === "pt" ? "Lucro acumulado" : "Cumulative profit"} value={24499.75} isMoney lang={lang} icon="award" accent="success" />
        <_na.Stat label={lang === "pt" ? "Melhor banco" : "Top bank"} value="BV" icon="trophy"
          hint={lang === "pt" ? "Média R$ 4.454,19" : "Avg $4,454.19"} />
      </div>

      {/* Two charts */}
      <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12, marginTop: 16 }}>
        <_na.Card>
          <_na.CardHead title={lang === "pt" ? "Por status" : "By status"} icon="layers" />
          <_na.CardBody>
            <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
              <StatusBar label={lang === "pt" ? "Excelentes" : "Excellent"} value={4} total={6} color="var(--color-success)" />
              <StatusBar label={lang === "pt" ? "Apertadas" : "Tight"} value={2} total={6} color="var(--color-warning)" />
              <StatusBar label={lang === "pt" ? "Prejuízo" : "Loss"} value={0} total={6} color="var(--color-error)" />
            </div>
          </_na.CardBody>
        </_na.Card>
        <_na.Card>
          <_na.CardHead title={lang === "pt" ? "Evolução mensal de lucro" : "Monthly profit evolution"} icon="line-chart" />
          <_na.CardBody>
            <_na.LineChart data={monthProfit} color="var(--preset-orange)" height={160} />
          </_na.CardBody>
        </_na.Card>
      </div>

      <_na.Card style={{ marginTop: 16 }}>
        <_na.CardHead title={lang === "pt" ? "Ranking de bancos por lucro médio" : "Bank ranking by avg profit"} icon="trophy" />
        <_na.CardBody>
          {bankRanking.map(b => (
            <div key={b.label} style={{ display: "grid", gridTemplateColumns: "100px 1fr 80px", gap: 12, alignItems: "center", marginBottom: 10 }}>
              <span style={{ fontWeight: 500, fontSize: 13 }}>{b.label}</span>
              <_na.Progress value={(b.value / 6280) * 100} kind="warning" height={20} />
              <span className="mono" style={{ fontSize: 12, textAlign: "right" }}>{_na.fmtMoney(b.value, lang)}</span>
            </div>
          ))}
        </_na.CardBody>
      </_na.Card>
    </div>
  );
}
function StatusBar({ label, value, total, color }) {
  const pct = total ? (value / total) * 100 : 0;
  return (
    <div>
      <div style={{ display: "flex", justifyContent: "space-between", fontSize: 12, marginBottom: 4 }}>
        <span>{label}</span>
        <span className="mono"><b>{value}</b> ({pct.toFixed(0)}%)</span>
      </div>
      <div className="progress" style={{ height: 8 }}>
        <div className="bar" style={{ width: pct + "%", background: color }}></div>
      </div>
    </div>
  );
}
window.NA.M.dashboard = ModuleDashboard;

// ============================================================
// ANALYSIS — a definição real vive em module-analysis.jsx (v2)
// A versão legada foi removida daqui para evitar conflito de registro.
// ============================================================
function _ModuleAnalysisLegacy_REMOVED({ t, lang }) {
  const [vehType, setVehType] = useStateC("car");
  const [plate, setPlate] = useStateC("");
  const [bank, setBank] = useStateC("");
  const [valParcela, setValParcela] = useStateC(0);
  const [parcelasTot, setParcelasTot] = useStateC(0);
  const [parcelasPagas, setParcelasPagas] = useStateC(0);
  const [parcelasAtraso, setParcelasAtraso] = useStateC(0);
  const [valCliente, setValCliente] = useStateC(0);
  const [pagoCliente, setPagoCliente] = useStateC(0);
  const [extras, setExtras] = useStateC({
    ipva: 0, multas: 0, cartorio: 0, mecanica: 0, funilaria: 0, eletrica: 0,
    comissao: 0, gasolina: 0, pedagio: 0, alimentacao: 0
  });
  const [fipe, setFipe] = useStateC(0);
  const [margin, setMargin] = useStateC(50);

  const overdueAlerts = _na.vehicles.filter(v => v.status === "overdue").slice(0, 5);

  const sumExtras = Object.values(extras).reduce((s, n) => s + (Number(n) || 0), 0);
  const parcelsRem = Math.max(0, Number(parcelasTot) - Number(parcelasPagas));
  const totalQuit = parcelsRem * Number(valParcela);
  const venda = fipe * (1 - margin / 100);
  const inv = Number(valCliente) + sumExtras + totalQuit;
  const lucroEst = venda - inv;
  const lucroPosVenda = fipe ? (venda - inv) : 0;

  const updateExtra = (k, v) => setExtras(e => ({ ...e, [k]: Number(v) || 0 }));

  return (
    <div data-screen-label="Analysis">
      <_na.PageHead icon="calculator" title={lang === "pt" ? "Análise de oportunidade" : "Opportunity analysis"}
        subtitle={lang === "pt" ? "Calcule lucro, sugestão de compra e veredicto em tempo real" : "Compute profit, buy suggestion and verdict in real time"} />

      {overdueAlerts.length > 0 && (
        <div className="alert error" style={{ marginBottom: 16 }}>
          <_na.Icon name="alert-triangle" />
          <div className="body">
            <strong>{lang === "pt" ? `Atenção — ${overdueAlerts.length} veículo(s) precisam de ação` : `${overdueAlerts.length} vehicle(s) need action`}</strong>
            <div style={{ display: "flex", flexDirection: "column", gap: 4, marginTop: 6, fontSize: 12, color: "var(--fg2)" }}>
              {overdueAlerts.map(v => (
                <div key={v.id} style={{ display: "flex", gap: 12 }}>
                  <span className="mono" style={{ fontWeight: 600 }}>{v.plate}</span>
                  <span>{v.brand} {v.model}</span>
                  <span style={{ color: "var(--color-error)" }}>— {lang === "pt" ? "Quitação em ATRASO" : "Settlement OVERDUE"} ({v.parcels.overdue} parc.)</span>
                </div>
              ))}
            </div>
            <a href="#" style={{ fontSize: 12, marginTop: 8, display: "inline-block" }}>{lang === "pt" ? "Abrir aquisições →" : "Open acquisitions →"}</a>
          </div>
        </div>
      )}

      <div style={{ display: "grid", gridTemplateColumns: "1fr 380px", gap: 16 }}>
        {/* LEFT: form */}
        <div className="col" style={{ gap: 16 }}>
          <_na.Card>
            <_na.CardHead title={lang === "pt" ? "Consulta de veículo" : "Vehicle lookup"} icon="search" />
            <_na.CardBody>
              <div style={{ display: "flex", gap: 6, marginBottom: 16 }}>
                {[
                  { key: "car", icon: "car", label: lang === "pt" ? "Carros" : "Cars" },
                  { key: "moto", icon: "bike", label: lang === "pt" ? "Motos" : "Motos" },
                  { key: "truck", icon: "truck", label: lang === "pt" ? "Caminhões" : "Trucks" },
                  { key: "jet", icon: "anchor", label: "Jet-Ski" },
                  { key: "plane", icon: "plane", label: lang === "pt" ? "Aviões" : "Planes" },
                ].map(o => (
                  <button key={o.key} onClick={() => setVehType(o.key)}
                    className={"btn " + (vehType === o.key ? "primary" : "default")}>
                    <_na.Icon name={o.icon} size={14} />{o.label}
                  </button>
                ))}
              </div>
              <div className="field-row" style={{ gridTemplateColumns: "1fr 1fr" }}>
                <button className="btn primary lg" style={{ height: 42, justifyContent: "center" }}>
                  <_na.Icon name="zap" size={14} />{lang === "pt" ? "Pela placa (APIBrasil)" : "By plate (API)"}
                </button>
                <button className="btn default lg" style={{ height: 42, justifyContent: "center" }}>
                  <_na.Icon name="table-2" size={14} />{lang === "pt" ? "Tabela FIPE manual" : "FIPE manual"}
                </button>
              </div>
              <div className="field-row" style={{ gridTemplateColumns: "1fr auto auto auto", marginTop: 12, alignItems: "end" }}>
                <_na.Field label={t("common_plate")}>
                  <_na.Input mono placeholder="ABC1D23" value={plate} onChange={setPlate} />
                </_na.Field>
                <_na.Button kind="default" icon="eye">Pré-visualizar</_na.Button>
                <_na.Button kind="primary" icon="zap">Consultar</_na.Button>
                <_na.Button kind="default" icon="plus-circle">Créditos</_na.Button>
              </div>
              <div className="hint" style={{ marginTop: 8 }}>
                {lang === "pt"
                  ? "Pré-visualizar não gasta crédito mas retorna um veículo de exemplo. Para dados reais use Consultar."
                  : "Preview doesn't spend credit but returns sample data. For live data use Lookup."}
              </div>
            </_na.CardBody>
          </_na.Card>

          <_na.Card>
            <_na.CardHead title={lang === "pt" ? "Financiamento" : "Financing"} icon="credit-card" />
            <_na.CardBody>
              <div className="field-row" style={{ marginBottom: 12 }}>
                <_na.Field label={t("common_bank")} required>
                  <_na.Select value={bank} onChange={setBank} placeholder={lang === "pt" ? "Selecione o banco" : "Select bank"}
                    options={["BV", "Santander", "Bradesco", "Itaú", "Digimais", "PAM", "Aymoré"]} />
                </_na.Field>
                <_na.Field label={lang === "pt" ? "Valor da parcela (R$)" : "Installment value"}>
                  <_na.Input mono value={valParcela} onChange={v => setValParcela(Number(v) || 0)} type="number" />
                </_na.Field>
              </div>
              <div className="field-row cols-3">
                <_na.Field label={lang === "pt" ? "Total parcelas" : "Total installments"}>
                  <_na.Input mono value={parcelasTot} onChange={v => setParcelasTot(Number(v) || 0)} type="number" />
                </_na.Field>
                <_na.Field label={lang === "pt" ? "Parcelas pagas" : "Paid"}>
                  <_na.Input mono value={parcelasPagas} onChange={v => setParcelasPagas(Number(v) || 0)} type="number" />
                </_na.Field>
                <_na.Field label={lang === "pt" ? "Em atraso" : "Overdue"}>
                  <_na.Input mono value={parcelasAtraso} onChange={v => setParcelasAtraso(Number(v) || 0)} type="number" />
                </_na.Field>
              </div>

              <div style={{ marginTop: 16, padding: 12, background: "var(--color-warning-bg)", border: "1px solid var(--color-warning-border)", borderRadius: 6 }}>
                <div style={{ display: "flex", alignItems: "center", gap: 6, marginBottom: 10 }}>
                  <_na.Icon name="receipt-text" size={14} style={{ color: "var(--gold-7)" }} />
                  <strong style={{ fontSize: 13, color: "var(--gold-7)" }}>{lang === "pt" ? "Custos extras do veículo" : "Extra vehicle costs"}</strong>
                  <span className="text-faint fs-11" style={{ marginLeft: "auto" }}>{lang === "pt" ? "Tudo que sair do bolso entra aqui" : "Everything out-of-pocket goes here"}</span>
                </div>
                <div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 8 }}>
                  {[
                    ["ipva", "IPVA"], ["multas", lang === "pt" ? "Multas" : "Fines"], ["cartorio", lang === "pt" ? "Cartório" : "Notary"],
                    ["mecanica", lang === "pt" ? "Mecânica" : "Mechanic"], ["funilaria", lang === "pt" ? "Funilaria" : "Bodywork"], ["eletrica", lang === "pt" ? "Elétrica" : "Electrical"],
                    ["comissao", lang === "pt" ? "Comissão" : "Commission"], ["gasolina", lang === "pt" ? "Gasolina" : "Fuel"], ["pedagio", lang === "pt" ? "Pedágio" : "Toll"],
                    ["alimentacao", lang === "pt" ? "Alimentação" : "Meals"],
                  ].map(([k, label]) => (
                    <_na.Field key={k} label={label}>
                      <_na.Input mono type="number" value={extras[k]} onChange={v => updateExtra(k, v)} />
                    </_na.Field>
                  ))}
                </div>
                <div style={{ display: "flex", justifyContent: "space-between", marginTop: 12, fontSize: 13, paddingTop: 8, borderTop: "1px dashed var(--color-warning-border)" }}>
                  <span style={{ color: "var(--fg2)" }}>{lang === "pt" ? "Total de custos extras" : "Total extras"}</span>
                  <_na.Money value={sumExtras} lang={lang} className="fw-600" />
                </div>
              </div>

              <_na.Field style={{ marginTop: 12 }} label={lang === "pt" ? "Anotações" : "Notes"}>
                <_na.Textarea placeholder={lang === "pt" ? "Observações sobre a negociação…" : "Notes about the deal…"} />
              </_na.Field>
            </_na.CardBody>
          </_na.Card>
        </div>

        {/* RIGHT: live verdict */}
        <div className="col" style={{ gap: 12 }}>
          <_na.Card style={{ background: "var(--color-warning-bg)", borderColor: "var(--color-warning-border)" }}>
            <_na.CardBody style={{ padding: 12, textAlign: "center" }}>
              <div className="fs-11 fw-600" style={{ color: "var(--gold-7)", letterSpacing: "0.06em", textTransform: "uppercase" }}>
                {lucroEst > 5000 ? (lang === "pt" ? "Margem confortável" : "Comfortable margin") :
                 lucroEst > 0 ? (lang === "pt" ? "Margem apertada" : "Tight margin") :
                 (lang === "pt" ? "Sem margem" : "No margin")}
              </div>
            </_na.CardBody>
          </_na.Card>

          <VerdictCard label={lang === "pt" ? "Quitação no banco" : "Bank settlement"} value={totalQuit} lang={lang}
            icon="building" hint={lang === "pt" ? "Selecione o banco" : "Select a bank"} accent="success" />
          <_na.Card padded>
            <div className="row" style={{ marginBottom: 8 }}>
              <_na.Icon name="user" size={14} style={{ color: "var(--fg3)" }} />
              <span className="fs-11 text-muted">{lang === "pt" ? "Valor ao cliente" : "Client value"}</span>
            </div>
            <_na.Money value={valCliente} lang={lang} style={{ fontSize: 22, fontWeight: 500 }} />
            <div className="row" style={{ marginTop: 12, gap: 8 }}>
              <_na.Field label={lang === "pt" ? "Valor real pago" : "Actually paid"} style={{ flex: 1 }}>
                <_na.Input mono type="number" value={pagoCliente} onChange={v => setPagoCliente(Number(v) || 0)} />
              </_na.Field>
              <_na.Field label="" style={{ flex: 1 }}>
                <_na.Input mono type="number" value={valCliente} onChange={v => setValCliente(Number(v) || 0)} />
              </_na.Field>
            </div>
            <div className="hint" style={{ marginTop: 6 }}>
              {lang === "pt" ? "Pague até este valor para garantir margem (ou edite com o valor real)" : "Pay up to this value to lock margin"}
            </div>
          </_na.Card>

          <_na.Card padded>
            <div className="fs-11 text-muted mb-8">{lang === "pt" ? "Venda meia FIPE" : "Sell at mid FIPE"}</div>
            <div className="row jcsb" style={{ alignItems: "baseline" }}>
              <_na.Money value={fipe} lang={lang} style={{ fontSize: 22, fontWeight: 500 }} />
              <span className="fs-11 text-faint">FIPE − {margin}%</span>
            </div>
            <_na.Field label="FIPE" style={{ marginTop: 8 }}>
              <_na.Input mono type="number" value={fipe} onChange={v => setFipe(Number(v) || 0)} />
            </_na.Field>
            <_na.Field label={lang === "pt" ? "Margem (%)" : "Margin (%)"} style={{ marginTop: 8 }}>
              <_na.Input mono type="number" value={margin} onChange={v => setMargin(Number(v) || 0)} />
            </_na.Field>
          </_na.Card>

          <VerdictCard label={lang === "pt" ? "Lucro estimado (antes da quitação)" : "Estimated profit (pre-settlement)"}
            value={venda - Number(valCliente) - sumExtras} lang={lang} icon="trending-up"
            hint={lang === "pt" ? "Venda mais FIPE − valor pago ao cliente − gastos" : "Sell − client paid − costs"} accent="success" />

          <_na.Card padded style={{ background: "var(--color-fill-quaternary)" }}>
            <div className="fs-11 fw-600 mb-8" style={{ color: "var(--fg2)", textTransform: "uppercase", letterSpacing: "0.06em" }}>
              {lang === "pt" ? "Resumo da operação" : "Deal summary"}
            </div>
            <div className="col" style={{ gap: 4, fontSize: 12 }}>
              <div className="row jcsb"><span className="text-muted">{lang === "pt" ? "Pago ao cliente" : "Client paid"}</span><_na.Money value={pagoCliente} lang={lang} /></div>
              <div className="row jcsb"><span className="text-muted">+ {lang === "pt" ? "Gastos de aquisição" : "Acquisition costs"}</span><_na.Money value={sumExtras} lang={lang} /></div>
              <div className="row jcsb"><span className="text-muted">+ {lang === "pt" ? "Quitação do banco" : "Bank payoff"}</span><_na.Money value={totalQuit} lang={lang} /></div>
              <div className="row jcsb" style={{ borderTop: "1px dashed var(--color-border)", paddingTop: 6, marginTop: 4 }}>
                <strong>= {lang === "pt" ? "Investimento total" : "Total investment"}</strong><_na.Money value={inv} lang={lang} className="fw-600" />
              </div>
            </div>
            <div style={{ marginTop: 8, borderTop: "1px dashed var(--color-border)", paddingTop: 8 }}>
              <div className="row jcsb fs-12"><span className="text-muted">{lang === "pt" ? "Possível valor de venda" : "Possible sale price"}</span><_na.Money value={venda} lang={lang} /></div>
            </div>
          </_na.Card>

          <_na.Card padded style={{ background: lucroPosVenda > 0 ? "var(--color-success-bg)" : "var(--color-error-bg)", borderColor: lucroPosVenda > 0 ? "var(--color-success-border)" : "var(--color-error-border)" }}>
            <div className="fs-11 fw-600 mb-8" style={{ color: lucroPosVenda > 0 ? "var(--green-7)" : "var(--red-7)", textTransform: "uppercase" }}>
              {lang === "pt" ? "Lucro após a venda" : "Profit after sale"}
            </div>
            <_na.Money value={lucroPosVenda} lang={lang} style={{ fontSize: 26, fontWeight: 600, color: lucroPosVenda > 0 ? "var(--color-success)" : "var(--color-error)" }} />
            <div className="hint mt-8">{lang === "pt" ? "Valor de venda − investimento total" : "Sale value − total investment"}</div>
          </_na.Card>

          <div className="hint" style={{ textAlign: "center" }}>
            {lang === "pt" ? "Preencha marca, modelo, ano, banco, FIPE e parcelas para salvar." : "Fill brand, model, year, bank, FIPE and installments to save."}
          </div>
          <_na.Button kind="default" icon="refresh-ccw">Recalcular</_na.Button>
          <_na.Button kind="default" icon="bookmark">{lang === "pt" ? "Salvar pendente" : "Save as pending"}</_na.Button>
          <_na.Button kind="primary" icon="check">{lang === "pt" ? "Salvar e fechar" : "Save and close"}</_na.Button>
        </div>
      </div>
    </div>
  );
}
function VerdictCard({ label, value, lang, icon, hint, accent }) {
  const bg = accent === "success" ? "var(--color-success-bg)" : "var(--color-warning-bg)";
  const bd = accent === "success" ? "var(--color-success-border)" : "var(--color-warning-border)";
  return (
    <_na.Card padded style={{ background: bg, borderColor: bd }}>
      <div className="row" style={{ marginBottom: 6 }}>
        <_na.Icon name={icon} size={14} style={{ color: "var(--fg3)" }} />
        <span className="fs-11 text-muted">{label}</span>
      </div>
      <_na.Money value={value} lang={lang} style={{ fontSize: 22, fontWeight: 500 }} />
      {hint && <div className="hint mt-8">{hint}</div>}
    </_na.Card>
  );
}
// Registro legado removido — ModuleAnalysis real é registrado por module-analysis.jsx

// ============================================================
// OPPORTUNITIES — Oportunidades Salvas
// ============================================================
function ModuleOpportunities({ t, lang, setT }) {
  const [q, setQ] = useStateC("");
  const [status, setStatus] = useStateC("all");
  const [brand, setBrand] = useStateC("all");
  const [dateFrom, setDateFrom] = useStateC("");
  const [dateTo, setDateTo] = useStateC("");
  const [rows, setRows] = useStateC([]);
  const [loading, setLoading] = useStateC(true);
  const [error, setError] = useStateC("");
  const [importMsg, setImportMsg] = useStateC("");
  const [acceptRow, setAcceptRow] = useStateC(null);
  const [sellerForm, setSellerForm] = useStateC({ name: "", cpf: "", phone: "", email: "" });
  const [statusSaving, setStatusSaving] = useStateC(false);

  const loadRows = async () => {
    if (!_na.db?.isConfigured()) { setRows([]); setLoading(false); return; }
    setLoading(true);
    setError("");
    try {
      const filters = { dateFrom, dateTo };
      if (status !== "all" && status !== "pending") filters.status = status;
      const data = await _na.db.listAnalyses(filters);
      let list = data.map(r => _na.db.rowToLegacyListItem(r));
      if (status === "pending") {
        list = list.filter(o => ["draft", "pending"].includes(o.analysisStatus));
      } else if (status !== "all") {
        list = list.filter(o => o.analysisStatus === status);
      }
      setRows(list);
    } catch (err) {
      setError(err.message || String(err));
      setRows([]);
    } finally {
      setLoading(false);
    }
  };

  useEffectC(() => { loadRows(); }, [status, dateFrom, dateTo]);

  useEffectC(() => {
    const onRefresh = () => loadRows();
    window.addEventListener("na:analyses-changed", onRefresh);
    return () => window.removeEventListener("na:analyses-changed", onRefresh);
  }, [status, dateFrom, dateTo]);

  const opps = rows;
  const filtered = opps.filter(o => {
    if (q && !(o.plate.toLowerCase().includes(q.toLowerCase()) || o.brand.toLowerCase().includes(q.toLowerCase()) || o.model.toLowerCase().includes(q.toLowerCase()))) return false;
    if (brand !== "all" && o.brand !== brand) return false;
    return true;
  });
  const brands = [...new Set(opps.map(o => o.brand).filter(Boolean))];

  const openRow = (o) => {
    if (setT) setT({ module: "analysis", analysisId: o.id });
  };

  const deleteRow = async (o, e) => {
    e.stopPropagation();
    if (!confirm(lang === "pt" ? "Excluir esta análise?" : "Delete this analysis?")) return;
    try {
      await _na.db.deleteAnalysis(o.id);
      window.dispatchEvent(new Event("na:analyses-changed"));
      loadRows();
    } catch (err) {
      alert(err.message);
    }
  };

  const isPending = (o) => ["draft", "pending"].includes(o.analysisStatus);

  const openAcceptModal = (o, e) => {
    e.stopPropagation();
    setAcceptRow(o);
    setSellerForm({
      name: o.sellerName || "",
      cpf: o.sellerCpf || "",
      phone: o.sellerPhone || "",
      email: o.sellerEmail || "",
    });
  };

  const confirmAccept = async () => {
    if (!acceptRow) return;
    if (!(sellerForm.name || "").trim()) {
      alert(lang === "pt" ? "Informe o nome do vendedor." : "Enter the seller name.");
      return;
    }
    setStatusSaving(true);
    try {
      await _na.db.updateAnalysisStatus(acceptRow.id, "approved", sellerForm);
      setAcceptRow(null);
      window.dispatchEvent(new Event("na:analyses-changed"));
      loadRows();
    } catch (err) {
      alert(err.message);
    } finally {
      setStatusSaving(false);
    }
  };

  const rejectRow = async (o, e) => {
    e.stopPropagation();
    if (!confirm(lang === "pt" ? "Marcar esta oportunidade como recusada?" : "Mark this opportunity as rejected?")) return;
    try {
      await _na.db.updateAnalysisStatus(o.id, "rejected");
      window.dispatchEvent(new Event("na:analyses-changed"));
      loadRows();
    } catch (err) {
      alert(err.message);
    }
  };

  const exportCsv = () => {
    const header = ["placa", "marca", "modelo", "ano", "banco", "fipe", "lucro", "roi", "status", "atualizado"];
    const lines = filtered.map(o => [
      o.plate, o.brand, o.model, o.year, o.bank, o.fipeMax, o.expectedProfit, o.roi, o.analysisStatus || o.status, o.savedAt,
    ].map(v => `"${String(v ?? "").replace(/"/g, '""')}"`).join(","));
    const blob = new Blob([[header.join(","), ...lines].join("\n")], { type: "text/csv;charset=utf-8" });
    const a = document.createElement("a");
    a.href = URL.createObjectURL(blob);
    a.download = "oportunidades-northauto.csv";
    a.click();
  };

  const importLocal = async () => {
    try {
      const res = await _na.db.importLocalAnalyses();
      setImportMsg(lang === "pt" ? `${res.imported} análise(s) importada(s).` : `${res.imported} analysis(es) imported.`);
      window.dispatchEvent(new Event("na:analyses-changed"));
      loadRows();
    } catch (err) {
      alert(err.message);
    }
  };

  const hasLocal = (() => {
    try { return JSON.parse(localStorage.getItem("nau_analyses") || "[]").length > 0; } catch (e) { return false; }
  })();

  const cols = _na.vehicleTableColumnsOpportunities(t, lang);
  cols[cols.length - 2] = {
    key: "profit", label: lang === "pt" ? "Lucro est." : "Est. profit",
    render: (o, l) => <_na.Money value={o.expectedProfit} lang={l} className="mono text-success" />,
  };
  cols.push({
    key: "actions", label: "",
    render: (o) => (
      <div className="row gap-4" onClick={e => e.stopPropagation()}>
        {isPending(o) && (
          <>
            <_na.Button kind="primary" size="sm" icon="check" onClick={(e) => openAcceptModal(o, e)}>
              {lang === "pt" ? "Aceitar" : "Accept"}
            </_na.Button>
            <_na.Button kind="default" size="sm" icon="x" onClick={(e) => rejectRow(o, e)}>
              {lang === "pt" ? "Recusar" : "Reject"}
            </_na.Button>
          </>
        )}
        <_na.Button kind="ghost" size="sm" icon="trash-2" onClick={(e) => deleteRow(o, e)} />
      </div>
    ),
  });

  if (!_na.db?.isConfigured()) {
    return (
      <div className="empty" style={{ padding: 48 }}>
        <h3>{lang === "pt" ? "Supabase não configurado" : "Supabase not configured"}</h3>
      </div>
    );
  }

  return (
    <div data-screen-label="Opportunities">
      <_na.PageHead icon="history" title={lang === "pt" ? "Oportunidades salvas" : "Saved opportunities"}
        right={<div className="row gap-8">
          {hasLocal && (
            <_na.Button kind="ghost" icon="upload" onClick={importLocal}>{lang === "pt" ? "Importar local" : "Import local"}</_na.Button>
          )}
          <_na.Button kind="default" icon="download" onClick={exportCsv}>{lang === "pt" ? "Exportar CSV" : "Export CSV"}</_na.Button>
          <_na.Button kind="primary" icon="plus" onClick={() => setT && setT({ module: "analysis", analysisId: null })}>{lang === "pt" ? "Nova análise" : "New analysis"}</_na.Button>
        </div>} />

      {importMsg && <div className="alert success" style={{ marginBottom: 12 }}><div className="body">{importMsg}</div></div>}
      {error && <div className="alert error" style={{ marginBottom: 12 }}><div className="body">{error}</div></div>}

      <_na.Card>
        <_na.CardBody>
          {loading ? (
            <div className="empty"><p>{lang === "pt" ? "Carregando…" : "Loading…"}</p></div>
          ) : (
          <_na.VehicleTable
            vehicles={filtered}
            columns={cols}
            lang={lang}
            t={t}
            onRowClick={openRow}
            countLabel={`${filtered.length} ${lang === "pt" ? "de" : "of"} ${opps.length} ${lang === "pt" ? "análise(s)" : "analysis(es)"}`}
            filters={{
              grid: "1fr 160px 160px 140px 140px",
              search: q, onSearchChange: setQ,
              searchPlaceholder: lang === "pt" ? "Marca, modelo, placa…" : "Brand, model, plate…",
              status, onStatusChange: setStatus,
              statusOptions: [
                { value: "all", label: t("common_all") },
                { value: "draft", label: lang === "pt" ? "Rascunho" : "Draft" },
                { value: "pending", label: t("status_pending") },
                { value: "approved", label: lang === "pt" ? "Aceito" : "Accepted" },
                { value: "rejected", label: lang === "pt" ? "Recusado" : "Rejected" },
                { value: "converted", label: lang === "pt" ? "Convertido" : "Converted" },
              ],
              brand, onBrandChange: setBrand,
              brandOptions: [{ value: "all", label: lang === "pt" ? "Todas" : "All" }, ...brands.map(b => ({ value: b, label: b }))],
              extra: (<>
                <_na.Field label={t("common_from")}><_na.Input type="date" value={dateFrom} onChange={setDateFrom} /></_na.Field>
                <_na.Field label={t("common_to")}><_na.Input type="date" value={dateTo} onChange={setDateTo} /></_na.Field>
              </>),
            }}
            empty={<_na.Empty icon="inbox" title={lang === "pt" ? "Nenhuma análise salva ainda" : "No saved analyses yet"}
              action={<_na.Button kind="primary" icon="plus" onClick={() => setT && setT({ module: "analysis", analysisId: null })}>{lang === "pt" ? "Criar primeira análise" : "Create first analysis"}</_na.Button>} />}
          />
          )}
        </_na.CardBody>
      </_na.Card>

      <_na.Modal open={!!acceptRow} onClose={() => !statusSaving && setAcceptRow(null)}
        title={lang === "pt" ? "Aceitar oportunidade — dados do vendedor" : "Accept opportunity — seller details"}
        footer={<>
          <_na.Button kind="ghost" disabled={statusSaving} onClick={() => setAcceptRow(null)}>{t("common_cancel")}</_na.Button>
          <_na.Button kind="primary" icon="check" disabled={statusSaving} onClick={confirmAccept}>
            {statusSaving ? (lang === "pt" ? "Salvando…" : "Saving…") : (lang === "pt" ? "Confirmar aceite" : "Confirm accept")}
          </_na.Button>
        </>}>
        {acceptRow && (
          <div className="col gap-12">
            <div className="hint">
              {acceptRow.plate} — {acceptRow.brand} {acceptRow.model}
            </div>
            <_na.Field label={lang === "pt" ? "Nome do vendedor" : "Seller name"} required>
              <_na.Input value={sellerForm.name} onChange={v => setSellerForm(f => ({ ...f, name: v }))} placeholder={lang === "pt" ? "Nome completo" : "Full name"} />
            </_na.Field>
            <div className="field-row">
              <_na.Field label="CPF">
                <_na.Input mono value={sellerForm.cpf} onChange={v => setSellerForm(f => ({ ...f, cpf: v }))} placeholder="000.000.000-00" />
              </_na.Field>
              <_na.Field label={lang === "pt" ? "Telefone" : "Phone"}>
                <_na.Input mono value={sellerForm.phone} onChange={v => setSellerForm(f => ({ ...f, phone: v }))} placeholder="(00) 00000-0000" />
              </_na.Field>
            </div>
            <_na.Field label="E-mail">
              <_na.Input value={sellerForm.email} onChange={v => setSellerForm(f => ({ ...f, email: v }))} placeholder="email@exemplo.com" />
            </_na.Field>
          </div>
        )}
      </_na.Modal>
    </div>
  );
}
window.NA.M.opportunities = ModuleOpportunities;
