import { Injectable, Logger } from '@nestjs/common';
import { PrismaService } from '../../prisma/prisma.service';
import { CONCEPTOS_SISTEMA, PARAMETROS_SISTEMA } from '../seeds/rrhh-defaults';
import { seedLegajosFotoMigration } from '../seeds/legajos-foto-migration.seed';
import { seedPresentismoDemo } from '../seeds/presentismo-demo.seed';

@Injectable()
export class RrhhSeedService {
  private readonly logger = new Logger(RrhhSeedService.name);

  constructor(private readonly prisma: PrismaService) {}

  async sembrarConceptosSistema(empresaId: string) {
    let creados = 0;
    let existentes = 0;

    for (const concepto of CONCEPTOS_SISTEMA) {
      const existe = await this.prisma.rrhh_conceptos_liquidacion.findFirst({
        where: { empresa_id: empresaId, codigo: concepto.codigo },
      });
      if (existe) {
        existentes++;
        continue;
      }
      await this.prisma.rrhh_conceptos_liquidacion.create({
        data: {
          empresa_id: empresaId,
          codigo: concepto.codigo,
          nombre: concepto.nombre,
          tipo: concepto.tipo,
          categoria: concepto.categoria,
          afecta_base_ips: concepto.afecta_base_ips,
          afecta_base_aguinaldo: concepto.afecta_base_aguinaldo,
          es_porcentaje: concepto.es_porcentaje,
          porcentaje: concepto.porcentaje ?? null,
          es_fijo: concepto.es_fijo,
          es_del_sistema: true,
          aplica_a: concepto.aplica_a,
          orden_visualizacion: concepto.orden_visualizacion,
          activo: true,
        },
      });
      creados++;
    }

    return { creados, existentes, total: CONCEPTOS_SISTEMA.length };
  }

  async sembrarParametrosSistema(empresaId: string, fechaVigenciaDesde = new Date()) {
    const desde = new Date(
      fechaVigenciaDesde.getFullYear(),
      fechaVigenciaDesde.getMonth(),
      fechaVigenciaDesde.getDate(),
    );

    let creados = 0;
    let existentes = 0;

    for (const parametro of PARAMETROS_SISTEMA) {
      const existe = await this.prisma.rrhh_parametros_sistema.findFirst({
        where: { empresa_id: empresaId, clave: parametro.clave, vigencia_desde: desde },
      });
      if (existe) {
        existentes++;
        continue;
      }
      await this.prisma.rrhh_parametros_sistema.create({
        data: {
          empresa_id: empresaId,
          clave: parametro.clave,
          nombre: parametro.nombre,
          valor: parametro.valor,
          tipo_dato: parametro.tipo_dato,
          categoria: parametro.categoria,
          editable: parametro.editable,
          vigencia_desde: desde,
          vigencia_hasta: null,
        },
      });
      creados++;
    }

    return { creados, existentes, total: PARAMETROS_SISTEMA.length };
  }

  async sembrarTodo(empresaId: string) {
    const conceptos = await this.sembrarConceptosSistema(empresaId);
    const parametros = await this.sembrarParametrosSistema(empresaId);
    this.logger.log(
      `RRHH defaults sembrados para empresa ${empresaId}: ` +
        `${conceptos.creados} conceptos nuevos / ${parametros.creados} parámetros nuevos`,
    );
    return { conceptos, parametros };
  }

  async sembrarPresentismoDemo(empresaId: string) {
    const result = await seedPresentismoDemo(this.prisma, empresaId);
    this.logger.log(
      `Seed presentismo demo aplicado para empresa ${empresaId}: ` +
        `${result.turnos.creados} turnos nuevos, ${result.permisos.creados} permisos nuevos, ` +
        `${result.novedades.creadas} novedades nuevas.`,
    );
    return result;
  }

  async sembrarLegajosFotoMigration(empresaId: string, actorUserId: string) {
    const result = await seedLegajosFotoMigration(this.prisma, empresaId, actorUserId);
    this.logger.log(
      `Migración FOTO_PERFIL (empresa ${empresaId}): ` +
        `con_foto=${result.empleados_con_foto}, creados=${result.creados}, omitidos=${result.omitidos}, errores=${result.errores.length}`,
    );
    return result;
  }
}
