import { LegajosDashboardService } from './legajos-dashboard.service';

const EMPRESA_ID = 'empresa-1';

const prismaMock = () => ({
  rrhh_legajo_documentos: {
    findMany: jest.fn(),
  },
  rrhh_legajo_tipos_documento: {
    findMany: jest.fn(),
  },
  rrhh_empleados: {
    findMany: jest.fn(),
  },
});

describe('LegajosDashboardService', () => {
  beforeAll(() => {
    jest.useFakeTimers();
    jest.setSystemTime(new Date('2026-05-19T12:00:00.000Z'));
  });

  afterAll(() => {
    jest.useRealTimers();
  });

  it('vencimientos: calcula resumen y dias_para_vencer', async () => {
    const prisma = prismaMock();
    prisma.rrhh_legajo_documentos.findMany.mockResolvedValue([
      {
        id: 'd1',
        empleado_id: 'e1',
        nombre_original: 'ci.pdf',
        fecha_vencimiento: new Date('2026-05-18T00:00:00.000Z'),
        estado_vencimiento: 'VENCIDO',
        tipo_documento: { codigo: 'CI', nombre: 'Cédula' },
        empleado: {
          id: 'e1',
          numero_empleado: 'EMP-001',
          nombres: 'Ana',
          apellidos: 'Lopez',
          sucursal: { descripcion: 'Matriz' },
          departamento: { nombre: 'RRHH' },
        },
      },
      {
        id: 'd2',
        empleado_id: 'e2',
        nombre_original: 'cert.pdf',
        fecha_vencimiento: new Date('2026-05-26T00:00:00.000Z'),
        estado_vencimiento: 'POR_VENCER',
        tipo_documento: { codigo: 'CERTIFICADO_MED', nombre: 'Certificado médico' },
        empleado: {
          id: 'e2',
          numero_empleado: 'EMP-002',
          nombres: 'Luis',
          apellidos: 'Perez',
          sucursal: { descripcion: 'Matriz' },
          departamento: { nombre: 'Operaciones' },
        },
      },
    ]);

    const service = new LegajosDashboardService(prisma as any);
    const out = await service.vencimientos(EMPRESA_ID, {});

    expect(out.total).toBe(2);
    expect(out.vencidos).toBe(1);
    expect(out.por_vencer).toBe(1);
    expect(out.data[0].dias_para_vencer).toBeLessThan(0);
    expect(out.data[1].dias_para_vencer).toBeGreaterThanOrEqual(6);
  });

  it('legajosIncompletos: retorna faltantes y vencidos por empleado', async () => {
    const prisma = prismaMock();
    prisma.rrhh_legajo_tipos_documento.findMany.mockResolvedValue([
      { id: 't-ci', codigo: 'CI', nombre: 'Cédula' },
      { id: 't-ips', codigo: 'ALTA_IPS', nombre: 'Alta IPS' },
    ]);
    prisma.rrhh_empleados.findMany.mockResolvedValue([
      {
        id: 'e1',
        nombres: 'Ana',
        apellidos: 'Lopez',
        numero_empleado: 'EMP-001',
        sucursal: { descripcion: 'Matriz' },
        departamento: { nombre: 'RRHH' },
        legajo_documentos: [
          {
            tipo_documento_id: 't-ci',
            estado_vencimiento: 'VENCIDO',
            fecha_vencimiento: new Date('2026-05-01T00:00:00.000Z'),
          },
        ],
      },
      {
        id: 'e2',
        nombres: 'Luis',
        apellidos: 'Perez',
        numero_empleado: 'EMP-002',
        sucursal: { descripcion: 'Matriz' },
        departamento: { nombre: 'Operaciones' },
        legajo_documentos: [
          {
            tipo_documento_id: 't-ci',
            estado_vencimiento: 'VIGENTE',
            fecha_vencimiento: new Date('2026-10-01T00:00:00.000Z'),
          },
          {
            tipo_documento_id: 't-ips',
            estado_vencimiento: 'VIGENTE',
            fecha_vencimiento: null,
          },
        ],
      },
    ]);

    const service = new LegajosDashboardService(prisma as any);
    const out = await service.legajosIncompletos(EMPRESA_ID, {});

    expect(out.total).toBe(1);
    expect(out.data[0].empleado_id).toBe('e1');
    expect(out.data[0].tipos_faltantes).toEqual([{ codigo: 'ALTA_IPS', nombre: 'Alta IPS' }]);
    expect(out.data[0].tipos_vencidos).toEqual([
      { codigo: 'CI', nombre: 'Cédula', fecha_vencimiento: '2026-05-01' },
    ]);
  });
});
