import { ConflictException } from '@nestjs/common';
import { Prisma } from '@prisma/client';
import { IndicesInmService } from './indices.service';
import { ParametrosInmService } from './parametros.service';

describe('ParametrosInmService', () => {
  it('la primera lectura crea la fila con los valores por defecto, sin pisar una existente', async () => {
    const prisma: any = {
      inm_parametros: {
        findUnique: jest.fn().mockResolvedValueOnce(null),
        createMany: jest.fn().mockResolvedValue({ count: 1 }),
        findUniqueOrThrow: jest.fn().mockResolvedValue({ empresa_id: 'emp-1', proporcion_gravada: 30 }),
      },
    };
    const service = new ParametrosInmService(prisma, { log: jest.fn() } as any);
    const p = await service.obtener('emp-1');
    expect(prisma.inm_parametros.createMany).toHaveBeenCalledWith({
      data: [{ empresa_id: 'emp-1' }],
      skipDuplicates: true,
    });
    expect(p.proporcion_gravada).toBe(30);
  });
});

describe('IndicesInmService', () => {
  const crear = () => {
    const prisma: any = {
      inm_indices: {
        findFirst: jest.fn().mockResolvedValue(null),
        create: jest.fn(),
        findMany: jest.fn().mockResolvedValue([]),
      },
    };
    return { service: new IndicesInmService(prisma, { log: jest.fn() } as any), prisma };
  };

  it('vigente: el último índice cargado hasta el mes de la fecha, de la empresa', async () => {
    const { service, prisma } = crear();
    await service.vigente('emp-1', '2026-10-23');
    const args = prisma.inm_indices.findFirst.mock.calls[0][0];
    expect(args.where.empresa_id).toBe('emp-1');
    expect(args.where.periodo.lte.toISOString().slice(0, 10)).toBe('2026-10-01');
    expect(args.orderBy).toEqual({ periodo: 'desc' });
  });

  it('cargar dos veces el mismo mes es 409 con un mensaje que dice qué hacer', async () => {
    const { service, prisma } = crear();
    prisma.inm_indices.create.mockRejectedValue(
      new Prisma.PrismaClientKnownRequestError('dup', { code: 'P2002', clientVersion: 'x' }),
    );
    await expect(service.crear({ periodo: '2026-09', valor: 157.4 }, 'emp-1')).rejects.toBeInstanceOf(
      ConflictException,
    );
  });

  it('el período se guarda como el día 1 del mes', async () => {
    const { service, prisma } = crear();
    prisma.inm_indices.create.mockImplementation(({ data }) => Promise.resolve({ id: 'i-1', ...data }));
    const i = await service.crear({ periodo: '2026-09', valor: 157.4 }, 'emp-1', 'u-1');
    expect(i.periodo.toISOString().slice(0, 10)).toBe('2026-09-01');
  });
});
