import { listarCertificadosRetencaoIRPS } from "./certificado-retencao-irps.tsx";
import { listarComunicacoesDependentesIRPS } from "./comunicacao-dependentes-irps.tsx";

// Livro de registo digital de conformidade IRPS — mesma logica de
// livro-registo-inss.tsx, aplicada aos dois eventos persistidos e
// auditaveis deste modulo: emissao/anulacao de Certificados de Retenção
// Anual (certificado-retencao-irps.tsx) e criacao/envio de Comunicacoes de
// alteracao de dependentes (comunicacao-dependentes-irps.tsx). Nao inclui a
// exportacao do Modelo 19 preenchido porque essa e stateless (gerada a
// pedido no browser via pdf-lib, nao fica persistida como evento).
export type TipoEventoLivroIRPS =
  | "certificado_emitido"
  | "certificado_anulado"
  | "comunicacao_dependente_criada"
  | "comunicacao_dependente_enviada";

export interface EventoLivroIRPS {
  data: string; // ISO datetime
  tipo: TipoEventoLivroIRPS;
  descricao: string;
  responsavel?: string;
  referencia?: string;
}

export interface LivroRegistoIRPS {
  empresaId: string;
  dataInicio: string;
  dataFim: string;
  eventos: EventoLivroIRPS[];
}

function dentroDoIntervalo(dataIsoCompleta: string | undefined, dataInicio: string, dataFim: string): boolean {
  if (!dataIsoCompleta) return false;
  const data = dataIsoCompleta.slice(0, 10);
  return data >= dataInicio && data <= dataFim;
}

function formatarMoeda(valor: number): string {
  return new Intl.NumberFormat("pt-MZ", { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(valor || 0);
}

export async function gerarLivroRegistoIRPS(
  empresaId: string,
  dataInicio: string,
  dataFim: string,
): Promise<LivroRegistoIRPS> {
  const [certificados, comunicacoes] = await Promise.all([
    listarCertificadosRetencaoIRPS(empresaId),
    listarComunicacoesDependentesIRPS(empresaId),
  ]);

  const eventos: EventoLivroIRPS[] = [];

  for (const certificado of certificados) {
    if (dentroDoIntervalo(certificado.dataEmissao, dataInicio, dataFim)) {
      eventos.push({
        data: certificado.dataEmissao,
        tipo: "certificado_emitido",
        descricao: `Certificado ${certificado.numeroCertificado} emitido para ${certificado.colaboradorNome} — ano ${certificado.ano} — retenção total ${formatarMoeda(certificado.totalRetencaoIRPS)} MZN`,
        responsavel: certificado.emitidoPor,
        referencia: certificado.numeroCertificado,
      });
    }
    if (certificado.estado === "anulado" && dentroDoIntervalo(certificado.dataAtualizacao, dataInicio, dataFim)) {
      eventos.push({
        data: certificado.dataAtualizacao!,
        tipo: "certificado_anulado",
        descricao: `Certificado ${certificado.numeroCertificado} anulado — ${certificado.motivoAnulacao || "sem motivo registado"}`,
        referencia: certificado.numeroCertificado,
      });
    }
  }

  for (const comunicacao of comunicacoes) {
    if (dentroDoIntervalo(comunicacao.dataCriacao, dataInicio, dataFim)) {
      eventos.push({
        data: comunicacao.dataCriacao,
        tipo: "comunicacao_dependente_criada",
        descricao: `Alteração de dependente (${comunicacao.tipo}) registada — ${comunicacao.dependenteNome}, colaborador ${comunicacao.colaboradorNome}`,
        referencia: comunicacao.dependenteNome,
      });
    }
    if (comunicacao.estado === "comunicado" && dentroDoIntervalo(comunicacao.dataComunicacao, dataInicio, dataFim)) {
      eventos.push({
        data: comunicacao.dataComunicacao!,
        tipo: "comunicacao_dependente_enviada",
        descricao: `Comunicação de alteração de dependente enviada — ${comunicacao.dependenteNome}, colaborador ${comunicacao.colaboradorNome}${comunicacao.numeroProtocolo ? ` — protocolo ${comunicacao.numeroProtocolo}` : ""}`,
        responsavel: comunicacao.comunicadoPor,
        referencia: comunicacao.dependenteNome,
      });
    }
  }

  eventos.sort((a, b) => a.data.localeCompare(b.data));

  return { empresaId, dataInicio, dataFim, eventos };
}
