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

vi.mock('@/services/sanction.service', () => ({
  listSanctionsByEmployeId: vi.fn(),
}));

vi.mock('@/services/employes.service', () => ({
  getEmployeByCos: vi.fn(),
}));

vi.mock('@/server/public-entity', () => ({
  omitInternalId: vi.fn((entity) =>
    entity ? { ...entity, public: true } : entity
  ),
  toPublicSanctionList: vi.fn((items) =>
    items.map((item: any) => ({ ...item, public: true }))
  ),
}));

import { listSanctionsByEmployeId } from '@/services/disciplinaires.service';
import { getEmployeByCos } from '@/services/employes.service';
import { omitInternalId, toPublicSanctionList } from '@/server/public-entity';

import { getSanctionsByEmployeCosFeed } from '../../../src/server/disciplinaire.server';

describe('Unit - sanction server', () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it('returns empty result when employe does not exist', async () => {
    vi.mocked(getEmployeByCos).mockResolvedValue(null as never);

    const result = await getSanctionsByEmployeCosFeed(999);

    expect(getEmployeByCos).toHaveBeenCalledWith(999);
    expect(listSanctionsByEmployeId).not.toHaveBeenCalled();

    expect(result).toEqual({
      employe: null,
      items: [],
      count: 0,
    });
  });

  it('returns sanctions for an existing employe', async () => {
    const employe = {
      id: 1,
      COS: 1937,
      PRE: 'Jean',
    };

    const sanctions = [
      { id: 10, id_salarie: 1937 },
      { id: 11, id_salarie: 1937 },
    ];

    vi.mocked(getEmployeByCos).mockResolvedValue(employe as never);
    vi.mocked(listSanctionsByEmployeId).mockResolvedValue(sanctions as never);

    const result = await getSanctionsByEmployeCosFeed(1937);

    expect(getEmployeByCos).toHaveBeenCalledWith(1937);
    expect(listSanctionsByEmployeId).toHaveBeenCalledWith(1937);
    expect(omitInternalId).toHaveBeenCalledWith(employe);
    expect(toPublicSanctionList).toHaveBeenCalledWith(sanctions);

    expect(result).toEqual({
      employe: {
        id: 1,
        COS: 1937,
        PRE: 'Jean',
        public: true,
      },
      items: [
        { id: 10, id_salarie: 1937, public: true },
        { id: 11, id_salarie: 1937, public: true },
      ],
      count: 2,
    });
  });
});