import { UsersService } from './users.service';

describe('UsersService.update - perfiles', () => {
  const createService = () => {
    const prisma = {
      usuario: {
        findUnique: jest.fn().mockResolvedValue({
          id: 'user-1',
          username: 'admin',
          nombres: 'Admin',
          estado: 'Activo',
          empresa_id: 'emp-1',
        }),
        update: jest.fn().mockResolvedValue({ id: 'user-1' }),
      },
      usuario_perfiles: {
        deleteMany: jest.fn().mockResolvedValue({ count: 1 }),
        createMany: jest.fn().mockResolvedValue({ count: 1 }),
      },
    };

    const auditService = {
      log: jest.fn().mockResolvedValue(undefined),
    };

    const service = new UsersService(
      prisma as any,
      {} as any,
      {} as any,
      auditService as any,
      {} as any,
      {} as any,
      { log: jest.fn() } as any,
    );

    return { service, prisma, auditService };
  };

  it('si perfiles viene undefined no toca usuario_perfiles', async () => {
    const { service, prisma } = createService();

    await service.update('user-1', { nombres: 'Nuevo' } as any, 'actor-1', 'emp-1');

    expect(prisma.usuario_perfiles.deleteMany).not.toHaveBeenCalled();
    expect(prisma.usuario_perfiles.createMany).not.toHaveBeenCalled();
  });

  it('si perfiles viene [] elimina perfiles actuales y no crea nuevos', async () => {
    const { service, prisma } = createService();

    await service.update('user-1', { perfiles: [] } as any, 'actor-1', 'emp-1');

    expect(prisma.usuario_perfiles.deleteMany).toHaveBeenCalledWith({ where: { user_id: 'user-1' } });
    expect(prisma.usuario_perfiles.createMany).not.toHaveBeenCalled();
  });

  it('si perfiles viene con valores elimina y recrea set explícito', async () => {
    const { service, prisma } = createService();

    await service.update('user-1', { perfiles: ['perfil-1', 'perfil-2'] } as any, 'actor-1', 'emp-1');

    expect(prisma.usuario_perfiles.deleteMany).toHaveBeenCalledWith({ where: { user_id: 'user-1' } });
    expect(prisma.usuario_perfiles.createMany).toHaveBeenCalledWith({
      data: [
        { user_id: 'user-1', perfil_id: 'perfil-1' },
        { user_id: 'user-1', perfil_id: 'perfil-2' },
      ],
    });
  });
});
