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

const { requireAuthMock, getContratByBusinessIdFeedMock } = vi.hoisted(() => ({
  requireAuthMock: vi.fn(),
  getContratByBusinessIdFeedMock: vi.fn(),
}));

vi.mock('../../../../src/lib/requireAuth', () => ({
  requireAuth: requireAuthMock,
}));

vi.mock('../../../../src/server/contrats.server', () => ({
  getContratByBusinessIdFeed: getContratByBusinessIdFeedMock,
}));

import { GET } from '../../../../src/app/api/contrats/by-external/[externalId]/route';

const makeCtx = <T extends (...args: any[]) => any>(fn: T, params: Record<string, string>) => ({ params: Promise.resolve(params) } as unknown as Parameters<T>[1]);

describe('Unit — /api/contrats/by-external/[externalId] route', () => {
  beforeEach(() => {
    vi.resetAllMocks();
    requireAuthMock.mockReturnValue(null);
  });

  it('GET returns 200 when contrat exists', async () => {
    getContratByBusinessIdFeedMock.mockResolvedValue({ contrat: { id_contrat: 5524, id_salarie: 955 } });

    const res = await GET(new Request('http://localhost/api/contrats/by-external/5524'), makeCtx(GET, { externalId: '5524' }));

    expect(res.status).toBe(200);
    const body = await res.json();
    expect(body).toEqual({ message: 'Contrat retrieved by external ID', contrat: { id_contrat: 5524, id_salarie: 955 } });
  });

  it('GET returns 400 when externalId param is invalid', async () => {
    const res = await GET(new Request('http://localhost/api/contrats/by-external/abc'), makeCtx(GET, { externalId: 'abc' }));

    expect(res.status).toBe(400);
    const body = await res.json();
    expect(body.message).toBe('Invalid external ID parameter');
  });

  it('GET returns auth error when request is unauthorized', async () => {
    requireAuthMock.mockReturnValue(new Response('Unauthorized', { status: 401 }));

    const res = await GET(new Request('http://localhost/api/contrats/by-external/5524'), makeCtx(GET, { externalId: '5524' }));

    expect(res.status).toBe(401);
    expect(getContratByBusinessIdFeedMock).not.toHaveBeenCalled();
  });

  it('GET returns 404 when not found', async () => {
    getContratByBusinessIdFeedMock.mockResolvedValue({ contrat: null });

    const res = await GET(new Request('http://localhost/api/contrats/by-external/9999'), makeCtx(GET, { externalId: '9999' }));

    expect(res.status).toBe(404);
    const body = await res.json();
    expect(body.message).toBe('Contrat not found');
  });
});
