import * as kv from "./kv_store.tsx";
import { createLogger } from "./logger.tsx";

const logger = createLogger('HistoricoColaborador');

// Registo unificado de alteracoes relevantes da ficha do colaborador — cobre
// "Historico de Alteracoes Salariais" e "Historico de Cargos" (pedidos pelo
// utilizador) com uma unica entidade parametrizada por `tipo`, em vez de 3
// tabelas quase identicas. "Historico de Contratos" e coberto pela
// combinacao do registo actual em Colaborador + estes registos de alteracao
// (nao existe uma entidade "Contrato" separada, para nao duplicar dados ja
// existentes no Colaborador).
//
// E gerado AUTOMATICAMENTE por colaboradores.atualizarColaborador() sempre
// que um dos campos rastreados muda — nunca e criado directamente por um
// utilizador, por isso so tem listagem (sem rotas de criar/editar/deletar).
export type TipoAlteracaoColaborador =
  | "salario"
  | "cargo"
  | "departamento"
  | "seccao"
  | "categoria_profissional"
  | "tipo_contrato"
  | "local_trabalho"
  | "supervisor"
  | "conta_bancaria";

export interface AlteracaoColaborador {
  id: string;
  empresaId: string;
  colaboradorId: string;
  tipo: TipoAlteracaoColaborador;
  valorAnterior: string | null;
  valorNovo: string | null;
  percentualVariacao?: number; // so preenchido quando tipo === 'salario'
  registadoPor?: string;
  dataCriacao: string;
}

const ALTERACAO_PREFIX = "alteracao_colaborador:";

const CAMPO_PARA_TIPO: Record<string, TipoAlteracaoColaborador> = {
  salarioBase: "salario",
  cargo: "cargo",
  departamento: "departamento",
  seccao: "seccao",
  categoriaProfissional: "categoria_profissional",
  tipoContrato: "tipo_contrato",
  localTrabalho: "local_trabalho",
  supervisorId: "supervisor",
  nib: "conta_bancaria",
  numeroConta: "conta_bancaria",
};

function formatarValor(valor: unknown): string | null {
  if (valor === undefined || valor === null || valor === "") return null;
  return String(valor);
}

export async function registarAlteracoesColaborador(
  empresaId: string,
  colaboradorId: string,
  anterior: Record<string, unknown>,
  novo: Record<string, unknown>,
  registadoPor?: string,
): Promise<void> {
  try {
    for (const campo of Object.keys(CAMPO_PARA_TIPO)) {
      const valorAnterior = anterior[campo];
      const valorNovo = novo[campo];

      if (valorAnterior === valorNovo) continue;
      if ((valorAnterior === undefined || valorAnterior === null) && (valorNovo === undefined || valorNovo === null)) continue;

      const id = `alteracao_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
      const registo: AlteracaoColaborador = {
        id,
        empresaId,
        colaboradorId,
        tipo: CAMPO_PARA_TIPO[campo],
        valorAnterior: formatarValor(valorAnterior),
        valorNovo: formatarValor(valorNovo),
        registadoPor,
        dataCriacao: new Date().toISOString(),
      };

      if (campo === "salarioBase" && typeof valorAnterior === "number" && valorAnterior > 0 && typeof valorNovo === "number") {
        registo.percentualVariacao = Number((((valorNovo - valorAnterior) / valorAnterior) * 100).toFixed(2));
      }

      await kv.set(`${ALTERACAO_PREFIX}${id}`, registo);
    }
  } catch (error) {
    logger.error("Erro ao registar alteracoes de colaborador:", error);
  }
}

export async function listarAlteracoesColaborador(
  empresaId: string,
  colaboradorId: string,
): Promise<AlteracaoColaborador[]> {
  try {
    const todas = await kv.getByPrefix<AlteracaoColaborador>(ALTERACAO_PREFIX);
    return todas
      .filter((item) => item && item.empresaId === empresaId && item.colaboradorId === colaboradorId)
      .sort((a, b) => b.dataCriacao.localeCompare(a.dataCriacao));
  } catch (error) {
    logger.error("Erro ao listar alteracoes de colaborador:", error);
    return [];
  }
}
