/**
 * O status da nota do lado do Ktalogu, e as mudanças que ele aceita.
 *
 * A Spedy avisa por webhook e a entrega é "melhor esforço": pode chegar
 * repetida, fora de ordem ou nem chegar (aí a consulta periódica cobre). Um
 * "recebida" atrasado não pode desfazer um "autorizada" que já chegou. Por isso
 * a mudança só anda para frente, com duas voltas legítimas: a rejeitada que é
 * corrigida e reenviada, e o cancelamento que a SEFAZ recusou.
 */

export type StatusDaNota =
  | "preparando"
  | "rascunho"
  | "enviando"
  | "processando"
  | "autorizada"
  | "contingencia"
  | "rejeitada"
  | "denegada"
  | "cancelando"
  | "cancelada"
  | "removida"
  | "erro";

export const TODOS_OS_STATUS: StatusDaNota[] = [
  "preparando",
  "rascunho",
  "enviando",
  "processando",
  "autorizada",
  "contingencia",
  "rejeitada",
  "denegada",
  "cancelando",
  "cancelada",
  "removida",
  "erro",
];

/** Nota que já existe fiscalmente (ou está a caminho): trava valores do pedido. */
export const STATUS_QUE_TRAVAM_O_PEDIDO: StatusDaNota[] = ["enviando", "processando", "autorizada", "contingencia", "cancelando"];

/** Ainda esperando resposta da Spedy ou da autoridade. */
export const STATUS_EM_ANDAMENTO: StatusDaNota[] = ["enviando", "processando", "cancelando"];

/** Status da Spedy (InvoiceStatus) → status local. */
export function statusDaSpedyParaLocal(spedy: string | null | undefined, rascunho = false): StatusDaNota {
  switch (String(spedy || "").trim()) {
    case "created":
      return rascunho ? "rascunho" : "processando";
    case "enqueued":
    case "received":
      return "processando";
    case "authorized":
      return "autorizada";
    case "inContingent":
      return "contingencia";
    case "rejected":
      return "rejeitada";
    case "denied":
      return "denegada";
    case "canceled":
      return "cancelada";
    case "removed":
    case "disabled":
      return "removida";
    default:
      return "processando";
  }
}

const PODE_IR_PARA: Record<StatusDaNota, StatusDaNota[]> = {
  preparando: ["rascunho", "enviando", "processando", "autorizada", "contingencia", "rejeitada", "denegada", "cancelada", "removida", "erro"],
  rascunho: ["rascunho", "enviando", "processando", "autorizada", "contingencia", "rejeitada", "denegada", "removida", "erro"],
  enviando: ["rascunho", "processando", "autorizada", "contingencia", "rejeitada", "denegada", "cancelada", "removida", "erro"],
  processando: ["processando", "autorizada", "contingencia", "rejeitada", "denegada", "cancelada", "removida", "erro"],
  erro: ["rascunho", "enviando", "processando", "autorizada", "contingencia", "rejeitada", "denegada", "removida", "erro"],
  rejeitada: ["rascunho", "enviando", "processando", "autorizada", "contingencia", "rejeitada", "denegada", "removida", "erro"],
  contingencia: ["contingencia", "autorizada", "rejeitada", "denegada"],
  autorizada: ["autorizada", "cancelando", "cancelada"],
  cancelando: ["cancelando", "cancelada", "autorizada"],
  cancelada: ["cancelada"],
  denegada: ["denegada"],
  removida: ["removida"],
};

export function podeMudarStatus(de: StatusDaNota, para: StatusDaNota): boolean {
  return (PODE_IR_PARA[de] ?? []).includes(para);
}

export type TomDoStatus = "bom" | "ruim" | "andamento" | "neutro" | "atencao";

export const APARENCIA_DO_STATUS: Record<StatusDaNota, { rotulo: string; tom: TomDoStatus; descricao: string }> = {
  preparando: { rotulo: "Preparando", tom: "andamento", descricao: "Montando a nota." },
  rascunho: { rotulo: "Prévia", tom: "neutro", descricao: "Prévia sem valor fiscal. Ainda não foi emitida." },
  enviando: { rotulo: "Enviando", tom: "andamento", descricao: "Enviando a nota." },
  processando: { rotulo: "Processando", tom: "andamento", descricao: "Aguardando a resposta da SEFAZ ou da prefeitura." },
  autorizada: { rotulo: "Autorizada", tom: "bom", descricao: "Nota válida. PDF e XML disponíveis." },
  contingencia: { rotulo: "Em contingência", tom: "atencao", descricao: "Emitida com a SEFAZ fora do ar. Vale desde já e será confirmada quando ela voltar." },
  rejeitada: { rotulo: "Rejeitada", tom: "ruim", descricao: "A autoridade recusou a nota. Corrija e reenvie." },
  denegada: { rotulo: "Denegada", tom: "ruim", descricao: "A SEFAZ negou o uso por irregularidade cadastral. A numeração foi consumida." },
  cancelando: { rotulo: "Cancelando", tom: "andamento", descricao: "Cancelamento enviado, aguardando confirmação." },
  cancelada: { rotulo: "Cancelada", tom: "neutro", descricao: "Nota cancelada dentro do prazo legal." },
  removida: { rotulo: "Descartada", tom: "neutro", descricao: "A nota não chegou a ser emitida." },
  erro: { rotulo: "Não enviada", tom: "ruim", descricao: "A nota foi recusada antes de chegar à SEFAZ ou à prefeitura. Corrija e tente de novo." },
};
