import { TravelersController } from './travelers.controller';
import type { AuthenticatedUser } from '../../../../libs/auth/src';

describe('TravelersController', () => {
  const currentUser: AuthenticatedUser = {
    id: 'u1',
    externalSubjectId: 'sub-1',
    displayName: 'Alex',
    email: 'a@example.com',
  };

  it('GET /trips/:tripId/travelers lists travelers', async () => {
    const travelersService = { listTravelers: jest.fn().mockResolvedValue([]) };
    const controller = new TravelersController(travelersService as never);

    await expect(controller.list('t1')).resolves.toEqual([]);
    expect(travelersService.listTravelers).toHaveBeenCalledWith('t1');
  });

  it('POST /trips/:tripId/travelers creates a traveler recorded by the current member', async () => {
    const created = {
      id: 'trav-1',
      tripId: 't1',
      displayName: 'Mila',
      travelerType: 'CHILD',
    };
    const travelersService = {
      createTraveler: jest.fn().mockResolvedValue(created),
    };
    const controller = new TravelersController(travelersService as never);

    const dto = { displayName: 'Mila', travelerType: 'CHILD' as const };
    await expect(controller.create('t1', currentUser, dto)).resolves.toEqual(
      created,
    );
    expect(travelersService.createTraveler).toHaveBeenCalledWith(
      't1',
      dto,
      'u1',
    );
  });

  it('PATCH /trips/:tripId/travelers/:travelerId updates a traveler', async () => {
    const updated = { id: 'trav-1', tripId: 't1', displayName: 'Mila Renamed' };
    const travelersService = {
      updateTraveler: jest.fn().mockResolvedValue(updated),
    };
    const controller = new TravelersController(travelersService as never);

    await expect(
      controller.update('t1', 'trav-1', { displayName: 'Mila Renamed' }),
    ).resolves.toEqual(updated);
    expect(travelersService.updateTraveler).toHaveBeenCalledWith(
      't1',
      'trav-1',
      { displayName: 'Mila Renamed' },
    );
  });

  it('DELETE /trips/:tripId/travelers/:travelerId removes a traveler', async () => {
    const travelersService = {
      removeTraveler: jest.fn().mockResolvedValue(undefined),
    };
    const controller = new TravelersController(travelersService as never);

    await controller.remove('t1', 'trav-1');
    expect(travelersService.removeTraveler).toHaveBeenCalledWith(
      't1',
      'trav-1',
    );
  });
});
