import {
  BadRequestException,
  ConflictException,
  ForbiddenException,
  NotFoundException,
} from '@nestjs/common';
import { LegajosTiposService } from './legajos-tipos.service';

const EMPRESA_ID = 'empresa-1';

const prismaMock = () => ({
  rrhh_legajo_tipos_documento: {
    findMany: jest.fn(),
    findFirst: jest.fn(),
    create: jest.fn(),
    update: jest.fn(),
  },
});

describe('LegajosTiposService', () => {
  it('crear: valida que vencimiento_obligatorio requiere admite_vencimiento', async () => {
    const prisma = prismaMock();
    const service = new LegajosTiposService(prisma as any);

    await expect(
      service.crear(EMPRESA_ID, {
        codigo: 'DOC_X',
        nombre: 'Doc X',
        vencimiento_obligatorio: true,
        admite_vencimiento: false,
      }),
    ).rejects.toThrow(BadRequestException);
  });

  it('crear: rechaza conflicto con tipo del sistema', async () => {
    const prisma = prismaMock();
    prisma.rrhh_legajo_tipos_documento.findFirst.mockResolvedValue({
      id: 'tipo-sistema',
      es_del_sistema: true,
    });
    const service = new LegajosTiposService(prisma as any);

    await expect(
      service.crear(EMPRESA_ID, {
        codigo: 'CI',
        nombre: 'Cédula',
      }),
    ).rejects.toThrow(ConflictException);
  });

  it('actualizar: bloquea edición de tipo del sistema', async () => {
    const prisma = prismaMock();
    prisma.rrhh_legajo_tipos_documento.findFirst.mockResolvedValue({
      id: 'tipo-sistema',
      es_del_sistema: true,
      empresa_id: null,
      admite_vencimiento: true,
      vencimiento_obligatorio: false,
    });
    const service = new LegajosTiposService(prisma as any);

    await expect(
      service.actualizar('tipo-sistema', EMPRESA_ID, {
        nombre: 'Nuevo nombre',
      }),
    ).rejects.toThrow(ForbiddenException);
  });

  it('desactivar: devuelve NotFound si el tipo no pertenece a la empresa', async () => {
    const prisma = prismaMock();
    prisma.rrhh_legajo_tipos_documento.findFirst.mockResolvedValue({
      id: 'tipo-otra-empresa',
      es_del_sistema: false,
      empresa_id: 'empresa-2',
    });
    const service = new LegajosTiposService(prisma as any);

    await expect(service.desactivar('tipo-otra-empresa', EMPRESA_ID)).rejects.toThrow(
      NotFoundException,
    );
  });
});

