import { lerNfce, lerNfe, lerNfse } from "@/lib/fiscal/emissor";
import { emissorParaTela, salvarModelos } from "@/lib/fiscal/servidor/emissor";
import { lerCorpo, rotaFiscal } from "@/lib/fiscal/servidor/rota";

export const runtime = "nodejs";

const numeroOuNulo = (valor: unknown) => {
  const n = Number(valor);
  return Number.isInteger(n) && n > 0 ? n : null;
};

export async function PUT(req: Request) {
  return rotaFiscal("fiscal.configurar", async ({ admin, empresaId, ambiente }) => {
    const corpo = await lerCorpo(req);
    const segredos = (corpo.segredos && typeof corpo.segredos === "object" ? corpo.segredos : {}) as Record<string, unknown>;
    const numeracao = (corpo.numeracao && typeof corpo.numeracao === "object" ? corpo.numeracao : {}) as Record<string, unknown>;
    const nfse = lerNfse(corpo.nfse);
    const emissor = await salvarModelos(admin, {
      empresaId,
      ambiente,
      dados: {
        nfe: lerNfe(corpo.nfe),
        nfce: lerNfce(corpo.nfce),
        nfse: {
          ativo: nfse.ativo,
          ambiente: nfse.ambiente,
          serie: nfse.serie,
          forma: nfse.forma,
          usuario: nfse.usuario,
          enviarInscricaoMunicipal: nfse.enviarInscricaoMunicipal,
        },
        segredos: {
          cscHomologacao: typeof segredos.cscHomologacao === "string" ? segredos.cscHomologacao : undefined,
          cscProducao: typeof segredos.cscProducao === "string" ? segredos.cscProducao : undefined,
          nfseSenha: typeof segredos.nfseSenha === "string" ? segredos.nfseSenha : undefined,
          nfseNumeroAutenticacao: typeof segredos.nfseNumeroAutenticacao === "string" ? segredos.nfseNumeroAutenticacao : undefined,
        },
        numeracao: {
          nfe: numeroOuNulo(numeracao.nfe),
          nfce: numeroOuNulo(numeracao.nfce),
          nfse: numeroOuNulo(numeracao.nfse),
          nfseLote: numeroOuNulo(numeracao.nfseLote),
        },
      },
    });
    return { emissor: emissorParaTela(emissor) };
  });
}
