import { faker } from '@faker-js/faker';
import { buildRailForEmployee } from '@fixtures/navan_pro/reed_mackay_booking/rail_data';
import { Employee } from '@fixtures/navan_pro/reed_mackay_booking/common';
import { buildHotelForEmployee } from '@fixtures/navan_pro/reed_mackay_booking/hotel_data';
import { buildCarForEmployee } from '@fixtures/navan_pro/reed_mackay_booking/car_data';
import { buildFlightForEmployee } from '@fixtures/navan_pro/reed_mackay_booking/flight_data';
import { buildBlackCarForEmployee } from '@fixtures/navan_pro/reed_mackay_booking/black_car_data';

function buildBaseTrip() {
  return {
    tripName: `Trip to ${faker.address.city()}`,
    source: 'REED_MACKAY'
  };
}

export function buildRailTripForEmployee(employee: Employee) {
  return {
    ...buildBaseTrip(),
    rails: [buildRailForEmployee(employee)]
  };
}

export function buildHotelTripForEmployee(employee: Employee) {
  return {
    ...buildBaseTrip(),
    hotels: [buildHotelForEmployee(employee)]
  };
}

export function buildCarTripForEmployee(employee: Employee) {
  return {
    ...buildBaseTrip(),
    cars: [buildCarForEmployee(employee)]
  };
}

export function buildFlightTripForEmployee(employee: Employee) {
  return {
    ...buildBaseTrip(),
    flights: [buildFlightForEmployee(employee)]
  };
}

export function buildBlackCarTripForEmployee(employee: Employee) {
  return {
    ...buildBaseTrip(),
    blackCars: [buildBlackCarForEmployee(employee)]
  };
}

enum Vertical {
  flight,
  rail,
  hotel,
  blackCar,
  car
}

export function buildMultipleVerticalsTripForEmployee(
  employee: Employee,
  verticals: Vertical[] = [Vertical.flight, Vertical.hotel]
) {
  return {
    ...buildBaseTrip(),
    ...verticals.reduce((accum, vertical) => {
      accum = { ...accum, ...buildVerticalFieldForEmployee(vertical, employee) };

      return accum;
    }, {})
  };
}

function buildVerticalFieldForEmployee(vertical: Vertical, employee: Employee) {
  switch (vertical) {
    case Vertical.blackCar:
      return { blackCars: buildBlackCarForEmployee(employee) };
    case Vertical.car:
      return { cars: buildCarForEmployee(employee) };
    case Vertical.rail:
      return { rails: buildRailForEmployee(employee) };
    case Vertical.hotel:
      return { hotels: buildHotelForEmployee(employee) };
    case Vertical.flight:
      return { flights: buildFlightForEmployee(employee) };
  }
}
