export interface TravelEventInvitationRequest {
  summary: TravelEventSummary;
  settings: TravelEventSettings;
  participants: TravelEventParticipant[];
  contactId: string;
  shouldSendEmail?: boolean;
}

interface TravelEventSummary {
  name: string;
  description?: string;
  pictureUrl?: string;
  startDateTime: string;
  endDateTime: string;
  location: TravelEventLocation;
  note: string[];
  cancellationNote: string[];
}

interface TravelEventLocation {
  placeId: string;
  displayName: string;
  type: TravelEventLocationType;
  companyOfficeId?: string;
  companyOfficeName?: string;
  coordinates?: {
    latitude: number;
    longitude: number;
  };
}

export enum TravelEventLocationType {
  OFFICE = 'OFFICE',
  PLACE = 'PLACE'
}

interface TravelEventSettings {
  travelConditions: TravelEventConditions;
  reportingSettings: TravelEventReportingSettings;
  notificationSettings: TravelEventNotificationSettings;
}

interface TravelEventConditions {
  accommodation: TravelEventAccommodation;
  transportation: TravelEventTransportation;
  commute: TravelEventCommute;
  travelWindows: TravelEventTravelWindows[];
  payment: TravelEventPayment;
  numberOfExtraGuestsAllowed: number;
  companyPolicyLevelId: string;
}

interface TravelEventTravelConditions {
  numberOfBookingsAllowed: number;
  note?: string[];
  maxPrice?: TravelEventMonetaryValue;
}

interface TravelEventMonetaryValue {
  amount: number;
  currency: string;
}

interface TravelEventAccommodation {
  hotelConditions: TravelEventHotelConditions;
}

interface TravelEventHotelConditions extends TravelEventTravelConditions {
  allowedHotels?: string[];
  suggestedHotels?: TravelEventSuggestedHotel[];
  allowedHotelRates?: string[];
}

interface TravelEventSuggestedHotel {
  searchId: string;
  hotelId: string;
  name: string;
  googlePlaceId: string;
}

interface TravelEventTransportation {
  carConditions: TravelEventCarConditions;
  flightConditions: TravelEventFlightConditions;
  trainConditions: TravelEventTrainConditions;
}

interface TravelEventCarConditions extends TravelEventTravelConditions {
  suggestedCarRentalCompanies?: string[];
}

interface TravelEventFlightConditions extends TravelEventTravelConditions {
  allowedItineraryTypes?: TravelEventFlightItineraryType[];
  allowedDepartureAirportCodes?: string[];
  allowedArrivalAirportCodes?: string[];
  suggestedDepartureAirportCodes?: string[];
  suggestedArrivalAirportCodes?: string[];
}

enum TravelEventFlightItineraryType {
  ONE_WAY = 'ONE_WAY',
  ROUND_TRIP = 'ROUND_TRIP',
  BUNDLE = 'BUNDLE',
  FLEXIBLE_BUNDLE = 'FLEXIBLE_BUNDLE',
  UNKNOWN = 'UNKNOWN'
}

interface TravelEventTrainConditions extends TravelEventTravelConditions {
  allowedItineraryTypes?: TravelEventTrainItineraryType[];
  allowedDepartureStationIds?: string[];
  allowedArrivalStationIds?: string[];
  suggestedDepartureStationIds?: string[];
  suggestedArrivalStationIds?: string[];
}

export enum TravelEventTrainItineraryType {
  ONE_WAY = 'ONE_WAY',
  RETURN = 'RETURN',
  OPEN_RETURN = 'OPEN_RETURN'
}

interface TravelEventReportingSettings {
  billTo?: string;
  department?: string;
  region?: string;
  subsidiary?: string;
  customFieldValues: TravelEventCustomFieldValue[];
}

interface TravelEventCustomFieldValue {
  name: string;
  label: string;
  value: any;
  sabreName: string;
  approver: string;
  optionLabel: string;
}

interface TravelEventCommute {
  blackCars: string[];
  cars: string[];
  trains: string[];
}

interface TravelEventTravelWindows {
  verticals: TravelEventVertical[];
  earliestDepartureDateTime: TravelEventTravelWindowsDateTime;
  latestArrivalDateTime: TravelEventTravelWindowsDateTime;
  earliestLeaveDateTime: TravelEventTravelWindowsDateTime;
  latestReturnDateTime: TravelEventTravelWindowsDateTime;
}

export enum TravelEventVertical {
  FLIGHT = 'FLIGHT',
  HOTEL = 'HOTEL',
  CAR = 'CAR',
  BLACK_CAR = 'BLACK_CAR',
  RAIL = 'RAIL'
}

interface TravelEventTravelWindowsDateTime {
  value: string;
  type: TravelEventTravelWindowsDateTimeType;
}

export enum TravelEventTravelWindowsDateTimeType {
  MANDATORY = 'MANDATORY',
  SUGGESTED = 'SUGGESTED'
}

interface TravelEventPayment {
  allowedPaymentMethodIds: string[];
  allowedCarDirectBillPaymentMethodIds: string[];
  addingNewPaymentMethodAllowed: boolean;
}

interface TravelEventNotificationSettings {
  enabledOrganizerNotifications: OrganizerNotification[];
  enabledParticipantNotifications: ParticipantNotification[];
  enabledParticipantReminders: ParticipantReminder[];
}

enum OrganizerNotification {
  BOOKING_CREATED = 'BOOKING_CREATED',
  BOOKING_CANCELED = 'BOOKING_CANCELED',
  BOOKING_CHANGED = 'BOOKING_CHANGED',
  EVENT_CREATED = 'EVENT_CREATED',
  EVENT_CHANGED = 'EVENT_CHANGED',
  EVENT_CANCELED = 'EVENT_CANCELED',
  INVITE_ACCEPTED = 'INVITE_ACCEPTED',
  INVITE_DECLINED = 'INVITE_DECLINED',
  INVITE_FINALIZED = 'INVITE_FINALIZED'
}

enum ParticipantNotification {
  BOOKING_CREATED = 'BOOKING_CREATED',
  BOOKING_CANCELED = 'BOOKING_CANCELED',
  BOOKING_CHANGED = 'BOOKING_CHANGED',
  EVENT_CREATED = 'EVENT_CREATED',
  EVENT_CHANGED = 'EVENT_CHANGED',
  EVENT_CANCELED = 'EVENT_CANCELED',
  INVITE_ACCEPTED = 'INVITE_ACCEPTED',
  INVITE_DECLINED = 'INVITE_DECLINED',
  INVITE_FINALIZED = 'INVITE_FINALIZED'
}

interface ParticipantReminder {
  type: ParticipantReminderType;
  start: string;
  end: string;
  repeatInterval: string;
}

enum ParticipantReminderType {
  INVITATION_RESPONSE = 'INVITATION_RESPONSE',
  DRAFT_COMPLETION = 'DRAFT_COMPLETION'
}

interface TravelEventParticipant {
  email: string;
  givenName: string;
  familyName: string;
  billTo?: string;
  department?: string;
}
