// ═══════════════════════════════════════════════════════════════════
// Motor de cálculo — comissionamento Escalab
// Lê regras como DADO (não código) e calcula comissões por vendedor.
// ═══════════════════════════════════════════════════════════════════

function brl(n) {
  if (n === 0 || n == null) return 'R$ 0';
  return 'R$ ' + Math.round(n).toLocaleString('pt-BR');
}
function brlCents(n) {
  return 'R$ ' + n.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}
function pct(n) { return (n * 100).toFixed(1).replace('.', ',') + '%'; }

// Rateio proporcional por salário entre vendedores no MESMO papel
function ratearPorSalario(valorTotal, envolvidos, vendedores) {
  const pessoas = envolvidos.map(p => vendedores.find(v => v.id === p.v)).filter(Boolean);
  const soma = pessoas.reduce((s, p) => s + p.salario, 0);
  if (soma === 0) return [];
  return pessoas.map(p => ({
    vendedorId: p.id,
    nome: p.nome,
    valor: valorTotal * (p.salario / soma),
    salario: p.salario,
    fracao: p.salario / soma,
  }));
}

function markupParaPercentual(markup, regras) {
  if (markup <= 25) return regras.fixa.markup_baixo.valor / 100;
  if (markup <= 35) return regras.fixa.markup_medio.valor / 100;
  return regras.fixa.markup_alto.valor / 100;
}

// Rótulos dos tipos de gatilho para o extrato
const GATILHO_ROTULO = {
  reuniao:        'Reunião institucional qualificada',
  proposta:       'Proposta técnica aprovada',
  proposta_fidel: 'Proposta aprovada (Fidelização)',
  proposta_bonus: 'Bônus — margem acima da meta',
  nps:            'NPS ≥ 3,5/4',
  publicacao:     'Autorização publicação de dados',
  edital:         'Edital submetido',
};

// Calcula comissão total por vendedor a partir de leads + regras
function calcularComissoes(leads, regras, vendedores) {
  const porVendedor = {};
  const linhas = []; // linha detalhada para extrato
  vendedores.forEach(v => { porVendedor[v.id] = { variavel: 0, fixaSetor: 0, fixaAdicional: 0, evento: 0, total: 0, linhas: [] }; });

  leads.forEach(lead => {
    if (!lead.comissiona) return;

    // ── Comissão fixa pré-calculada (casos especiais como Worley) ──────────
    if (lead.comissaoFixaManual) {
      Object.entries(lead.comissaoFixaManual).forEach(([vid, val]) => {
        if (porVendedor[vid] !== undefined) {
          porVendedor[vid].fixaSetor += val;
          porVendedor[vid].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Comissão fixa — projeto fechado', valor: val });
        }
      });
    }

    // ── Sistema de gatilhos (novo) — tem precedência sobre lógica legada ──
    const gatilhosOk = (lead.gatilhos || []).filter(g => g.ok);
    if (gatilhosOk.length > 0) {
      gatilhosOk.forEach(gatilho => {
        const comIds = gatilho.comissionados || [];
        if (comIds.length === 0) return;
        let valor = 0;
        switch (gatilho.tipo) {
          case 'reuniao':        valor = regras.variavel.prosp_reuniao?.valor || regras.variavel.qualif_reuniao?.valor || 250; break;
          case 'proposta':       valor = regras.variavel.proposta_base?.valor || 500; break;
          case 'proposta_fidel': valor = regras.variavel.fideliz_proposta?.valor || 1000; break;
          case 'proposta_bonus': valor = regras.variavel.proposta_bonus?.valor || 100; break;
          case 'nps': {
            const nota = parseFloat(String(gatilho.extra || '0').replace(',', '.'));
            if (nota < 3.5) return;
            valor = regras.variavel.fideliz_nps?.valor || 1000;
            break;
          }
          case 'publicacao': valor = regras.variavel.fideliz_publi?.valor || 250; break;
          case 'edital':     valor = regras.variavel.edital_sub?.valor || 1500; break;
          default: return;
        }
        const envolvidos = comIds.map(id => vendedores.find(v => v.id === id)).filter(Boolean);
        const somaSal = envolvidos.reduce((s, v) => s + v.salario, 0);
        envolvidos.forEach(v => {
          if (!porVendedor[v.id]) return;
          const fracao = somaSal > 0 ? v.salario / somaSal : 1 / envolvidos.length;
          const val = valor * fracao;
          porVendedor[v.id].variavel += val;
          porVendedor[v.id].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: GATILHO_ROTULO[gatilho.tipo] || gatilho.tipo, valor: val });
        });
      });
      // Comissão fixa do lead (proporcional por participações, independente dos gatilhos)
      // Pulado quando comissaoFixaManual já definiu os valores exatos (ex: Worley)
      if (lead.vendido && lead.valor > 0 && !lead.comissaoFixaManual) {
        const V = lead.valor;
        const taxaPct = markupParaPercentual(lead.markup, regras);
        const comissaoFixaTotal = V * taxaPct;
        const participantes = lead.participacoes || [];
        if (participantes.length > 0) {
          ratearPorSalario(comissaoFixaTotal, participantes, vendedores).forEach(r => {
            porVendedor[r.vendedorId].fixaSetor += r.valor;
            porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Comissão fixa (proporcional ao salário)', valor: r.valor });
          });
        }
      }
      return; // pula lógica legada para este lead
    }
    // ── Lógica legada (leads sem gatilhos definidos) ───────────────

    // ── Lógica legada continua abaixo ─────────────────────────────────
    // Participações agrupadas por papel
    const porPapel = {};
    (lead.participacoes || []).forEach(p => {
      if (!porPapel[p.papel]) porPapel[p.papel] = [];
      porPapel[p.papel].push(p);
    });

    // 1) Comissão variável por gatilho
    if (lead.qualificado === 'sim' && porPapel['Qualificador']) {
      const dispensa = lead.origem === 'fidelizacao' || lead.origem === 'eventos';
      if (!dispensa) {
        const rKey = regras.variavel.qualif_reuniao ? 'qualif_reuniao'
                   : regras.variavel.prosp_reuniao  ? 'prosp_reuniao'
                   : 'ativa_reuniao';
        const v = (regras.variavel[rKey] || regras.variavel.ativa_reuniao)?.valor || 250;
        ratearPorSalario(v, porPapel['Qualificador'], vendedores).forEach(r => {
          porVendedor[r.vendedorId].variavel += r.valor;
          porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Lead qualificado', valor: r.valor });
        });
      }
    }

    if (lead.proposta === 'aprovada' && porPapel['Finalizador']) {
      const vBase = regras.variavel.proposta_base ? regras.variavel.proposta_base.valor : 500;
      ratearPorSalario(vBase, porPapel['Finalizador'], vendedores).forEach(r => {
        porVendedor[r.vendedorId].variavel += r.valor;
        porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Proposta aprovada', valor: r.valor });
      });
      // Bônus R$100 se markup acima de 35% (meta de margem)
      if (lead.markup > 35 && regras.variavel.proposta_bonus) {
        const vBonus = regras.variavel.proposta_bonus.valor;
        ratearPorSalario(vBonus, porPapel['Finalizador'], vendedores).forEach(r => {
          porVendedor[r.vendedorId].variavel += r.valor;
          porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Bônus margem acima da meta (+R$100)', valor: r.valor });
        });
      }
    }

    if (lead.origem === 'eventos' && porPapel['Organizador']) {
      const rEvento = regras.variavel.evento_10 || regras.variavel.proposta_base;
      const v = rEvento?.valor || 250;
      ratearPorSalario(v, porPapel['Organizador'], vendedores).forEach(r => {
        porVendedor[r.vendedorId].variavel += r.valor;
        porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Evento 10+ leads qualificados', valor: r.valor });
      });
    }

    // 2) Comissão fixa sobre venda
    if (lead.vendido && lead.valor > 0) {
      const V = lead.valor;
      const taxaPct = markupParaPercentual(lead.markup, regras);
      const comissaoFixaTotal = V * taxaPct;

      // Comissão fixa: somente para quem está nas participações do lead, rateada por salário
      const participantes = lead.participacoes || [];
      if (participantes.length > 0) {
        ratearPorSalario(comissaoFixaTotal, participantes, vendedores).forEach(r => {
          porVendedor[r.vendedorId].fixaSetor += r.valor;
          porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Comissão fixa (proporcional ao salário)', valor: r.valor });
        });
      }

      // Adicional eventos (legado — regra ativa apenas se definida em regras.fixa)
      if (lead.origem === 'eventos') {
        if (porPapel['Organizador'] && regras.fixa.evento_origem) {
          const v = V * regras.fixa.evento_origem.valor;
          ratearPorSalario(v, porPapel['Organizador'], vendedores).forEach(r => {
            porVendedor[r.vendedorId].evento += r.valor;
            porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Adicional organizador (0,01×V)', valor: r.valor });
          });
        }
        if (porPapel['Executor'] && regras.fixa.evento_exec) {
          const v = V * regras.fixa.evento_exec.valor;
          ratearPorSalario(v, porPapel['Executor'], vendedores).forEach(r => {
            porVendedor[r.vendedorId].evento += r.valor;
            porVendedor[r.vendedorId].linhas.push({ lead: lead.lead, origem: lead.origem, gatilho: 'Adicional executor evento (0,025×V)', valor: r.valor });
          });
        }
      }
    }
  });

  // Totais
  Object.keys(porVendedor).forEach(vid => {
    const d = porVendedor[vid];
    d.total = d.variavel + d.fixaSetor + d.fixaAdicional + d.evento;
  });

  return porVendedor;
}

function resumoPorOrigem(leads, metas) {
  const resumo = {};
  Object.keys(metas).forEach(k => { resumo[k] = { vendido: 0, meta: metas[k].valor, label: metas[k].label, leads: 0 }; });
  leads.forEach(l => {
    const origemMap = { ativa: 'ativa', parceiros: 'parceiros', hunter: 'hunter', fidelizacao: 'fidelizacao', eventos: 'eventos', marketing: 'marketing', site: 'site' };
    const k = origemMap[l.origem];
    if (!k || !resumo[k]) return;
    resumo[k].leads += 1;
    if (l.vendido && l.comissiona) resumo[k].vendido += l.valor;
  });
  return resumo;
}

Object.assign(window, { brl, brlCents, pct, calcularComissoes, resumoPorOrigem, ratearPorSalario, markupParaPercentual });
