import { explicarRejeicao } from "@/lib/fiscal/rejeicoes";
import { APARENCIA_DO_STATUS } from "@/lib/fiscal/status";
import { NOME_DO_MODELO } from "@/lib/spedy/api";

import type { PlanoDaEmissao } from "./notas";
import type { NotaGuardada } from "./notas";

/** A nota do jeito que a tela usa: sem payload, sem chave, com o que dá para fazer. */
export function notaParaTela(nota: NotaGuardada, extra?: { pedidoNumero?: number | null; clienteNome?: string | null }) {
  const aparencia = APARENCIA_DO_STATUS[nota.status] ?? APARENCIA_DO_STATUS.processando;
  const destinatario = (nota.destinatario ?? {}) as Record<string, unknown>;
  const rejeitada = ["rejeitada", "erro", "denegada"].includes(nota.status);
  const formulario = nota.origem === "avulsa" && nota.formulario && typeof nota.formulario === "object" ? nota.formulario : null;
  const clienteDoFormulario = typeof formulario?.clienteId === "string" ? formulario.clienteId : null;
  return {
    id: nota.id,
    modelo: nota.modelo,
    modeloNome: NOME_DO_MODELO[nota.modelo],
    status: nota.status,
    rotulo: aparencia.rotulo,
    tom: aparencia.tom,
    descricaoDoStatus: aparencia.descricao,
    numero: nota.numero,
    serie: nota.serie,
    chave: nota.chave,
    protocolo: nota.protocolo,
    valor: Number(nota.valor) || 0,
    ambienteNota: nota.ambiente_nota,
    semValorFiscal: nota.ambiente_nota !== "producao",
    origem: nota.origem,
    pedidoId: nota.pedido_id,
    pedidoNumero: extra?.pedidoNumero ?? null,
    semPedido: nota.origem === "avulsa",
    clienteId: clienteDoFormulario,
    destinatarioNome: String(destinatario.nome ?? "") || extra?.clienteNome || null,
    destinatarioDocumento: String(destinatario.documento ?? "") || null,
    destinatarioEmail: String(destinatario.email ?? "") || null,
    criadaEm: nota.created_at,
    atualizadaEm: nota.updated_at,
    autorizadaEm: nota.autorizada_em,
    canceladaEm: nota.cancelada_em,
    cancelamentoMotivo: nota.cancelamento_motivo,
    mensagem: nota.mensagem,
    mensagemCodigo: nota.mensagem_codigo,
    explicacao: rejeitada || nota.mensagem ? explicarRejeicao(nota.mensagem_codigo, nota.mensagem, { teste: nota.origem === "teste", modelo: nota.modelo }) : null,
    credito: nota.credito,
    contaCredito: nota.conta_credito,
    temArquivos: Boolean(nota.pdf_path || ["autorizada", "cancelada", "contingencia"].includes(nota.status)),
    podeCancelar: nota.status === "autorizada",
    podeCorrigir: nota.modelo === "nfe" && nota.status === "autorizada",
    /* Devolução: espelha uma venda de produto já autorizada. */
    podeDevolver: nota.modelo === "nfe" && nota.status === "autorizada" && nota.origem !== "devolucao",
    devolucaoDe: nota.nota_origem_id ?? null,
    podeReenviar: ["rejeitada", "erro"].includes(nota.status),
    podeEmitirPrevia: nota.status === "rascunho",
    podeDescartar: ["rascunho", "rejeitada", "erro", "preparando"].includes(nota.status),
    /** Nota sem pedido: abre de novo na tela de emissão, para mudar itens, valores ou cliente. */
    podeEditarNaEmissao: Boolean(formulario) && ["rascunho", "rejeitada", "erro"].includes(nota.status),
    podeCopiar: Boolean(formulario) && !["rascunho", "rejeitada", "erro", "preparando"].includes(nota.status),
    podeEnviarEmail: ["autorizada", "cancelada"].includes(nota.status) && Boolean(destinatario.email),
    emAndamento: ["preparando", "enviando", "processando", "cancelando"].includes(nota.status),
  };
}

export type NotaNaTela = ReturnType<typeof notaParaTela>;

/** O plano sem o que é só do servidor (pedido carregado, payloads). */
export function planoParaTela(plano: PlanoDaEmissao) {
  return {
    pedidoId: plano.pedidoId,
    numero: plano.numero,
    origem: plano.origem,
    statusDoPedido: plano.statusDoPedido,
    emissor: plano.emissor,
    modeloDeMercadoria: plano.modeloDeMercadoria,
    consumidorFinal: plano.consumidorFinal,
    presenca: plano.presenca,
    enviarEmail: plano.enviarEmail,
    observacoes: plano.observacoes,
    destinatario: plano.destinatario
      ? {
          tipo: plano.destinatario.tipo,
          nome: plano.destinatario.nome,
          documento: plano.destinatario.documento,
          email: plano.destinatario.email,
          contribuinte: plano.destinatario.contribuinte,
          inscricaoEstadual: plano.destinatario.inscricaoEstadual,
          endereco: plano.destinatario.endereco,
        }
      : null,
    clienteId: plano.clienteId,
    notas: plano.notas.map((nota) => ({
      chave: nota.chave,
      modelo: nota.modelo,
      modeloNome: NOME_DO_MODELO[nota.modelo],
      grupo: nota.grupo,
      titulo: nota.titulo,
      ambienteNota: nota.ambienteNota,
      contaCredito: nota.contaCredito,
      valor: nota.montada ? nota.montada.valor : 0,
      resumo: nota.montada?.resumo ?? null,
      pendencias: nota.pendencias,
      existente: nota.existente,
      jaEmitida: nota.jaEmitida,
    })),
    pendenciasGerais: plano.pendenciasGerais,
    saldo: plano.saldo,
    notasQueGastam: plano.notasQueGastam,
    totais: plano.totais,
  };
}
