import { beforeEach, describe, expect, it, vi } from 'vitest';

vi.mock('@/lib/prisma', () => ({
  prisma: {
    types_contrat_salarie: {
      findMany: vi.fn(),
      findUnique: vi.fn(),
      create: vi.fn(),
      update: vi.fn(),
      delete: vi.fn(),
    },
  },
}));

import * as referenceService from '@/services/reference-lookups.service';
import { prisma } from '@/lib/prisma';

describe('Unit - services/reference-lookups.types-contrats', () => {
  beforeEach(() => {
    vi.resetAllMocks();
  });

  it('listTypesContrats: should return the types contrats list with pagination', async () => {
    const limit = 25;
    const offset = 50;

    const expectedList = [{ id: 1 }, { id: 2 }];

    vi.mocked(prisma.types_contrat_salarie.findMany).mockResolvedValue(expectedList as never);

    const result = await referenceService.listTypesContrat(limit, offset);

    expect(prisma.types_contrat_salarie.findMany).toHaveBeenCalledWith({
      orderBy: [{ id: 'asc' }],
      take: limit,
      skip: offset,
    });

    expect(result).toEqual(expectedList);
  });

  it('getTypeContratById returns a type contrat by id', async () => {
    const expected = {
      id: 1,
      tcs: "jsp",
      chemin: "C:/user/aled",
      regroupement: "non",
      faitpartie_e2e: true,
      actif_: true,
      date_creation: new Date('2026-05-28T00:00:00.000Z'),

    };

    vi.mocked(prisma.types_contrat_salarie.findUnique).mockResolvedValue(expected);

    const result = await referenceService.getTypeContratById(1);

    expect(prisma.types_contrat_salarie.findUnique).toHaveBeenCalledWith({
      where: { id: 1 },
    });

    expect(result).toEqual(expected);
  });

  it('createTypesContrat creates a type contrat', async () => {
    const payload = {
       tcs: "jsp",
      chemin: "C:/user/aled",
      regroupement: "non",
      faitpartie_e2e: true,
      actif_: true,
    };

    const expected = {
      id: 1,
      ...payload,
      date_creation: new Date('2026-05-28T00:00:00.000Z'),
    };

    vi.mocked(prisma.types_contrat_salarie.create).mockResolvedValue(expected);

    const result = await referenceService.createTypesContrat(payload);

    expect(prisma.types_contrat_salarie.create).toHaveBeenCalledWith({
      data: payload,
    });

    expect(result).toEqual(expected);
  });

  it('updateTypesContrat updates a type contrat', async () => {
    const payload = {
      regroupement: "changement"
    };

    const expected = {
      id: 1,
       tcs: "jsp",
      chemin: "C:/user/aled",
      regroupement: "changement",
      faitpartie_e2e: true,
      actif_: true,
      date_creation: new Date('2026-05-28T00:00:00.000Z'),
    };

    vi.mocked(prisma.types_contrat_salarie.update).mockResolvedValue(expected);

    const result = await referenceService.updateTypesContrat(1, payload);

    expect(prisma.types_contrat_salarie.update).toHaveBeenCalledWith({
      where: { id: 1 },
      data: payload,
    });

    expect(result).toEqual(expected);
  });

  it('deleteTypesContrat deletes a type contrat', async () => {
    const expected = {
      id: 1,
       tcs: "jsp",
      chemin: "C:/user/aled",
      regroupement: "non",
      faitpartie_e2e: true,
      actif_: true,
      date_creation: new Date('2026-05-28T00:00:00.000Z'),
    };

    vi.mocked(prisma.types_contrat_salarie.delete).mockResolvedValue(expected);

    const result = await referenceService.deleteTypesContrat(1);

    expect(prisma.types_contrat_salarie.delete).toHaveBeenCalledWith({
      where: { id: 1 },
    });

    expect(result).toEqual(expected);
  });
});