import { BadRequestException, ConflictException } from '@nestjs/common';
import { PermisosPresentismoService } from './permisos-presentismo.service';

describe('PermisosPresentismoService', () => {
  let service: PermisosPresentismoService;
  let prisma: any;

  beforeEach(() => {
    prisma = {
      rrhh_empleados: {
        findFirst: jest.fn(),
      },
      rrhh_legajo_documentos: {
        findFirst: jest.fn(),
      },
      rrhh_permisos_presentismo: {
        create: jest.fn(),
        findFirst: jest.fn(),
        update: jest.fn(),
      },
      $transaction: jest.fn(),
    };

    service = new PermisosPresentismoService(prisma);
  });

  it('rechaza LLEGADA_TARDIA sin minutos_tolerados', async () => {
    prisma.rrhh_empleados.findFirst.mockResolvedValue({ id: 'emp-1' });
    prisma.rrhh_legajo_documentos.findFirst.mockResolvedValue(null);

    await expect(
      service.crear(
        'empres-1',
        {
          empleado_id: 'emp-1',
          fecha: '2026-05-18',
          tipo_permiso: 'LLEGADA_TARDIA',
          motivo: 'Demora por tránsito',
          tipo_justificacion: 'PERSONAL',
        } as any,
        'user-1',
      ),
    ).rejects.toBeInstanceOf(BadRequestException);
  });

  it('rechaza legajo_documento_id inválido para empleado/empresa', async () => {
    prisma.rrhh_empleados.findFirst.mockResolvedValue({ id: 'emp-1' });
    prisma.rrhh_legajo_documentos.findFirst.mockResolvedValue(null);

    await expect(
      service.crear(
        'empresa-1',
        {
          empleado_id: 'emp-1',
          fecha: '2026-05-18',
          tipo_permiso: 'JORNADA_COMPLETA',
          motivo: 'Consulta',
          tipo_justificacion: 'MEDICA',
          legajo_documento_id: '00000000-0000-0000-0000-000000000001',
        } as any,
        'user-1',
      ),
    ).rejects.toBeInstanceOf(BadRequestException);
  });

  it('rechaza documento no médico para justificación MEDICA', async () => {
    prisma.rrhh_empleados.findFirst.mockResolvedValue({ id: 'emp-1' });
    prisma.rrhh_legajo_documentos.findFirst.mockResolvedValue({
      id: 'doc-1',
      tipo_documento: { codigo: 'CONTRATO' },
    });

    await expect(
      service.crear(
        'empresa-1',
        {
          empleado_id: 'emp-1',
          fecha: '2026-05-18',
          tipo_permiso: 'JORNADA_COMPLETA',
          motivo: 'Consulta',
          tipo_justificacion: 'MEDICA',
          legajo_documento_id: '00000000-0000-0000-0000-000000000001',
        } as any,
        'user-1',
      ),
    ).rejects.toBeInstanceOf(BadRequestException);
  });

  it('aprueba permiso pendiente', async () => {
    prisma.rrhh_permisos_presentismo.findFirst.mockResolvedValue({
      id: 'perm-1',
      empresa_id: 'empresa-1',
      estado: 'PENDIENTE',
    });
    prisma.rrhh_permisos_presentismo.update.mockResolvedValue({
      id: 'perm-1',
      estado: 'APROBADO',
    });

    const out = await service.aprobar('perm-1', 'empresa-1', 'user-1', {} as any);

    expect(out.estado).toBe('APROBADO');
    expect(prisma.rrhh_permisos_presentismo.update).toHaveBeenCalledTimes(1);
  });

  it('rechazar falla si permiso no está pendiente', async () => {
    prisma.rrhh_permisos_presentismo.findFirst.mockResolvedValue({
      id: 'perm-2',
      empresa_id: 'empresa-1',
      estado: 'APROBADO',
    });

    await expect(service.rechazar('perm-2', 'empresa-1', 'user-1', {} as any)).rejects.toBeInstanceOf(
      ConflictException,
    );
  });
});
