/* ANISAN — Despesas fixas. Espelha "Compras / pagamentos do dia": cadastrar
   modelo de despesa fixa + lançar, mas com lançamento AUTOMÁTICO todo mês.
   As instâncias lançadas são um snapshot por mês — excluir um modelo não
   altera meses anteriores já materializados. */

function DespesasFixas({ unit }) {
  const store = window.useStore();
  const D = window.ANISAN_DATA;
  const data = store.data;
  const cons = window.isCons(unit);

  const [mk, setMk] = React.useState(window.monthKey());
  const [lancDlg, setLancDlg] = React.useState(null);   // lançamento avulso no mês
  const [cadDlg, setCadDlg] = React.useState(null);     // modelo de despesa fixa
  const [payDlg, setPayDlg] = React.useState(null);     // confirmar pagamento
  const [delFixa, setDelFixa] = React.useState(null);   // confirmar exclusão de modelo

  // Lançamento automático do mês visualizado (corrente ou futuro).
  React.useEffect(() => {
    if (mk >= window.monthKey()) {
      if (window.ensureFixasMes(store.data, mk)) store.persist();
    }
  });

  React.useEffect(() => { window.lucide && window.lucide.createIcons(); });

  const fixas = window.fixasDoMes(data, unit, mk);
  const unpaid = fixas.filter(r => !r.paid);
  const paid = fixas.filter(r => r.paid);
  const sum = (a) => a.reduce((s, r) => s + (Number(r.value) || 0), 0);

  const modelos = cons
    ? D.units.flatMap(u => (data.despesasFixas[u] || []).map(f => ({ ...f, _u: u })))
    : (data.despesasFixas[unit] || []).map(f => ({ ...f, _u: unit }));

  // modelos ativos ainda não lançados no mês exibido
  const faltando = modelos.filter(f => f.ativo && !fixas.some(x => x.fixaId === f.id));

  // ---- instâncias do mês ----
  const setInst = (u, id, patch) => store.set(d => { const r = (d.despesasFixasLancadas[u][mk] || []).find(x => x.id === id); if (r) Object.assign(r, patch); }, "despesasFixasLancadas");
  const delInst = (u, id) => store.set(d => { d.despesasFixasLancadas[u][mk] = d.despesasFixasLancadas[u][mk].filter(x => x.id !== id); }, "despesasFixasLancadas");

  const requestToggle = (r) => {
    if (r.paid) { setInst(r._u, r.id, { paid: false, conta: "", pagamento: "" }); return; }
    setPayDlg({ _u: r._u, id: r.id, name: r.name, value: r.value, conta: r.conta || "Cash", data: window.todayISO() });
  };
  const confirmPay = () => { const f = payDlg; setInst(f._u, f.id, { paid: true, conta: f.conta || "Cash", pagamento: f.data || window.todayISO() }); setPayDlg(null); };

  const saveLanc = () => {
    const f = lancDlg;
    const tu = f._u || (cons ? D.units[0] : unit);
    const rec = { id: window.uid(), fixaId: null, name: f.descricao || "Despesa", plano: f.plano || "", venc: f.venc ? window.dateLabel(f.venc).slice(0, 5) : "", value: window.parseBRL(f.valor), paid: !!f.pago, conta: f.pago ? (f.conta || "Cash") : "", pagamento: f.pago ? (f.pagamento || window.todayISO()) : "" };
    store.set(d => { if (!d.despesasFixasLancadas[tu][mk]) d.despesasFixasLancadas[tu][mk] = []; if (f.id) { const r = d.despesasFixasLancadas[f._u][mk].find(x => x.id === f.id); if (r) Object.assign(r, { name: rec.name, plano: rec.plano, venc: rec.venc, value: rec.value }); } else d.despesasFixasLancadas[tu][mk].push(rec); }, "despesasFixasLancadas");
    setLancDlg(null);
  };
  const editInst = (r) => setLancDlg({ id: r.id, _u: r._u, descricao: r.name, valor: String(r.value), conta: r.conta || "Cash", plano: r.plano || "", venc: window.ddmmToISO(r.venc) || "", pago: !!r.paid, pagamento: r.pagamento || "" });

  // ---- modelos (templates) ----
  const saveCad = () => {
    const f = cadDlg;
    const tu = f._u || (cons ? D.units[0] : unit);
    store.set(d => {
      if (f.id) { const m = d.despesasFixas[f._u].find(x => x.id === f.id); if (m) Object.assign(m, { nome: f.nome || "Despesa fixa", plano: f.plano || "", conta: f.conta || "Cash", valor: window.parseBRL(f.valor), diaVenc: parseInt(f.diaVenc) || 1 }); }
      else d.despesasFixas[tu].push({ id: window.uid(), nome: f.nome || "Despesa fixa", plano: f.plano || "", conta: f.conta || "Cash", valor: window.parseBRL(f.valor), diaVenc: parseInt(f.diaVenc) || 1, ativo: true });
      // lança imediatamente no mês corrente
      window.ensureFixasMes(d, window.monthKey());
    }, ["despesasFixas", "despesasFixasLancadas"]);
    setCadDlg(null);
  };
  const toggleFixa = (u, id, ativo) => store.set(d => { const m = d.despesasFixas[u].find(x => x.id === id); if (m) m.ativo = ativo; }, "despesasFixas");
  const removeFixa = (u, id) => { store.set(d => { d.despesasFixas[u] = d.despesasFixas[u].filter(x => x.id !== id); }, "despesasFixas"); setDelFixa(null); };
  const gerarMes = () => store.set(d => { window.ensureFixasMes(d, mk); }, "despesasFixasLancadas");

  const isCurrent = mk === window.monthKey();

  return (
    <div style={{ padding: "26px 32px 48px" }}>
      <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", flexWrap: "wrap", gap: 14, marginBottom: 22 }}>
        <SectionTitle style={{ margin: 0 }}>Despesas fixas</SectionTitle>
        <div style={{ display: "flex", alignItems: "center", gap: 8, background: "var(--surface)", border: "1px solid var(--hairline)", borderRadius: "var(--radius-pill)", padding: "5px 6px" }}>
          <button onClick={() => setMk(window.monthShift(mk, -1))} style={navMini}><i data-lucide="chevron-left" style={{ width: 16, height: 16, strokeWidth: 1.8 }}></i></button>
          <span style={{ fontFamily: "var(--font-mono)", fontSize: 12, letterSpacing: "0.04em", color: "var(--paper)", minWidth: 124, textAlign: "center" }}>{window.monthLabel(mk)}{isCurrent ? " · atual" : ""}</span>
          <button onClick={() => setMk(window.monthShift(mk, 1))} style={navMini}><i data-lucide="chevron-right" style={{ width: 16, height: 16, strokeWidth: 1.8 }}></i></button>
        </div>
      </div>

      <div style={{ display: "flex", gap: 24, alignItems: "flex-start", flexWrap: "wrap" }}>
        {/* coluna principal: lançamentos do mês */}
        <div style={{ flex: 2, minWidth: 440 }}>
          <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 14, gap: 12, flexWrap: "wrap" }}>
            <span style={{ fontFamily: "var(--font-display)", fontSize: 17, fontWeight: 500, color: "var(--paper)" }}>Lançamentos de {window.monthLabel(mk)}</span>
          </div>

          {faltando.length > 0 && (
            <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 12, padding: "11px 14px", marginBottom: 12, background: "var(--fill-accent)", border: "1px solid var(--hairline)", borderRadius: "var(--radius-sm)" }}>
              <span style={{ fontFamily: "var(--font-body)", fontSize: 12.5, color: "var(--paper)" }}>{faltando.length} modelo(s) ativo(s) ainda não lançado(s) neste mês.</span>
              <Button size="sm" onClick={gerarMes}>Gerar lançamentos</Button>
            </div>
          )}

          <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12, marginBottom: 14 }}>
            <StatCard label="A pagar" count={unpaid.length} value={window.BRL(sum(unpaid))} accent="var(--clay)" />
            <StatCard label="Pago no mês" count={paid.length} value={window.BRL(sum(paid))} accent="var(--jade)" />
          </div>

          <ul style={{ listStyle: "none", margin: "0 0 16px", padding: 0, border: "1px solid var(--hairline)", borderRadius: "var(--radius)", overflow: "hidden", background: "var(--surface)" }}>
            {fixas.map((r) => (
              <LedgerRow key={r._u + r.id} name={cons ? r.name + "  ·  " + r._u : r.name} value={r.value} paid={r.paid} dueDate={r.venc ? window.dateLabel(r.venc) : null} paidDate={r.pagamento ? window.dateLabel(r.pagamento) : null} category={window.planoNome(r.plano) ? window.planoLabel(r.plano) : null}
                onToggle={() => requestToggle(r)} onEdit={() => editInst(r)} onDelete={() => delInst(r._u, r.id)} />
            ))}
            {fixas.length === 0 && <li style={{ padding: "20px 16px", fontFamily: "var(--font-body)", fontSize: 13, color: "var(--muted-2)", textAlign: "center" }}>Nenhuma despesa fixa lançada neste mês.</li>}
          </ul>
        </div>

        {/* coluna lateral: modelos de despesa fixa */}
        <div style={{ flex: 1, minWidth: 300 }}>
          <Panel title="Modelos de despesa fixa" action={<Button size="sm" variant="primary" onClick={() => setCadDlg({ nome: "", plano: "", conta: "Cash", valor: "", diaVenc: "5", _u: cons ? D.units[0] : unit })}>+ Cadastrar</Button>}>
            <p style={{ fontFamily: "var(--font-body)", fontSize: 12, color: "var(--muted)", lineHeight: 1.6, margin: "0 0 14px" }}>Lançados automaticamente todo mês. Desativar pausa os próximos meses; excluir não altera meses já lançados.</p>
            {modelos.length === 0 && <p style={{ fontFamily: "var(--font-body)", fontSize: 13, color: "var(--muted-2)", textAlign: "center", padding: "10px 0" }}>Nenhum modelo. Use “+ Cadastrar”.</p>}
            {modelos.map((f, i) => (
              <div key={f._u + f.id} style={{ display: "flex", alignItems: "center", gap: 11, padding: "11px 0", borderTop: i === 0 ? "none" : "1px solid var(--hairline)", opacity: f.ativo ? 1 : 0.5 }}>
                <span style={{ flex: 1, minWidth: 0 }}>
                  <span style={{ display: "block", fontFamily: "var(--font-body)", fontSize: 13.5, color: "var(--paper)", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}>{f.nome}</span>
                  <span style={{ display: "block", fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--muted-2)", marginTop: 1 }}>dia {f.diaVenc} · {f.conta}{cons ? " · " + f._u : ""}</span>
                </span>
                <span style={{ fontFamily: "var(--font-mono)", fontSize: 12.5, color: "var(--paper)", whiteSpace: "nowrap" }}>{window.BRLk(f.valor)}</span>
                <span style={{ display: "flex", gap: 4, flexShrink: 0 }}>
                  <button title={f.ativo ? "Pausar" : "Ativar"} onClick={() => toggleFixa(f._u, f.id, !f.ativo)} style={iconMiniDf}><i data-lucide={f.ativo ? "pause" : "play"} style={{ width: 12, height: 12, strokeWidth: 1.8 }}></i></button>
                  <button title="Editar" onClick={() => setCadDlg({ id: f.id, _u: f._u, nome: f.nome, plano: f.plano, conta: f.conta, valor: String(f.valor), diaVenc: String(f.diaVenc) })} style={iconMiniDf}><i data-lucide="pencil" style={{ width: 12, height: 12, strokeWidth: 1.7 }}></i></button>
                  <button title="Excluir" onClick={() => setDelFixa(f)} style={iconMiniDf}><i data-lucide="trash-2" style={{ width: 12, height: 12, strokeWidth: 1.7 }}></i></button>
                </span>
              </div>
            ))}
          </Panel>
        </div>
      </div>

      {/* lançar/editar instância */}
      <Dialog open={!!lancDlg} title={lancDlg && lancDlg.id ? "Editar despesa" : "Lançar despesa"} onClose={() => setLancDlg(null)} width={500}
        footer={<><Button onClick={() => setLancDlg(null)}>Cancelar</Button><Button variant="solid" onClick={saveLanc}>{lancDlg && lancDlg.id ? "Salvar" : "Lançar"}</Button></>}>
        {lancDlg && (
          <div style={{ display: "grid", gap: 16 }}>
            {cons && !lancDlg.id && <Select label="Unidade" value={lancDlg._u} onChange={(v) => setLancDlg({ ...lancDlg, _u: v })} options={D.units} />}
            <Select label="Classificação (plano de contas)" placeholder="Buscar conta… ex.: 5.2.3 Energia" value={lancDlg.plano}
              onChange={(v) => setLancDlg({ ...lancDlg, plano: v, descricao: (!lancDlg.descricao || lancDlg.descricao === window.planoNome(lancDlg.plano)) ? (window.planoNome(v) || lancDlg.descricao) : lancDlg.descricao })} options={window.planoSelectGroups} />
            {lancDlg.plano && <div style={{ display: "flex", alignItems: "center", gap: 8, padding: "8px 11px", background: "var(--fill-accent)", border: "1px solid var(--hairline)", borderRadius: "var(--radius-sm)" }}><i data-lucide="folder-tree" style={{ width: 13, height: 13, strokeWidth: 1.7, color: "var(--brass)", flexShrink: 0 }}></i><span style={{ fontFamily: "var(--font-mono)", fontSize: 10.5, color: "var(--paper)" }}>{window.planoTrail(lancDlg.plano)}</span></div>}
            <Input label="Descrição" value={lancDlg.descricao} onChange={(v) => setLancDlg({ ...lancDlg, descricao: v })} icon="tag" placeholder="Nome da despesa" />
            <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16 }}>
              <Input label="Valor" prefix="R$" value={lancDlg.valor} onChange={(v) => setLancDlg({ ...lancDlg, valor: v })} placeholder="0,00" />
              <Input label="Vencimento" type="date" value={lancDlg.venc} onChange={(v) => setLancDlg({ ...lancDlg, venc: v })} icon="calendar" inputStyle={{ colorScheme: "dark" }} />
            </div>
            <label style={{ display: "flex", alignItems: "center", gap: 10, cursor: "pointer" }}>
              <input type="checkbox" checked={lancDlg.pago} onChange={(e) => setLancDlg({ ...lancDlg, pago: e.target.checked, pagamento: e.target.checked ? (lancDlg.pagamento || window.todayISO()) : "" })} style={{ accentColor: "var(--jade)", width: 16, height: 16 }} />
              <span style={{ fontFamily: "var(--font-body)", fontSize: 13.5, color: "var(--paper)" }}>Já está pago</span>
            </label>
            {lancDlg.pago && (
              <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16, padding: "14px", background: "var(--fill-positive)", border: "1px solid var(--hairline)", borderRadius: "var(--radius-sm)" }}>
                <Select label="Conta de saída" value={lancDlg.conta} onChange={(v) => setLancDlg({ ...lancDlg, conta: v })} options={D.contasOpcoes} accent="var(--jade)" />
                <Input label="Dia do pagamento" type="date" value={lancDlg.pagamento} onChange={(v) => setLancDlg({ ...lancDlg, pagamento: v })} icon="calendar-check" accent="var(--jade)" inputStyle={{ colorScheme: "dark" }} />
              </div>
            )}
          </div>
        )}
      </Dialog>

      {/* confirmar pagamento */}
      <Dialog open={!!payDlg} title="Confirmar pagamento" onClose={() => setPayDlg(null)} width={460}
        footer={<><Button onClick={() => setPayDlg(null)}>Cancelar</Button><Button variant="solid" accent="var(--jade)" onClick={confirmPay}>Confirmar pagamento</Button></>}>
        {payDlg && (
          <div style={{ display: "grid", gap: 16 }}>
            <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 10, padding: "12px 14px", background: "var(--ink)", border: "1px solid var(--hairline)", borderRadius: "var(--radius-sm)" }}>
              <span style={{ fontFamily: "var(--font-body)", fontSize: 14, color: "var(--paper)", minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{payDlg.name}{cons ? "  ·  " + payDlg._u : ""}</span>
              <span style={{ fontFamily: "var(--font-display)", fontSize: 18, color: "var(--clay)", whiteSpace: "nowrap" }}>{window.BRL(payDlg.value)}</span>
            </div>
            <Select label="Conta de saída" value={payDlg.conta} onChange={(v) => setPayDlg({ ...payDlg, conta: v })} options={D.contasOpcoes} accent="var(--jade)" />
            <Input label="Dia do pagamento" type="date" value={payDlg.data} onChange={(v) => setPayDlg({ ...payDlg, data: v })} icon="calendar-check" accent="var(--jade)" inputStyle={{ colorScheme: "dark" }} />
          </div>
        )}
      </Dialog>

      {/* cadastrar/editar modelo */}
      <Dialog open={!!cadDlg} title={cadDlg && cadDlg.id ? "Editar despesa fixa" : "Cadastrar despesa fixa"} onClose={() => setCadDlg(null)} width={500}
        footer={<><Button onClick={() => setCadDlg(null)}>Cancelar</Button><Button variant="solid" onClick={saveCad}>Salvar</Button></>}>
        {cadDlg && (
          <div style={{ display: "grid", gap: 16 }}>
            {cons && !cadDlg.id && <Select label="Unidade" value={cadDlg._u} onChange={(v) => setCadDlg({ ...cadDlg, _u: v })} options={D.units} />}
            <Select label="Classificação (plano de contas)" placeholder="Buscar conta… ex.: 5.2.4 Aluguel" value={cadDlg.plano}
              onChange={(v) => setCadDlg({ ...cadDlg, plano: v, nome: (!cadDlg.nome || cadDlg.nome === window.planoNome(cadDlg.plano)) ? (window.planoNome(v) || cadDlg.nome) : cadDlg.nome })} options={window.planoSelectGroups} />
            {cadDlg.plano && <div style={{ display: "flex", alignItems: "center", gap: 8, padding: "9px 12px", background: "var(--fill-accent)", border: "1px solid var(--hairline)", borderRadius: "var(--radius-sm)" }}><i data-lucide="folder-tree" style={{ width: 14, height: 14, strokeWidth: 1.7, color: "var(--brass)", flexShrink: 0 }}></i><span style={{ fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--paper)" }}>{window.planoTrail(cadDlg.plano)}</span></div>}
            <Input label="Nome da despesa" value={cadDlg.nome} onChange={(v) => setCadDlg({ ...cadDlg, nome: v })} icon="tag" placeholder="Nomeada pela classificação" />
            <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 16 }}>
              <Input label="Valor mensal" prefix="R$" value={cadDlg.valor} onChange={(v) => setCadDlg({ ...cadDlg, valor: v })} placeholder="0,00" />
              <Input label="Dia venc." value={cadDlg.diaVenc} onChange={(v) => setCadDlg({ ...cadDlg, diaVenc: v })} placeholder="5" />
              <Select label="Conta padrão" value={cadDlg.conta} onChange={(v) => setCadDlg({ ...cadDlg, conta: v })} options={D.contasOpcoes} />
            </div>
          </div>
        )}
      </Dialog>

      {/* excluir modelo */}
      <Dialog open={!!delFixa} title="Excluir despesa fixa" onClose={() => setDelFixa(null)} width={440}
        footer={<><Button onClick={() => setDelFixa(null)}>Cancelar</Button><Button variant="solid" accent="var(--clay)" onClick={() => removeFixa(delFixa._u, delFixa.id)}>Excluir modelo</Button></>}>
        {delFixa && <p style={{ fontFamily: "var(--font-body)", fontSize: 14, color: "var(--paper)", lineHeight: 1.6, margin: 0 }}>Excluir o modelo <b>{delFixa.nome}</b>? Ele deixa de ser lançado nos próximos meses. Os lançamentos já feitos em meses anteriores <b>não</b> são alterados.</p>}
      </Dialog>
    </div>
  );
}

const navMini = { width: 28, height: 28, borderRadius: "50%", background: "none", border: "none", display: "grid", placeItems: "center", cursor: "pointer", color: "var(--muted)" };
const iconMiniDf = { width: 24, height: 24, borderRadius: 6, background: "none", border: "1px solid var(--hairline)", display: "grid", placeItems: "center", cursor: "pointer", color: "var(--muted-2)" };

window.DespesasFixas = DespesasFixas;
