import { StatusPedido } from "./xbz.types.ts";

/**
 * O status logístico da XBZ traduzido para as seis etapas do painel.
 *
 * A lista conhecida vem da documentação; a XBZ usa outras frases que ela não
 * cita (o primeiro pedido feito pela integração, em 05/10/2026, nasceu como
 * "AGUARDANDO APROVAÇÃO DO SETOR DE VENDAS"). Frase nova cai nas regras de
 * baixo, pelas palavras, em vez de virar "aguardando" às cegas.
 *
 * Fica fora do serviço para a tela e o servidor usarem a mesma conta.
 */

const CONHECIDOS: Record<string, StatusPedido> = {
  "PEDIDO EMITIDO": StatusPedido.AGUARDANDO,
  "AGUARDANDO APROVACAO DO SETOR DE VENDAS": StatusPedido.AGUARDANDO,
  "AGUARDANDO PAGAMENTO PARA INICIAR A SEPARACAO": StatusPedido.AGUARDANDO,
  "EM PROCESSO DE SEPARACAO": StatusPedido.PRODUCAO,
  "PRONTO E DISPONIVEL PARA RETIRADA": StatusPedido.PRONTO,
  "PREPARANDO PEDIDOS PARA TRANSPORTADORA": StatusPedido.ENVIADO,
  "AGUARDANDO TRANSPORTADORA": StatusPedido.ENVIADO,
  "RETIRADO/ENVIADO/FINALIZADO": StatusPedido.FINALIZADO,
  "PEDIDO CANCELADO": StatusPedido.CANCELADO,
};

const semAcento = (texto: string) =>
  texto
    .normalize("NFD")
    .replace(/[̀-ͯ]/g, "")
    .toUpperCase()
    .replace(/\s+/g, " ")
    .trim();

export function mapearStatusXbz(status: string | null | undefined): StatusPedido {
  const texto = semAcento(String(status ?? ""));
  if (!texto) return StatusPedido.AGUARDANDO;
  const conhecido = CONHECIDOS[texto];
  if (conhecido) return conhecido;

  if (texto.includes("CANCELAD")) return StatusPedido.CANCELADO;
  if (texto.includes("FINALIZAD") || texto.includes("RETIRADO") || texto.includes("ENTREGUE")) return StatusPedido.FINALIZADO;
  /* "Aguardando pagamento", "aguardando aprovação": ainda não começou. */
  if (texto.includes("PAGAMENTO") || texto.includes("APROVACAO") || texto.includes("ANALISE")) return StatusPedido.AGUARDANDO;
  if (texto.includes("TRANSPORTADORA") || texto.includes("ENVIADO") || texto.includes("EXPEDI") || texto.includes("FATURAD")) return StatusPedido.ENVIADO;
  if (texto.includes("PRONTO") || texto.includes("DISPONIVEL PARA RETIRADA")) return StatusPedido.PRONTO;
  if (texto.includes("SEPARACAO") || texto.includes("PRODUCAO") || texto.includes("GRAVACAO")) return StatusPedido.PRODUCAO;
  return StatusPedido.AGUARDANDO;
}

/* O que a pessoa lê no selo. */
export const ROTULO_DO_STATUS: Record<StatusPedido, string> = {
  AGUARDANDO: "Aguardando",
  PRODUCAO: "Em separação",
  PRONTO: "Pronto",
  ENVIADO: "A caminho",
  FINALIZADO: "Finalizado",
  CANCELADO: "Cancelado",
};

/* Pedido nessas etapas não muda mais: a conferência diária deixa de perguntar por ele. */
export const STATUS_FINAIS: ReadonlySet<string> = new Set([StatusPedido.FINALIZADO, StatusPedido.CANCELADO]);
