import { BookingPackageFlight } from "@qite/tide-client/build/types";

export interface Settings {
  officeId: number;
  bookingOptions: BookingOptions;
  productPath: string;
  basePath: string;
  roomOptions: {
    isHidden?: boolean | null;
    pathSuffix?: string | null;
  },
  flightOptions: {
    isHidden?: boolean | null;
    pathSuffix?: string | null;
  },
  options: {
    pathSuffix: string;
  };
  travellers: {
    pathSuffix: string;
  };
  summary: {
    pathSuffix: string;
    checkboxes?: SummaryCheckbox[] | null;
  };
  confirmation: {
    pathSuffix: string;
  };
  error: {
    pathSuffix: string;
  };
  language: string;
  currency: string;
  includeFlights?: boolean;
  generatePaymentUrl?: boolean;
  skipPaymentWithAgent?: boolean;
  companyContactEmail: string;
  companyContactPhone: string;
  showProductCardRating: boolean;
  showSidebarDeposit: boolean;
  sidebarHeaderComponent?: JSX.Element | null;
  sidebarFooterComponent?: JSX.Element | null;
  loaderComponent?: JSX.Element | null;
  icons?: string | null;
  tagIds?: number[];
  agentRequired?: boolean;
  hideAgentSelection?: boolean;
  agentAdressId?: number;
  affiliateSlug?: string;
  enableVoucher?: boolean;
  skipRouter?: boolean;
  apiUrl?: string;
  apiKey?: string;
  hideTags?: boolean;
  translationFiles?: {
    language: string,
    path: string;
  }[];
  accommodations?: AccommodationContent[];
  regimes?: RegimeContent[];
  accommodationViewId?: number;
  isOffer?: boolean;
}

export interface BookingOptions {
  b2b: BookingOptionsDetail;
  b2b2c: BookingOptionsDetail;
  b2c: BookingOptionsDetail;
}

export interface BookingOptionsDetail {
  entryStatus: number;
  customEntryStatusId?: number;
  tagIds?: number[];
}

export interface SummaryCheckbox {
  id: string;
  text: string;
  isSelected: boolean;
}

export interface Traveler {
  id: number;
  gender: string;
  firstName: string;
  lastName: string;
  birthDate: string;
}

export interface Room {
  adults: number;
  children: number;
  childAges: number[];
  accommodationCode?: string;
  regimeCode?: string;
}

export interface FlightInfo {
  outwardCode: string;
  outwardNumbers: string[];
  outwardClass: string;
  returnCode: string;
  returnNumbers: string[];
  returnClass: string;
}

export interface TravelersFormValues {
  rooms: TravelersFormRoomValues[];
  startDate?: string;
  mainBookerId: number;
  street: string;
  houseNumber: string;
  box: string;
  zipCode: string;
  place: string;
  country: string;
  phone: string;
  email: string;
  emailConfirmation: string;
  travelAgentId: number;
  travelAgentName: string;
}

export interface TravelersFormRoomValues {
  adults: Traveler[];
  children: Traveler[];
}

export interface ProductAttributes {
  productCode: string;
  productName: string;
}

export interface BookingAttributes {
  startDate: string;
  endDate: string;
  catalog: number;
  rooms: Room[];
  flight: FlightInfo | null;
  tourCode: string | null;
  allotmentName: string | null;
  allotmentIds: number[];
  includeFlights?: boolean;
}

export interface FlightLine {
  departureAirportIata?: string;
  departureAirportDescription?: string;
  departureDate?: string;
  departureTime?: string;
  arrivalAirportIata?: string;
  arrivalAirportDescription?: string;
  arrivalDate?: string;
  arrivalTime?: string;
  airlineIata?: string;
  airlineDescription?: string;
  airlineNumber?: string;
  travelClass?: string;
}

export interface AccommodationContent {
  code: string;
  title: string;
  imageUrl: string;
  usps: string[];
  description: string | undefined;
}

export interface RegimeContent {
  code: string;
  title: string;
}

export interface SelectableRoom {
  index: number;
  selected: SelectableRoomAccommodation,
  alternatives: SelectableRoomAccommodation[];
}

export interface SelectableRoomAccommodation {
  code: string;
  regimeCode: string;
  from: string;
  to: string;
  price: number;
  regimes: SelectableRoomRegime[];
  title: string;
  image: string | undefined;
  usps: string[];
  description: string | undefined;
  viewHtml: string | undefined
}

export interface SelectableRoomRegime {
  code: string;
  title: string;
  price: number;
}

export interface GroupedFlights {
  isSelected: boolean;
  price: number;

  outward: GroupedFlightDetails;
  return: GroupedFlightDetails;

  selectedOutward: BookingPackageFlight;
  selectedReturn: BookingPackageFlight;
}

export interface GroupedFlightDetails {
  airlineCode: string;
  airline: string;
  departureDate: string;
  departureTime: string;
  departureAirportCode: string;
  departureAirport: string;
  arrivalDate: string;
  arrivalTime: string;
  arrivalAirport: string;
  changeDurationMinutes: number;
  travelDurationMinutes: number;
  travelDuration: string;
  numberOfStops: number;
  isNextDay: boolean;
  travelClass: string;
  flightLines: GroupedFlightLine[];
}

export interface GroupedFlightLine {
  airline: string;
  number: string;
  departureDate: string;
  departureTime: string;
  departureAirport: string;
  arrivalDate: string;
  arrivalTime: string;
  arrivalAirport: string;
  travelDuration: string;
  waitDuration: string | undefined;
}

export interface FlightFilterOptions {
  airports: FlightFilterOption[];
  airlines: FlightFilterOption[];
  numberOfStops: FlightFilterOption[];
  outward: FlightDirectionFilter;
  return: FlightDirectionFilter;
}

export interface FlightFilterOption {
  value: string;
  label: string;
  count: number;
  isSelected: boolean;
}

export interface FlightDirectionFilter {
  departurePeriod: FlightFilterOption[];
  travelDuration: TimeRangeFilter;
  changeDuration: TimeRangeFilter;
}

export interface TimeRangeFilter {
  min: number;
  max: number;
  
  selectedMin: number;
  selectedMax: number;
}