/* global React, SEQ_UI */
const { Icon, brl, Avatar } = window.SEQ_UI;

const PAGAMENTOS_FALLBACK = [
  { id: "pg-001", cliente: "Diogo Costa", proposta: "Agendamento · entrada", valor: 2000, metodo: "PIX", status: "pago", data: "30 abr · 18:02", taxa: 0.99 },
  { id: "pg-002", cliente: "André Sapato", proposta: "Lançamento · entrada", valor: 4950, metodo: "Cartão · 6x", status: "pago", data: "22 abr · 10:31", taxa: 178.20 },
];

const STATUS_INV = { paid: "pago", sent: "aguardando", overdue: "atrasado", cancelled: "estornado", draft: "rascunho" };

function transformInvoice(inv) {
  const client = inv.clients;
  const due = inv.due_date || inv.dueDate;
  const status = STATUS_INV[inv.status] || inv.status;
  return {
    id: inv.id,
    cliente: client?.name || "—",
    proposta: inv.title,
    valor: (inv.amount ?? 0) / 100,
    metodo: (inv.allowed_methods?.[0] || inv.allowedMethods?.[0] || "PIX").toUpperCase(),
    status,
    data: due ? new Date(due).toLocaleDateString("pt-BR", { day: "2-digit", month: "short" }) : "—",
    taxa: 0.99,
  };
}

function Pagamentos() {
  const [PAGAMENTOS, setItems] = React.useState(PAGAMENTOS_FALLBACK);
  const [modal, setModal] = React.useState(false);
  const [actionId, setActionId] = React.useState(null);
  const [busyId, setBusyId] = React.useState(null);

  React.useEffect(() => {
    window.SEQ_API.listInvoices()
      .then(d => {
        if (d.invoices?.length) setItems(d.invoices.map(transformInvoice));
      })
      .catch(() => {});
  }, []);

  React.useEffect(() => {
    if (!actionId) return;
    const close = () => setActionId(null);
    window.addEventListener("click", close);
    return () => window.removeEventListener("click", close);
  }, [actionId]);

  async function markPaid(id) {
    setBusyId(id);
    try {
      await fetch(`/api/invoices/${id}`, {
        method: "PATCH",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ status: "paid" }),
        credentials: "include",
      });
      window.location.reload();
    } catch (e) {
      setBusyId(null);
      alert("Falha ao marcar como pago.");
    }
  }

  const recebido = PAGAMENTOS.filter(p=>p.status==="pago").reduce((s,p)=>s+p.valor,0);
  const aguardando = PAGAMENTOS.filter(p=>p.status==="aguardando").reduce((s,p)=>s+p.valor,0);
  const atrasado = PAGAMENTOS.filter(p=>p.status==="atrasado").reduce((s,p)=>s+p.valor,0);
  const liquidoMes = recebido - PAGAMENTOS.filter(p=>p.status==="pago").reduce((s,p)=>s+p.taxa,0);

  return (
    <div style={{ minHeight: "calc(100vh - 80px)", background: "var(--kp-paper)" }}>
      <div style={{ borderBottom: "1.5px solid var(--kp-ink)", padding: "14px 28px", display: "flex", justifyContent: "space-between", alignItems: "center" }}>
        <div style={{ display: "flex", alignItems: "center", gap: 18 }}>
          <a href="#/propostas" className="kp-btn kp-btn-sm kp-btn-ghost"><Icon.back s={14}/> Propostas</a>
          <span style={{ color: "var(--kp-faint)" }}>|</span>
          <strong style={{ fontFamily: "var(--kp-display)", fontSize: 22, fontStyle: "italic" }}>Pagamentos</strong>
        </div>
        <div style={{ display: "flex", gap: 8 }}>
          <button className="kp-btn kp-btn-sm">Esta semana ▾</button>
          <button className="kp-btn kp-btn-sm">Exportar</button>
          <button className="kp-btn kp-btn-sm kp-btn-ink" onClick={()=>setModal(true)}>+ Nova cobrança</button>
        </div>
      </div>

      <div style={{ padding: "28px 28px 64px", maxWidth: 1320, margin: "0 auto" }}>
        <div style={{ display: "flex", alignItems: "end", justifyContent: "space-between", marginBottom: 24, flexWrap: "wrap", gap: 14 }}>
          <div>
            <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)" }}>Nº <em style={{ fontFamily: "var(--kp-display)", fontStyle: "italic", fontSize: 14, letterSpacing: 0 }}>07</em> · CAIXA · 30 DIAS</span>
            <h1 className="kp-display" style={{ fontSize: "clamp(40px,5vw,64px)", lineHeight: 1.0, margin: "8px 0 0" }}>O que <em>caiu na conta.</em></h1>
          </div>
          <div className="kp-mono" style={{ fontSize: 10, color: "var(--kp-muted)", letterSpacing: "0.16em" }}>
            Próxima liquidação · <span style={{ color: "var(--kp-ink)" }}>02 mai · D+1</span>
          </div>
        </div>

        {/* KPIs */}
        <div style={{ display: "grid", gridTemplateColumns: "repeat(4,1fr)", gap: 16, marginBottom: 22 }}>
          <KCard label="Recebido (30d)" value={brl(recebido)} sub="+12% vs. mês anterior" bg="var(--kp-green)" pulse/>
          <KCard label="Aguardando" value={brl(aguardando)} sub="1 cobrança · PIX" bg="var(--kp-white)"/>
          <KCard label="Atrasado" value={brl(atrasado)} sub="1 boleto vencido" bg="var(--kp-pink-soft)"/>
          <KCard label="Líquido (após taxas)" value={brl(liquidoMes)} sub={"taxa média 1.8%"} bg="var(--kp-cold)"/>
        </div>

        {/* Receitas + métodos */}
        <div style={{ display: "grid", gridTemplateColumns: "1.4fr 1fr", gap: 16, marginBottom: 22 }}>
          <div className="kp-card" style={{ padding: 22 }}>
            <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)" }}>RECEITA · ÚLTIMOS 14 DIAS</div>
            <Sparkline />
          </div>
          <div className="kp-card" style={{ padding: 22 }}>
            <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)", marginBottom: 14 }}>POR MÉTODO</div>
            {[
              { k: "PIX", v: 0.62, n: brl(13680), c: "var(--kp-green)" },
              { k: "Cartão", v: 0.28, n: brl(6440), c: "var(--kp-pink)" },
              { k: "Boleto", v: 0.10, n: brl(2200), c: "var(--kp-cold)" },
            ].map(r => (
              <div key={r.k} style={{ marginBottom: 12 }}>
                <div style={{ display: "flex", justifyContent: "space-between", fontSize: 13, marginBottom: 4 }}>
                  <span style={{ fontFamily: "var(--kp-mono)", fontSize: 10, letterSpacing: "0.16em" }}>{r.k}</span>
                  <span className="kp-mono" style={{ fontSize: 10, letterSpacing: "0.14em" }}>{r.n}</span>
                </div>
                <div style={{ height: 14, border: "1.5px solid var(--kp-ink)", background: "var(--kp-white)", position: "relative" }}>
                  <div style={{ position: "absolute", inset: 0, right: ((1-r.v)*100)+"%", background: r.c }}/>
                </div>
              </div>
            ))}
          </div>
        </div>

        {/* Tabela */}
        <div className="kp-card" style={{ padding: 0 }}>
          <div style={{ display: "grid", gridTemplateColumns: "1.6fr 1.6fr 1fr 1fr 1fr 0.6fr", padding: "12px 18px", borderBottom: "1.5px solid var(--kp-ink)", background: "var(--kp-soft)", fontFamily: "var(--kp-mono)", fontSize: 9, letterSpacing: "0.2em", textTransform: "uppercase", color: "var(--kp-muted)" }}>
            <div>Cliente</div><div>Proposta</div><div>Valor</div><div>Método</div><div>Status · Data</div><div></div>
          </div>
          {PAGAMENTOS.map((p,i) => {
            const canMarkPaid = p.status === "aguardando" || p.status === "atrasado";
            return (
              <div key={p.id} style={{ display: "grid", gridTemplateColumns: "1.6fr 1.6fr 1fr 1fr 1fr 0.6fr", padding: "14px 18px", alignItems: "center", borderBottom: i === PAGAMENTOS.length-1 ? "none" : "1px solid rgba(10,10,10,0.1)", background: i % 2 === 1 ? "var(--kp-soft)" : "var(--kp-white)" }}>
                <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
                  <Avatar initials={p.cliente.split(" ").map(s=>s[0]).slice(0,2).join("")} size={32} bg="var(--kp-cold)"/>
                  <span style={{ fontSize: 13.5, fontWeight: 500 }}>{p.cliente}</span>
                </div>
                <span style={{ fontSize: 12.5, color: "var(--kp-muted)" }}>{p.proposta}</span>
                <span className="kp-display" style={{ fontSize: 18, fontStyle: "italic" }}>{brl(p.valor)}</span>
                <span style={{ fontFamily: "var(--kp-mono)", fontSize: 10.5, letterSpacing: "0.1em" }}>{p.metodo}</span>
                <div>
                  <PayStatus status={p.status}/>
                  <div className="kp-mono" style={{ fontSize: 9.5, color: "var(--kp-muted)", letterSpacing: "0.14em", marginTop: 4 }}>{p.data}</div>
                </div>
                <div style={{ position: "relative", justifySelf: "end" }} onClick={(e)=>e.stopPropagation()}>
                  {canMarkPaid ? (
                    <button
                      className="kp-btn kp-btn-sm kp-btn-ink"
                      style={{ padding: "5px 9px", fontSize: 10 }}
                      disabled={busyId === p.id}
                      onClick={() => markPaid(p.id)}
                    >
                      {busyId === p.id ? "..." : "Marcar pago"}
                    </button>
                  ) : (
                    <button
                      className="kp-btn kp-btn-sm"
                      style={{ padding: "5px 9px" }}
                      onClick={() => setActionId(actionId === p.id ? null : p.id)}
                    >···</button>
                  )}
                  {actionId === p.id && !canMarkPaid && (
                    <div className="kp-card" style={{ position: "absolute", right: 0, top: "calc(100% + 4px)", padding: 6, minWidth: 160, background: "var(--kp-white)", zIndex: 50 }}>
                      <div className="kp-mono" style={{ fontSize: 9, letterSpacing: "0.18em", color: "var(--kp-muted)", padding: "6px 8px" }}>SEM AÇÕES</div>
                    </div>
                  )}
                </div>
              </div>
            );
          })}
        </div>

        {/* Recorrências + payouts */}
        <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16, marginTop: 22 }}>
          <div className="kp-card" style={{ padding: 22 }}>
            <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)" }}>RECORRÊNCIAS ATIVAS · 4</div>
            <div className="kp-display" style={{ fontSize: 24, marginTop: 6 }}>Mensal: <em>R$ 6.290,00</em></div>
            {[
              { c: "Café Sapatão", v: brl(1490), p: "todo dia 10" },
              { c: "Lemos Saúde", v: brl(1800), p: "todo dia 5" },
              { c: "Pet Hub", v: brl(2200), p: "todo dia 20" },
              { c: "Tórtola", v: brl(800), p: "todo dia 1" },
            ].map((r,i) => (
              <div key={i} style={{ display: "flex", justifyContent: "space-between", padding: "10px 0", borderBottom: i === 3 ? "none" : "1px solid rgba(10,10,10,0.1)", fontSize: 13 }}>
                <span>{r.c}</span>
                <span style={{ color: "var(--kp-muted)", fontSize: 12 }}>{r.p}</span>
                <span className="kp-mono" style={{ fontSize: 10.5, letterSpacing: "0.14em" }}>{r.v}</span>
              </div>
            ))}
          </div>
          <div className="kp-card" style={{ padding: 22, background: "var(--kp-ink)", color: "var(--kp-paper)" }}>
            <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-faint)" }}>PRÓXIMO PAYOUT</div>
            <div className="kp-display" style={{ fontSize: 56, fontStyle: "italic", lineHeight: 1, color: "var(--kp-paper)", marginTop: 8 }}>{brl(2000)}</div>
            <div style={{ fontSize: 13, color: "rgba(247,241,232,0.7)", marginTop: 8 }}>Banco Itaú · ag 0123 · cc ••••42 · liquidação 02 mai</div>
            <button className="kp-btn kp-btn-green" style={{ marginTop: 16 }}>Antecipar payout (taxa 1.5%)</button>
          </div>
        </div>
      </div>

      {modal && <NewInvoiceModal onClose={()=>setModal(false)} onCreated={()=>{ setModal(false); window.location.reload(); }} />}
    </div>
  );
}

function NewInvoiceModal({ onClose, onCreated }) {
  const [clients, setClients] = React.useState([]);
  const [clientId, setClientId] = React.useState("");
  const [title, setTitle] = React.useState("");
  const [amount, setAmount] = React.useState("");
  const [dueDate, setDueDate] = React.useState("");
  const [method, setMethod] = React.useState("pix");
  const [send, setSend] = React.useState(false);
  const [submitting, setSubmitting] = React.useState(false);
  const [error, setError] = React.useState(null);

  React.useEffect(() => {
    window.SEQ_API.listClients()
      .then(d => setClients(d.clients || []))
      .catch(() => {});
  }, []);

  async function submit(e) {
    e.preventDefault();
    if (!clientId || !title.trim() || !amount || !dueDate) return;
    setSubmitting(true);
    setError(null);
    try {
      const cents = Math.round(parseFloat(amount.replace(",", ".").replace(/[^0-9.]/g, "")) * 100);
      await window.SEQ_API.createInvoice({
        clientId,
        title: title.trim(),
        amount: cents,
        dueDate,
        allowedMethods: [method],
        send,
      });
      onCreated();
    } catch (err) {
      setError(err.message || "Falha ao criar cobrança.");
      setSubmitting(false);
    }
  }

  return (
    <div onClick={onClose} style={{ position: "fixed", inset: 0, background: "rgba(10,10,10,0.5)", zIndex: 300, display: "flex", alignItems: "center", justifyContent: "center", padding: 20 }}>
      <div onClick={(e)=>e.stopPropagation()} className="kp-card" style={{ padding: 28, maxWidth: 560, width: "100%", background: "var(--kp-paper)" }}>
        <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)" }}>NOVA COBRANÇA</div>
        <h2 className="kp-display" style={{ fontSize: 36, lineHeight: 1.05, marginTop: 6 }}>Quanto e <em>de quem</em>?</h2>

        <form onSubmit={submit}>
          <div style={{ marginTop: 18, display: "flex", flexDirection: "column", gap: 12 }}>
            <label>
              <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>CLIENTE</span>
              <select className="kp-input" required value={clientId} onChange={(e)=>setClientId(e.target.value)} style={{ marginTop: 6 }}>
                <option value="">Selecione um cliente…</option>
                {clients.map(c => <option key={c.id} value={c.id}>{c.name}</option>)}
              </select>
            </label>
            <label>
              <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>TÍTULO</span>
              <input className="kp-input" required value={title} onChange={(e)=>setTitle(e.target.value)} placeholder="Ex: Mentoria · abril" style={{ marginTop: 6 }}/>
            </label>
            <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12 }}>
              <label>
                <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>VALOR (R$)</span>
                <input className="kp-input" required value={amount} onChange={(e)=>setAmount(e.target.value)} placeholder="1200,00" style={{ marginTop: 6 }}/>
              </label>
              <label>
                <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>VENCIMENTO</span>
                <input type="date" className="kp-input" required value={dueDate} onChange={(e)=>setDueDate(e.target.value)} style={{ marginTop: 6 }}/>
              </label>
            </div>
            <label>
              <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>MÉTODO</span>
              <select className="kp-input" value={method} onChange={(e)=>setMethod(e.target.value)} style={{ marginTop: 6 }}>
                <option value="pix">PIX</option>
                <option value="card">Cartão</option>
                <option value="boleto">Boleto</option>
              </select>
            </label>
            <label style={{ display: "flex", alignItems: "center", gap: 10, marginTop: 4, cursor: "pointer" }}>
              <input type="checkbox" checked={send} onChange={(e)=>setSend(e.target.checked)} style={{ width: 18, height: 18 }}/>
              <span style={{ fontSize: 13 }}>Enviar agora pro cliente</span>
            </label>
          </div>
          {error && <div style={{ marginTop: 10, padding: "8px 12px", background: "#FFB5B5", border: "1.5px solid var(--kp-ink)", fontFamily: "var(--kp-mono)", fontSize: 10, letterSpacing: "0.14em" }}>⚠ {error}</div>}
          <div style={{ display: "flex", gap: 10, marginTop: 22 }}>
            <button type="button" onClick={onClose} className="kp-btn" style={{ flex: 1 }}>Cancelar</button>
            <button type="submit" disabled={submitting} className="kp-btn kp-btn-ink" style={{ flex: 2 }}>{submitting ? "Criando..." : (send ? "Criar e enviar →" : "Criar cobrança →")}</button>
          </div>
        </form>
      </div>
    </div>
  );
}

function KCard({ label, value, sub, bg, pulse }) {
  return (
    <div className="kp-card" style={{ background: bg, padding: 20 }}>
      <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: bg === "var(--kp-white)" ? "var(--kp-muted)" : "var(--kp-ink)", display: "flex", alignItems: "center", gap: 6 }}>
        {pulse && <span className="kp-dot"/>} {label}
      </div>
      <div className="kp-display" style={{ fontSize: 36, fontStyle: "italic", lineHeight: 1, marginTop: 8 }}>{value}</div>
      <div style={{ fontSize: 12, marginTop: 6, color: bg === "var(--kp-white)" ? "var(--kp-muted)" : "var(--kp-ink)", opacity: 0.8 }}>{sub}</div>
    </div>
  );
}

function PayStatus({ status }) {
  const map = {
    pago: { l: "Pago", c: "var(--kp-green)" },
    aguardando: { l: "Aguardando", c: "var(--kp-soft)" },
    atrasado: { l: "Atrasado", c: "#FFB5B5" },
    estornado: { l: "Estornado", c: "var(--kp-warm)" },
  };
  const m = map[status] || map.aguardando;
  return <span className="status-chip" style={{ background: m.c }}>{m.l}</span>;
}

function Sparkline() {
  const data = [12, 18, 9, 22, 28, 15, 24, 35, 30, 42, 38, 48, 44, 52];
  const max = Math.max(...data);
  return (
    <div style={{ marginTop: 14, display: "flex", alignItems: "end", gap: 6, height: 140 }}>
      {data.map((v,i) => (
        <div key={i} style={{ flex: 1, height: (v/max)*100+"%", background: i === data.length-1 ? "var(--kp-pink)" : "var(--kp-green)", border: "1.5px solid var(--kp-ink)" }}/>
      ))}
    </div>
  );
}

window.SEQ_PAGAMENTOS = Pagamentos;
