/**
 * Como o histórico do fornecedor se lê.
 *
 * A tela `/dashboard/fornecedores/meus-fornecedores/[id]/historico` promete
 * "cadastro, importação, compras e contas a pagar em ordem cronológica". Ela
 * traduzia dez ações e mostrava as outras sete cruas: quem abria o histórico
 * de um fornecedor lia `purchase.status_changed` e `material.updated` na
 * linha do tempo, como se fosse mensagem de erro.
 *
 * O nome de cada ação passa a morar aqui, num lugar só, com teste que varre o
 * código atrás de ação escrita sem rótulo. Acrescentar uma ação nova numa rota
 * e esquecer da tradução deixa de ser possível sem o teste avisar.
 */

/** O que cada ação gravada no `supplier_activity_log` significa em português. */
export const ROTULO_DA_ACAO: Record<string, string> = {
  /* O cadastro */
  "supplier.created": "Fornecedor criado",
  "supplier.updated": "Fornecedor atualizado",
  "supplier.deleted": "Fornecedor removido",

  /* A compra */
  "purchase.created": "Compra registrada",
  "purchase.status_changed": "Situação da compra alterada",
  "purchase.received": "Mercadoria recebida",
  "purchase.deleted": "Compra excluída",
  "purchase.link_reissued": "Link público renovado",

  /* O dinheiro */
  "payable.created": "Conta criada",
  "payable.created_from_purchase": "Conta criada pela compra",
  "payable.updated": "Conta atualizada",
  "payable.paid": "Conta paga",
  "payable.deleted": "Conta excluída",

  /* Os materiais que este fornecedor vende */
  "material.created": "Material do fornecedor cadastrado",
  "material.updated": "Material do fornecedor atualizado",
  "material.deleted": "Material do fornecedor removido",

  /* A planilha */
  "import.created": "Importado da planilha",
  "import.updated": "Importação atualizou o cadastro",
};

/**
 * O nome da ação, sempre legível.
 *
 * Ação desconhecida vira uma frase e não o identificador técnico: um dia
 * alguém acrescenta uma ação e publica antes de passar por aqui, e a linha do
 * tempo continua fazendo sentido para quem lê.
 */
export function rotuloDaAcao(acao: string): string {
  const conhecido = ROTULO_DA_ACAO[acao];
  if (conhecido) return conhecido;

  const [familia] = acao.split(".");
  if (familia === "purchase") return "Movimentação na compra";
  if (familia === "payable") return "Movimentação na conta a pagar";
  if (familia === "material") return "Movimentação no material";
  if (familia === "import") return "Movimentação da importação";
  if (familia === "supplier") return "Movimentação no cadastro";
  return "Movimentação registrada";
}

/** A que parte do módulo o evento pertence, para a etiqueta colorida. */
export type FamiliaDoEvento = "compra" | "conta" | "importacao" | "material" | "cadastro";

/**
 * A etiqueta sai da AÇÃO, não do `entity_type`.
 *
 * Os eventos de material são gravados com `entity_type: "supplier"`, porque
 * material do fornecedor não é entidade própria do log. Lendo o tipo, todos
 * eles apareciam etiquetados como "Fornecedor". A ação sabe mais.
 */
export function familiaDoEvento(acao: string, tipoDaEntidade: string): FamiliaDoEvento {
  const [familia] = acao.split(".");
  if (familia === "purchase") return "compra";
  if (familia === "payable") return "conta";
  if (familia === "import") return "importacao";
  if (familia === "material") return "material";
  if (tipoDaEntidade === "purchase_order") return "compra";
  if (tipoDaEntidade === "payable") return "conta";
  if (tipoDaEntidade === "import") return "importacao";
  return "cadastro";
}

export const ROTULO_DA_FAMILIA: Record<FamiliaDoEvento, string> = {
  compra: "Compra",
  conta: "Conta a pagar",
  importacao: "Importação",
  material: "Material",
  cadastro: "Fornecedor",
};

/**
 * Os detalhes do evento, escritos para gente.
 *
 * O log guarda o payload cru, com os nomes de campo do código. A tela mostrava
 * `itemsCount: 2`, `totalAmount: 1775` e `materialId: 80c3ccf6-…` na linha do
 * tempo, ao lado de frases em português. Identificador não diz nada a quem
 * está lendo, e ocupa o lugar do detalhe que diria.
 */
const ROTULO_DO_CAMPO: Record<string, string> = {
  itemsCount: "itens",
  totalAmount: "valor",
  description: "descrição",
  name: "nome",
  unit: "unidade",
  status: "situação",
  statusAnterior: "situação anterior",
  dueDate: "vencimento",
  amount: "valor",
  quantity: "quantidade",
  supplier: "fornecedor",
  entradasNoEstoque: "entradas no estoque",
  fatorDeRateio: "fator de rateio",
  extras: "frete e imposto",
  subtotal: "valor dos itens",
  itens_recebidos: "itens recebidos",
  entradas_no_estoque: "entradas no estoque",
  total_da_compra: "total da compra",
  extras_rateados: "frete e imposto rateados",
  observacao: "observação",
  linhas: "linhas",
  criados: "criados",
  atualizados: "atualizados",
};

/** Campo que é identificador não vira detalhe na tela. */
function ehIdentificador(campo: string) {
  const enxuto = campo.toLowerCase();
  return enxuto === "id" || enxuto.endsWith("id") || enxuto.endsWith("_id") || enxuto.endsWith("uuid");
}

/** Até três detalhes do evento, em português e sem identificador. */
export function detalhesDoEvento(payload: Record<string, unknown> | null | undefined): string[] {
  const entradas = Object.entries(payload ?? {}).filter(
    ([campo, valor]) => valor !== null && valor !== undefined && valor !== "" && !ehIdentificador(campo)
  );
  return entradas.slice(0, 3).map(([campo, valor]) => {
    const rotulo = ROTULO_DO_CAMPO[campo] ?? campo.replace(/_/g, " ");
    const texto = typeof valor === "boolean" ? (valor ? "sim" : "não") : String(valor);
    return `${rotulo}: ${texto}`;
  });
}
