/* global React, Icon, brl, FieldLabel */

// ─── Motor de parcelas (compartilhado venda × compra) ────────────────────────
// Extraído de src/Pedidos.jsx, onde já existia e funcionava. Existe UMA
// implementação — se duplicar, a conta de centavos diverge entre os módulos.
//
// Formato da parcela (o mesmo do pedido de venda, e o que vai no jsonb):
//   { venc: 'dd/mm/aaaa', valor: number, forma: string, conta: string }

const FORMAS_PARCELA = ['Dinheiro', 'PIX', 'Boleto', 'Cartão', 'Transferência', 'Cheque', 'Crédito loja'];

const r2 = (x) => Math.round((Number(x) || 0) * 100) / 100;

// dd/mm/aaaa + N dias → dd/mm/aaaa. Sem data válida devolve "+Nd" (rótulo).
function addDias(dataStr, dias) {
  if (!dataStr) return `+${dias}d`;
  const m = dataStr.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
  if (!m) return `+${dias}d`;
  const d = new Date(+m[3], +m[2] - 1, +m[1]);
  d.setDate(d.getDate() + dias);
  return `${String(d.getDate()).padStart(2, "0")}/${String(d.getMonth() + 1).padStart(2, "0")}/${d.getFullYear()}`;
}

// "30/60/90", "à vista", "Cartão 3x", "30 dias" → lista de parcelas.
//
// ⚠️ CENTAVOS: a versão anterior fazia total/nParc e repetia o mesmo valor em
// todas — 3× sobre R$ 300,01 dava 3 × 100,003…, e a soma não fechava com o
// total. Agora arredonda cada parcela e joga a sobra na ÚLTIMA, igual ao
// gerarEntradaRestante. A soma bate com o total, sempre.
function parseParcelas(cond, total, dataVenda) {
  if (!cond || !total) return [];
  const formaForCond = (c) => {
    if (/PIX/i.test(c))    return "PIX";
    if (/Cart/i.test(c))   return "Cartão";
    if (/Boleto/i.test(c)) return "Boleto";
    return "Dinheiro";
  };
  const conta = "Conta corrente · Itaú";
  // ⚠️ Regex SEM caractere acentuado literal: à = "à", × = "×".
  // @babel/standalone quebra o arquivo inteiro (tela preta) com acento em regex.
  if (/\u00e0?\s*vista/i.test(cond)) {
    return [{ venc: dataVenda || "—", valor: r2(total), forma: formaForCond(cond), conta }];
  }
  const m = cond.match(/(\d+)(?:[\/x\u00d7](\d+))?(?:[\/x\u00d7](\d+))?/i);
  if (!m) return [];
  const dias = [m[1], m[2], m[3]].filter(Boolean).map(Number);
  const isCartao = /cart/i.test(cond);
  const nParc = isCartao ? dias[0] : dias.length;
  if (!nParc) return [];
  const parcArr = [];
  const each = r2(total / nParc);
  for (let i = 0; i < nParc; i++) {
    const offsetDias = isCartao ? (i + 1) * 30 : dias[i];
    const valor = i === nParc - 1 ? r2(total - each * (nParc - 1)) : each;   // centavos na última
    parcArr.push({ venc: addDias(dataVenda, offsetDias), valor, forma: formaForCond(cond), conta });
  }
  return parcArr;
}

// 1ª parcela = entrada; o restante dividido em n−1, com a sobra na última.
function gerarEntradaRestante(total, entrada, n, dataVenda, forma) {
  const f = forma || 'PIX';
  const ent = r2(entrada);
  const restN = Math.max(0, (parseInt(n) || 0) - 1);
  const restante = r2(total - ent);
  const vp = restN > 0 ? r2(restante / restN) : 0;
  const out = [{ venc: dataVenda || '', valor: ent, forma: f, conta: '' }];
  for (let i = 0; i < restN; i++) {
    const valor = i === restN - 1 ? r2(restante - vp * (restN - 1)) : vp;   // centavos na última
    out.push({ venc: addDias(dataVenda, (i + 1) * 30), valor, forma: f, conta: '' });
  }
  return out;
}

const somaParcelas = (parcelas) => r2((parcelas || []).reduce((a, p) => a + (parseFloat(p.valor) || 0), 0));
// > 0 = falta; < 0 = excede; 0 = fecha.
const diferencaParcelas = (total, parcelas) => r2((Number(total) || 0) - somaParcelas(parcelas));

const hojeBR = () => {
  const d = new Date();
  return `${String(d.getDate()).padStart(2, '0')}/${String(d.getMonth() + 1).padStart(2, '0')}/${d.getFullYear()}`;
};

// ─── Editor visual de parcelas ───────────────────────────────────────────────
// Mesma tabela/totalizador do pedido de venda, agora como componente.
// `contas` = [{id, nome}]; `onCadastrarConta(nome)` opcional (só o pedido de
// venda cadastra conta na hora — na compra o seletor fica sem a opção).
function ParcelasEditor({ parcelas, onChange, total, contas, onCadastrarConta, dataBase, formaPadrao }) {
  const lista = parcelas || [];
  const setCampo = (i, campo, valor) => onChange(lista.map((p, idx) => idx === i ? { ...p, [campo]: valor } : p));
  const remover = (i) => onChange(lista.filter((_, idx) => idx !== i));
  const adicionar = () => onChange([...lista, { venc: dataBase || hojeBR(), valor: 0, forma: formaPadrao || 'Boleto', conta: '' }]);
  const diff = diferencaParcelas(total, lista);

  return (
    <>
      {lista.length > 0 && (
        <div className="parcelas-table">
          <div className="ph">
            <div>Nº</div><div>Vencimento</div><div className="num right">Valor (R$)</div><div>Forma</div><div>Conta</div><div></div>
          </div>
          {lista.map((par, i) => (
            <div key={i} className="pr">
              <div className="num">{i + 1}</div>
              <input className="input" value={par.venc || ''} onChange={e => setCampo(i, 'venc', e.target.value)} placeholder="dd/mm/aaaa" />
              <input className="input num right" type="number" step="0.01" min="0"
                value={par.valor != null ? par.valor : ''}
                onChange={e => setCampo(i, 'valor', e.target.value === '' ? 0 : parseFloat(e.target.value) || 0)}
                style={{ fontVariantNumeric: 'tabular-nums' }} />
              <select className="input" value={par.forma || ''} onChange={e => setCampo(i, 'forma', e.target.value)}>
                {FORMAS_PARCELA.map(f => <option key={f} value={f}>{f}</option>)}
                {par.forma && FORMAS_PARCELA.indexOf(par.forma) === -1 && <option value={par.forma}>{par.forma}</option>}
              </select>
              <select className="input" value={par.conta || ''} onChange={e => {
                if (e.target.value === '__nova__' && onCadastrarConta) {
                  const nome = prompt('Nome da nova conta bancária:');
                  if (nome && nome.trim()) { onCadastrarConta(nome.trim()); setCampo(i, 'conta', nome.trim()); }
                } else { setCampo(i, 'conta', e.target.value); }
              }}>
                <option value="">Selecionar conta…</option>
                {(contas || []).map(c => <option key={c.id} value={c.nome}>{c.nome}</option>)}
                {par.conta && !(contas || []).some(c => c.nome === par.conta) && <option value={par.conta}>{par.conta}</option>}
                {onCadastrarConta && <option value="__nova__">+ Cadastrar nova conta</option>}
              </select>
              <button className="icon-btn" title="Remover" onClick={() => remover(i)}><Icon name="trash-2" size={14} /></button>
            </div>
          ))}
          <div style={{ padding: '6px 8px', fontSize: 11.5, marginTop: 4, display: 'flex', alignItems: 'center', gap: 6,
                        color: diff === 0 ? 'var(--tm-success)' : (diff > 0 ? 'var(--tm-warning)' : 'var(--tm-danger)') }}>
            <Icon name={diff === 0 ? 'check-circle' : 'alert-triangle'} size={13} />
            {diff === 0
              ? `Parcelas conferem com o total (R$ ${brl(total)})`
              : diff > 0
                ? `Faltam R$ ${brl(diff)} para fechar o total (R$ ${brl(total)})`
                : `Parcelas excedem o total em R$ ${brl(Math.abs(diff))}`}
          </div>
        </div>
      )}
      <button onClick={adicionar} style={{
        display: 'flex', alignItems: 'center', gap: 6, marginTop: 8, padding: '6px 14px', borderRadius: 6,
        background: 'var(--tm-bg-3)', border: '1px dashed var(--tm-line-2)',
        color: 'var(--tm-brand-champagne)', fontSize: 12, fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit',
      }}>
        <Icon name="plus" size={13} /> Adicionar parcela
      </button>
    </>
  );
}

Object.assign(window, {
  FORMAS_PARCELA, addDias, parseParcelas, gerarEntradaRestante,
  somaParcelas, diferencaParcelas, hojeBR, ParcelasEditor,
});
