/* ANISAN — Plano de Contas (despesas / saídas) extraído de planocontas.csv.
   Apenas grupos de saída: 4 Custos Variáveis, 5 Despesas Fixas, 6 Investimentos,
   7.2 Saídas não operacionais. Cada item é uma conta-folha {code, name}.
   Receitas (grupo 3) e entradas (7.1) ficam fora — aqui classificamos despesas. */

window.PLANO_DESPESAS = [
  { code: "4", name: "Custos Variáveis", subs: [
    { code: "4.1", name: "Custos tributários ou financeiros", contas: [
      { code: "4.1.1", name: "Simples nacional - Icms" },
      { code: "4.1.2", name: "Taxas de cartões" },
      { code: "4.1.3", name: "PIS | CONFINS" },
      { code: "4.1.4", name: "Taxas via aplicativo" },
      { code: "4.1.99", name: "Outros custos financeiros" },
    ]},
    { code: "4.2", name: "Custos com produtos", contas: [
      { code: "4.2.1", name: "Pescados/Frutos do mar" },
      { code: "4.2.2", name: "Insumos" },
      { code: "4.2.3", name: "Bebidas" },
      { code: "4.2.4", name: "Hortifruti" },
      { code: "4.2.5", name: "Compras CMV" },
      { code: "4.2.99", name: "Outros custos com produtos" },
    ]},
    { code: "4.3", name: "Custos com embalagens", contas: [
      { code: "4.3.1", name: "Custos com embalagens" },
      { code: "4.3.99", name: "Outros custos com embalagens" },
    ]},
    { code: "4.4", name: "Custo com frete", contas: [
      { code: "4.4.1", name: "Transportadoras" },
      { code: "4.4.2", name: "Comissão" },
      { code: "4.4.99", name: "Outros custos com mão de obra variável" },
    ]},
    { code: "4.5", name: "Custos com comissão", contas: [
      { code: "4.5.1", name: "Comissão entregadores" },
      { code: "4.5.2", name: "Comissão garçons" },
      { code: "4.5.3", name: "Comissão cozinheiros" },
    ]},
    { code: "4.6", name: "Outros custos de vendas", contas: [
      { code: "4.6.1", name: "Gás" },
      { code: "4.6.99", name: "Outros custos com vendas" },
    ]},
  ]},
  { code: "5", name: "Despesas Fixas", subs: [
    { code: "5.1", name: "Despesas financeiras", contas: [
      { code: "5.1.1", name: "Tarifas bancárias" },
      { code: "5.1.2", name: "Aluguel de máquinas de cartão" },
      { code: "5.1.3", name: "Tarifas DOC | TED | PIX" },
      { code: "5.1.99", name: "Outros custos com despesas financeiras" },
    ]},
    { code: "5.2", name: "Despesas administrativas", contas: [
      { code: "5.2.1", name: "Telefone e internet" },
      { code: "5.2.2", name: "Celular" },
      { code: "5.2.3", name: "Energia elétrica" },
      { code: "5.2.4", name: "Aluguel e condomínio" },
      { code: "5.2.5", name: "Água" },
      { code: "5.2.6", name: "IPTU e taxas públicas" },
      { code: "5.2.7", name: "Táxi / Uber" },
      { code: "5.2.8", name: "Almoço / Supermercado / Lanches" },
      { code: "5.2.9", name: "Correios" },
      { code: "5.2.10", name: "Cartórios" },
      { code: "5.2.11", name: "Contador" },
      { code: "5.2.12", name: "Mensalidade de softwares" },
      { code: "5.2.13", name: "Alarme monitorado / Segurança" },
      { code: "5.2.99", name: "Outras despesas administrativas" },
    ]},
    { code: "5.3", name: "Despesas com pessoal", contas: [
      { code: "5.3.1", name: "Salário de funcionários" },
      { code: "5.3.2", name: "Bolsa de estágio" },
      { code: "5.3.3", name: "VT e VR" },
      { code: "5.3.4", name: "Rescisão" },
      { code: "5.3.5", name: "FGTS" },
      { code: "5.3.6", name: "INSS - Federação - Sindicato - IR" },
      { code: "5.3.7", name: "13º e férias" },
      { code: "5.3.8", name: "Exames ocupacionais" },
      { code: "5.3.9", name: "Pro-Labores" },
      { code: "5.3.10", name: "Plano de saúde" },
      { code: "5.3.11", name: "Confraternizações / Festas da empresa" },
      { code: "5.3.12", name: "Diarista" },
      { code: "5.3.99", name: "Outras despesas com pessoal" },
    ]},
    { code: "5.4", name: "Despesas com materiais e equipamentos", contas: [
      { code: "5.4.1", name: "Manutenção máquinas e equipamentos" },
      { code: "5.4.2", name: "Serviços técnicos em geral" },
      { code: "5.4.3", name: "Materiais de expediente / escritório" },
      { code: "5.4.4", name: "Materiais de limpeza e manutenção predial" },
      { code: "5.4.5", name: "Compra de utensílios em geral" },
      { code: "5.4.99", name: "Outras despesas com materiais" },
    ]},
    { code: "5.5", name: "Despesas com veículos", contas: [
      { code: "5.5.1", name: "Gasolina / Combustível" },
      { code: "5.5.2", name: "Manutenção de veículos" },
      { code: "5.5.3", name: "IPVA / Licenciamento / Despachante" },
      { code: "5.5.4", name: "Estacionamento / Pedágios" },
      { code: "5.5.99", name: "Outras despesas com veículos" },
    ]},
    { code: "5.8", name: "Outros tipos de despesas", contas: [
      { code: "5.8", name: "Outros tipos de despesas" },
    ]},
  ]},
  { code: "6", name: "Investimentos", subs: [
    { code: "6.1", name: "Investimentos em marketing", contas: [
      { code: "6.1.1", name: "Papelaria (folder, cartão visitas, etc.)" },
      { code: "6.1.2", name: "Site / Internet" },
      { code: "6.1.3", name: "Mídias / Propaganda" },
      { code: "6.1.4", name: "Realização eventos" },
      { code: "6.1.5", name: "Prestadores de serviços de marketing" },
      { code: "6.1.99", name: "Outros investimentos em marketing" },
    ]},
    { code: "6.2", name: "Investimentos em bens materiais", contas: [
      { code: "6.2.1", name: "Compra de equipamentos de informática" },
      { code: "6.2.2", name: "Reformas / Estrutura" },
      { code: "6.2.3", name: "Mobiliário" },
      { code: "6.2.4", name: "Compra de veículos" },
      { code: "6.2.99", name: "Outros investimentos em bens materiais" },
    ]},
    { code: "6.3", name: "Investimentos em desenvolvimento empresarial", contas: [
      { code: "6.3.1", name: "Consultoria" },
      { code: "6.3.2", name: "Treinamentos" },
      { code: "6.3.99", name: "Outros investimentos desenv. empresarial" },
    ]},
    { code: "6.4", name: "Outros investimentos", contas: [
      { code: "6.4.99", name: "Outros investimentos" },
    ]},
  ]},
  { code: "7.2", name: "Saídas não operacionais", subs: [
    { code: "7.2", name: "Saídas não operacionais", contas: [
      { code: "7.2.1", name: "Pagamento de empréstimos" },
      { code: "7.2.2", name: "Juros bancários e por atraso" },
      { code: "7.2.3", name: "Pagamento de dívidas passadas" },
      { code: "7.2.4", name: "Distribuição de lucros" },
      { code: "7.2.5", name: "Juros de antecipação de recebíveis" },
      { code: "7.2.99", name: "Outras saídas não operacionais" },
    ]},
  ]},
];

/* Entradas não operacionais (7.1) — inflows fora da operação. Classificáveis no
   livro de Faturamento (entradas) e exibidas no DRE no grupo 7. */
window.PLANO_NAO_OP_ENTRADAS = { code: "7.1", name: "Entradas não operacionais", contas: [
  { code: "7.1.1", name: "Empréstimos obtidos" },
  { code: "7.1.2", name: "Capitalização dos sócios" },
  { code: "7.1.3", name: "Venda de equipamentos usados" },
  { code: "7.1.99", name: "Outras entradas não operacionais" },
]};

/* Acerto de caixa (13 / 99.98) — ajustes / saldo inicial. Classificáveis em
   ambos os livros e exibidos como memorando no DRE. */
window.PLANO_ACERTO = [
  { code: "13.99", name: "Saldo inicial padrão yampa" },
  { code: "99.98", name: "Acerto de caixa" },
];

/* ANISAN — Plano de Receitas (entradas / faturamento), grupo 3. Preenchido
   diariamente nos cards de Faturamento do Painel; cada valor já recebe a
   classificação da conta-folha correspondente. */
window.PLANO_RECEITAS = [
  { code: "3.1", name: "Receita de vendas", contas: [
    { code: "3.1.1", name: "Receita em dinheiro" },
    { code: "3.1.2", name: "Receitas cartões de débito" },
    { code: "3.1.3", name: "Receitas cartões de crédito" },
    { code: "3.1.4", name: "Receitas cartão alimentação" },
    { code: "3.1.5", name: "Receitas cartão refeição" },
    { code: "3.1.6", name: "Receitas via transferência bancária" },
    { code: "3.1.7", name: "Receitas via aplicativo" },
    { code: "3.1.99", name: "Outros produtos/serviços" },
  ]},
  { code: "3.2", name: "Outras receitas de vendas", contas: [
    { code: "3.2.99", name: "Outras receitas de vendas" },
  ]},
  { code: "3.3", name: "Recebimento de juros", contas: [
    { code: "3.3", name: "Recebimento de juros" },
  ]},
];

/* code → "código · nome" and code → group name, for labels/badges. */
(function () {
  const byCode = {};
  const groupOf = {};
  const subOf = {};
  const selectGroups = [];
  window.PLANO_DESPESAS.forEach((g) => {
    const groupOpts = [];
    g.subs.forEach((sub) => {
      sub.contas.forEach((c) => {
        byCode[c.code] = c.name;
        groupOf[c.code] = g.name;
        subOf[c.code] = sub.name;
        groupOpts.push({ value: c.code, label: c.code + " · " + c.name });
      });
    });
    selectGroups.push({ label: g.code + " · " + g.name, options: groupOpts });
  });
  // Receitas (grupo 3) entram no mesmo mapa de rótulos/classificação.
  (window.PLANO_RECEITAS || []).forEach((g) => {
    g.contas.forEach((c) => { byCode[c.code] = c.name; groupOf[c.code] = g.name; subOf[c.code] = g.name; });
  });
  // Entradas não operacionais (7.1) e Acerto de caixa (13/99.98) no mapa.
  (window.PLANO_NAO_OP_ENTRADAS.contas || []).forEach((c) => { byCode[c.code] = c.name; groupOf[c.code] = "Movimentações não operacionais"; subOf[c.code] = window.PLANO_NAO_OP_ENTRADAS.name; });
  (window.PLANO_ACERTO || []).forEach((c) => { byCode[c.code] = c.name; groupOf[c.code] = "Acerto de caixa"; subOf[c.code] = "Acerto de caixa"; });
  window.planoNome = (code) => byCode[code] || null;
  window.planoLabel = (code) => (code && byCode[code]) ? (code + " · " + byCode[code]) : "Sem classificação";
  window.planoTrail = (code) => {
    if (!code || !byCode[code]) return null;
    const parts = [groupOf[code]];
    if (subOf[code] && subOf[code] !== byCode[code]) parts.push(subOf[code]);
    parts.push(byCode[code]);
    return parts.join(" › ");
  };
  window.planoSelectGroups = selectGroups;

  /* Catálogo completo de despesas = todas as contas-folha do plano (grupos de
     saída 4/5/6/7.2), nomeadas pela última classificação. É a lista padrão de
     "despesas cadastradas". */
  const catalogo = [];
  window.PLANO_DESPESAS.forEach((g) => g.subs.forEach((sub) => sub.contas.forEach((c) => {
    catalogo.push({ id: "pc-" + c.code, nome: c.name, plano: c.code, conta: "Cash" });
  })));
  window.PLANO_CATALOGO = catalogo;
  window.CATALOGO_VERSION = 4;

  /* Plano de RECEITAS (grupo 3) como grupos de <Select> + catálogo de receitas
     (todas as contas-folha de receita, nomeadas pela classificação). */
  const receitaGroups = [];
  const receitaCatalogo = [];
  (window.PLANO_RECEITAS || []).forEach((g) => {
    const opts = [];
    g.contas.forEach((c) => {
      const label = (c.code === g.code && c.name === g.name) ? (c.code + " · " + c.name) : (c.code + " · " + c.name);
      opts.push({ value: c.code, label });
      receitaCatalogo.push({ id: "rc-" + c.code, nome: c.name, plano: c.code, conta: c.code === "3.1.1" ? "Cash" : "Stone" });
    });
    receitaGroups.push({ label: g.code + " · " + g.name, options: opts });
  });
  window.receitaSelectGroups = receitaGroups;
  // Entradas não operacionais + Acerto de caixa também classificáveis como entrada.
  receitaGroups.push({ label: window.PLANO_NAO_OP_ENTRADAS.code + " · " + window.PLANO_NAO_OP_ENTRADAS.name, options: window.PLANO_NAO_OP_ENTRADAS.contas.map((c) => ({ value: c.code, label: c.code + " · " + c.name })) });
  receitaGroups.push({ label: "Acerto de caixa", options: window.PLANO_ACERTO.map((c) => ({ value: c.code, label: c.code + " · " + c.name })) });
  window.RECEITA_CATALOGO = receitaCatalogo;
  window.RECEITA_CATALOGO_VERSION = 1;

  // Semear o catálogo completo no SEED (PlanoContas.jsx carrega após Data.jsx).
  if (window.ANISAN_SEED) {
    window.ANISAN_SEED.despesasCadastradas = catalogo.map((x) => ({ ...x }));
    window.ANISAN_SEED.catalogoVersion = window.CATALOGO_VERSION;
    window.ANISAN_SEED.receitasCadastradas = receitaCatalogo.map((x) => ({ ...x }));
    window.ANISAN_SEED.receitasCatalogoVersion = window.RECEITA_CATALOGO_VERSION;
  }
})();
