// Relatório mensal completo (todas as sessões + insights + sugestões) — imprimível
function RelatorioMensalPage({ state, refKey, onVoltar }) {
  const fmt = window.fmtBRLString;
  const [ys, ms] = (refKey || "2026-06").split("-");
  const year = Number(ys), month = Number(ms) - 1;
  const refLabel = `${window.MESES_FULL[month]}/${year}`;

  const txs = state.transactions || [];
  const monthTxs = window.txByMonth(txs, year, month);
  const plano = window.computePlano(txs, state.aggregates, year, month);
  const income = plano.income;
  const expense = window.sumExpense(monthTxs) || window.aggExpenseForMonth(state.aggregates, year, month);
  const classes = window.byClasse(monthTxs);
  const cats = window.byCategory(monthTxs.filter(t => t.type === "Despesa")).slice(0, 6);
  const p = state.patrimonio || {};
  const tot = window.patrimonioTotais(p, state.dividas);
  const custoFixo = window.custoFixoEssencialMensal(txs);
  const reservaSaldo = (p.saldos || []).filter(s => s.reserva).reduce((s, a) => s + Number(a.valor || 0), 0);
  const reservaAlvo = custoFixo * ((state.reserva || {}).mesesAlvo || 6);
  const apo = window.calcAposentadoria(state.aposentadoria || { rendaMensalDesejada: 0 }, tot.financeiro);
  const apoGap = Math.max(0, (apo.alvo || 0) - (apo.projecao || 0));
  const objetivos = state.objetivos || [];
  const objPess = state.objetivosPessoais || {};
  const objPessSel = (window.OBJ_PESSOAIS_CATALOGO || []).filter(i => objPess[i.id] && objPess[i.id].selecionado);
  const seguros = state.seguros || [];
  const dividas = state.dividas || [];
  const dividaTotal = dividas.reduce((s, d) => s + Number(d.saldo || d.valor || 0), 0);
  const entrega = ((state.fechamento || {}).entregas || {})[refKey] || {};

  // ---- Lei de Jim Rohn (70/10/10/10) ----
  const bmap = {}; plano.buckets.forEach(b => { bmap[b.key] = b; });
  const rohn = window.PLANO_ORDER.map(k => {
    const b = bmap[k];
    const def = window.PLANO[k];
    const target = income * def.pct;
    const used = b ? b.used : 0;
    const pct = target > 0 ? used / target : 0;
    const avaliado = target > 0;
    const ok = avaliado && (k === "gastos" ? used <= target * 1.02 : used >= target * 0.9);
    return { key: k, label: def.label, alvoPct: def.pct * 100, target, used, pct, ok, avaliado };
  });
  const semDados = income <= 0;
  const avaliados = rohn.filter(r => r.avaliado);
  const rohnOk = avaliados.filter(r => r.ok).length;
  const nota = avaliados.length ? Math.round((rohnOk / avaliados.length) * 100) : null;
  const saldoMes = income - expense;
  const taxaPoupanca = income > 0 ? (income - (bmap.gastos ? bmap.gastos.used : expense)) / income : 0;

  const veredito = semDados
    ? { t: "Sem dados suficientes", c: "warn", d: `Não há receitas lançadas em ${refLabel}. Registre as receitas e despesas do mês para que o diagnóstico do 70/10/10/10 possa ser calculado.` }
    : nota >= 100 ? { t: "No caminho", c: "ok", d: "Todos os quatro pilares do 70/10/10/10 foram respeitados neste mês." }
    : nota >= 50 ? { t: "Parcialmente no caminho", c: "warn", d: "Parte dos pilares foi cumprida — os desvios abaixo precisam de correção no próximo ciclo." }
    : { t: "Fora do caminho", c: "bad", d: "A maioria dos pilares ficou fora do alvo. É prioridade reorganizar o mês seguinte." };

  // ---- Sugestões assertivas ----
  const sug = [];
  if (semDados) sug.push(`Lance as receitas e despesas de ${refLabel} no Orçamento — sem isso o fechamento do mês não pode ser avaliado.`);
  const g = bmap.gastos;
  if (!semDados && g && g.used > income * 0.70) {
    const excesso = g.used - income * 0.70;
    sug.push(`Reduza ${fmt(excesso)} de gastos até o próximo fechamento: comece pelas despesas variáveis e pelos gastos marcados como redutíveis.`);
  }
  ["caridade", "ativo", "passivo"].forEach(k => {
    const b = bmap[k], def = window.PLANO[k];
    if (!semDados && b && b.used < income * def.pct * 0.9) {
      sug.push(`Aporte ${fmt(income * def.pct - b.used)} em ${def.label} para fechar os 10% do mês — programe débito automático no dia do recebimento.`);
    }
  });
  if (reservaSaldo < reservaAlvo) {
    const falta = reservaAlvo - reservaSaldo;
    const aporte = income * 0.1;
    if (aporte >= 100) {
      const meses = Math.max(1, Math.ceil(falta / aporte));
      sug.push(`Reserva de emergência ${fmt(falta)} abaixo do alvo (${fmt(reservaAlvo)}). Mantendo 10% da renda, ela é completada em ~${meses} mês(es).`);
    } else {
      sug.push(`Reserva de emergência ${fmt(falta)} abaixo do alvo (${fmt(reservaAlvo)}) — defina um aporte mensal fixo para fechar essa diferença.`);
    }
  }
  if (dividaTotal > 0) sug.push(`Priorize a quitação de ${fmt(dividaTotal)} em dívidas — amortize primeiro a de maior taxa e evite novas parcelas neste ciclo.`);
  if (seguros.length === 0) sug.push("Nenhuma proteção cadastrada: contrate/registre seguro de vida e de renda antes de ampliar investimentos.");
  if (apoGap > 0) sug.push(`Aposentadoria: a projeção atual fica ${fmt(apoGap)} abaixo do capital necessário. Aporte mensal recomendado: ${fmt(apo.aporteNecessario || 0)}.`);
  if (objPessSel.length === 0) sug.push("Cadastre seus objetivos pessoais na primeira etapa — sem objetivo definido não há como priorizar o orçamento.");
  objetivos.filter(o => o.alvo > 0 && o.acumulado < o.alvo).slice(0, 2).forEach(o => {
    sug.push(`Objetivo "${o.nome}": faltam ${fmt(o.alvo - o.acumulado)} até ${o.prazo ? o.prazo.split("-").reverse().join("/") : "o prazo"} — reserve uma parcela fixa mensal para ele.`);
  });
  if (taxaPoupanca >= 0.3) sug.push("Taxa de poupança acima de 30%: avalie diversificar novos aportes entre renda fixa e ativos de longo prazo.");
  if (sug.length === 0) sug.push("Mês equilibrado: mantenha o mesmo padrão de aportes e revise as metas de longo prazo no próximo trimestre.");

  function Sec({ title, scope, children }) {
    return (
      <section className="rel-sec">
        <div className="rel-sec-head"><h3>{title}</h3>{scope && <span className="rel-scope">{scope}</span>}</div>
        {children}
      </section>
    );
  }
  const Linha = ({ k, v }) => <div className="relm-linha"><span>{k}</span><strong>{v}</strong></div>;

  return (
    <div className="page rel-page" data-screen-label="Relatório Mensal">
      <div className="page-head no-print">
        <div><h2>📄 Relatório do mês — {refLabel}</h2><span className="page-hint">Prestação de contas consolidada de todas as etapas do plano.</span></div>
        <div className="relm-actions">
          {onVoltar && <button className="btn-ghost" onClick={onVoltar}>Voltar</button>}
          <button className="btn-green" onClick={() => window.print()}>🖨️ Imprimir / PDF</button>
        </div>
      </div>

      <div className="rel-doc">
        <div className="rel-capa">
          <h1>Prestação de contas</h1>
          <p className="rel-sub">Relatório mensal consolidado — {refLabel}</p>
          <div className="rel-hr"></div>
          <div className="rel-info-grid">
            <div><span>Cliente</span><strong>{(state.user || {}).name || "—"}</strong></div>
            <div><span>Mês de referência</span><strong>{refLabel}</strong></div>
            <div><span>Data de fechamento</span><strong>dia {(state.fechamento || {}).dia || 5}</strong></div>
            <div><span>Entrega registrada em</span><strong>{entrega.dataEntrega ? entrega.dataEntrega.split("-").reverse().join("/") : "—"}</strong></div>
          </div>
        </div>

        <Sec title="Veredito do mês" scope="Diagnóstico">
          <div className={`relm-verdict ${veredito.c}`}>
            <div className="relm-verdict-nota">{semDados ? "—" : nota}<em>{semDados ? "sem nota" : "/100"}</em></div>
            <div>
              <strong>{veredito.t}</strong>
              <p>{veredito.d}</p>
              <div className="relm-verdict-kpis">
                <span>Renda {fmt(income)}</span>
                <span>Gastos {fmt(expense)}</span>
                <span>Saldo {fmt(saldoMes)}</span>
                <span>Taxa de poupança {semDados ? "—" : (taxaPoupanca * 100).toFixed(0) + "%"}</span>
              </div>
            </div>
          </div>
        </Sec>

        <Sec title="Lei de Jim Rohn — 70 / 10 / 10 / 10" scope="Orçamento do mês">
          <div className="relm-rohn">
            {rohn.map(r => (
              <div className={`relm-rohn-row ${!r.avaliado ? "na" : r.ok ? "ok" : "bad"}`} key={r.key}>
                <span className="relm-rohn-lab">{r.label} <em>{r.alvoPct}%</em></span>
                <div className="rel-bar-track"><div style={{ width: (r.avaliado ? Math.min(r.pct, 1.4) / 1.4 * 100 : 0) + "%", background: r.ok ? "#0663AA" : "#EA404D" }}></div></div>
                <span className="relm-rohn-val">{fmt(r.used)} <em>{r.avaliado ? `de ${fmt(r.target)}` : "sem alvo (renda não lançada)"}</em></span>
                <span className="relm-tag">{!r.avaliado ? "n/d" : r.ok ? "cumprido" : r.key === "gastos" ? "excedeu" : "abaixo"}</span>
              </div>
            ))}
          </div>
        </Sec>

        <Sec title="Orçamento e classes de gasto" scope={refLabel}>
          <div className="relm-cols">
            <div>
              <h4 className="relm-h4">Por classe</h4>
              {classes.length ? classes.map(c => <Linha key={c.id} k={`${c.icon} ${c.label}`} v={fmt(c.value)}/>) : <p className="relm-vazio">Sem lançamentos classificados neste mês.</p>}
            </div>
            <div>
              <h4 className="relm-h4">Maiores categorias</h4>
                  {cats.length ? cats.map(c => <Linha key={c.category} k={c.category} v={fmt(c.value)}/>) : <p className="relm-vazio">Sem despesas detalhadas.</p>}
            </div>
          </div>
        </Sec>

        <Sec title="Objetivos pessoais" scope="Etapa 1">
          {objPessSel.length ? objPessSel.map(i => {
            const d = objPess[i.id] || {};
            return (
              <div className="relm-obj" key={i.id}>
                <strong>{i.id === "outro" && d.titulo ? d.titulo : i.nome}</strong>
                <span>{d.inicio ? d.inicio.split("-").reverse().join("/") : "sem início"} → {d.fim ? d.fim.split("-").reverse().join("/") : "sem prazo"}</span>
                {d.motivo && <p>{d.motivo}</p>}
              </div>
            );
          }) : <p className="relm-vazio">Nenhum objetivo pessoal selecionado.</p>}
        </Sec>

        <Sec title="Objetivos financeiros" scope="Metas">
          {objetivos.length ? objetivos.map(o => (
            <div className="relm-linha" key={o.id}>
              <span>{o.icone} {o.nome}</span>
              <strong>{fmt(o.acumulado)} / {fmt(o.alvo)} <em className="relm-pct">{o.alvo > 0 ? Math.round(o.acumulado / o.alvo * 100) : 0}%</em></strong>
            </div>
          )) : <p className="relm-vazio">Nenhum objetivo cadastrado.</p>}
        </Sec>

        <Sec title="Patrimônio líquido" scope="Casal">
          <Linha k="Patrimônio total" v={fmt(tot.total)}/>
          <Linha k="Imóveis" v={fmt(tot.imoveis)}/>
          <Linha k="Veículos" v={fmt(tot.veiculos)}/>
          <Linha k="Participações societárias" v={fmt(tot.participacoes)}/>
          <Linha k="Saldos e investimentos" v={fmt(tot.financeiro)}/>
          <Linha k="Dívidas" v={fmt(dividaTotal)}/>
          <Linha k="Patrimônio líquido" v={fmt(tot.total - dividaTotal)}/>
        </Sec>

        <Sec title="Proteção" scope="Seguros e sucessão">
          {seguros.length ? seguros.map(s => (
            <Linha key={s.id} k={`${s.tipo || "Seguro"} — ${s.seguradora || s.nome || ""}`} v={fmt(s.capital || s.valor || 0)}/>
          )) : <p className="relm-vazio">Nenhuma proteção cadastrada.</p>}
        </Sec>

        <Sec title="Reserva de emergência" scope={`${(state.reserva || {}).mesesAlvo || 6} meses`}>
          <Linha k="Custo fixo essencial mensal" v={fmt(custoFixo)}/>
          <Linha k="Reserva alvo" v={fmt(reservaAlvo)}/>
          <Linha k="Reserva atual" v={fmt(reservaSaldo)}/>
          <Linha k={reservaSaldo >= reservaAlvo ? "Situação" : "Falta"} v={reservaSaldo >= reservaAlvo ? "Completa" : fmt(reservaAlvo - reservaSaldo)}/>
        </Sec>

        <Sec title="Aposentadoria" scope="Longo prazo">
          <Linha k="Renda mensal desejada" v={fmt((state.aposentadoria || {}).rendaMensalDesejada || 0)}/>
          <Linha k="Capital necessário" v={fmt(apo.alvo || 0)}/>
          <Linha k="Projeção no prazo" v={fmt(apo.projecao || 0)}/>
          <Linha k="Gap" v={fmt(apoGap)}/>
          <Linha k="Aporte mensal necessário" v={fmt(apo.aporteNecessario || 0)}/>
        </Sec>

        <Sec title="Relato do cliente" scope="Prestação de contas">
          {entrega.nota ? (
            <div className="relm-relato">
              <p><strong>Como foi o mês:</strong> {entrega.nota}</p>
              {entrega.pontos && <p><strong>Pontos positivos:</strong> {entrega.pontos}</p>}
              {entrega.ajustes && <p><strong>Ajustes:</strong> {entrega.ajustes}</p>}
            </div>
          ) : <p className="relm-vazio">Relato ainda não registrado para {refLabel}.</p>}
        </Sec>

        <Sec title="Sugestões para os próximos meses" scope="Plano de ação">
          <ol className="relm-sug">
            {sug.map((s, i) => <li key={i}>{s}</li>)}
          </ol>
        </Sec>
      </div>
    </div>
  );
}

Object.assign(window, { RelatorioMensalPage });
