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

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

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

vi.mock('../../../../src/server/employes.server', () => ({
  getEmployeDetails: getEmployeDetailsMock,
}));

import { GET } from '../../../../src/app/api/employes/by-cos/[cos]/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/employes/by-cos/[cos] route', () => {
  beforeEach(() => {
    vi.resetAllMocks();
    requireAuthMock.mockReturnValue(null);
  });

  it('GET returns 200 when employe exists', async () => {
    getEmployeDetailsMock.mockResolvedValue({ employe: { id: 123, COS: 5504, PRE: 'Alice' } });

    const res = await GET(new Request('http://localhost/api/employes/by-cos/5504'), makeCtx(GET, { cos: '5504' }));

    expect(res.status).toBe(200);
    const body = await res.json();
    expect(body).toEqual({ message: 'Employe retrieved by COS', employe: { id: 123, COS: 5504, PRE: 'Alice' } });
  });

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

    expect(res.status).toBe(400);
    const body = await res.json();
    expect(body.message).toBe('Invalid COS 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/employes/by-cos/5504'), makeCtx(GET, { cos: '5504' }));

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

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

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

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