import type { Lang } from "@/constants/languages"
import type { MembershipLevel } from "@/constants/membershipLevels"
import type { RateEnum } from "../enums/rate"

export enum TrackingChannelEnum {
  "scandic-friends" = "scandic-friends",
  "static-content-page" = "static-content-page",
  "hotelreservation" = "hotelreservation",
  "collection-page" = "collection-page",
  "campaign-page" = "campaign-page",
  "hotels" = "hotels",
  "homepage" = "homepage",
}

export type TrackingChannel = keyof typeof TrackingChannelEnum

export type TrackingSDKPageData = {
  pageId: string
  createDate?: string
  publishDate?: string
  domainLanguage: Lang
  pageType: string
  channel: TrackingChannel
  siteVersion: "new-web"
  pageName: string
  domain?: string
  siteSections: string
  pageLoadTime?: number // Page load time in seconds
  lcpTime?: number // Largest contentful paint time in seconds
  sessionId?: string | null
}

export enum LoginTypeEnum {
  email = "email",
  "membership number" = "membership number",
  "email link" = "email link",
}
export type LoginType = keyof typeof LoginTypeEnum

export type TrackingSDKUserData =
  | {
      loginStatus: "logged in"
      loginType?: LoginType
      memberId?: string
      membershipNumber?: string
      memberLevel?: MembershipLevel
      noOfNightsStayed?: number
      totalPointsAvailableToSpend?: number
      loginAction?: "login success"
    }
  | {
      loginStatus: "Non-logged in"
    }
  | { loginStatus: "Error" }

export type TrackingSDKAncillaries = Ancillary[]

export type TrackingSDKHotelInfo = {
  ageOfChildren?: string // "10", "2,5,10"
  analyticsRateCode?: RateEnum | string
  arrivalDate?: string
  availableResults?: number // Number of hotels to choose from after a city search
  bedType?: string
  bedTypePosition?: number // Which position the bed type had in the list of available bed types
  bnr?: string // Booking number
  breakfastOption?: string // "no breakfast" or "breakfast buffet"
  //bonuscheque?: boolean
  bookingCode?: string
  bookingCodeAvailability?: string
  bookingTypeofDay?: "weekend" | "weekday"
  childBedPreference?: string
  country?: string // Country of the hotel
  departureDate?: string
  discount?: number | string
  duration?: number // Number of nights to stay
  hotelID?: string
  leadTime?: number // Number of days from booking date until arrivalDate
  lowestRoomPrice?: number
  multiroomRateIdentity?: string
  //modifyValues?: string // <price:<value>,roomtype:value>,bed:<value,<breakfast:value>
  noOfAdults?: number | string // multiroom support, "2,1,3"
  noOfChildren?: number | string // multiroom support, "2,1,3"
  noOfRooms?: number
  rateCode?: string
  rateCodeCancellationRule?: string
  rateCodeName?: string // Scandic Friends - full flex inkl. frukost
  rateCodeType?: string // regular, promotion etc
  region?: string // Region of the hotel
  revenueCurrencyCode?: string // SEK, DKK, NOK, EUR
  rewardNight?: string
  rewardNightAvailability?: string
  points?: number | string // Should be sent on confirmation page and enter-details page
  roomPrice?: number | string
  roomTypeCode?: string
  roomTypeName?: string
  roomTypePosition?: number // Which position the room had in the list of available rooms
  searchTerm?: string
  searchType?: "destination" | "hotel"
  specialRoomType?: string // allergy room, pet-friendly, accesibillity room
  totalPrice?: number | string
  lateArrivalGuarantee?: string
  guaranteedProduct?: string
}

export type Ancillary = {
  productId: string
  productUnits?: number
  hotelid?: string
  productPoints: number
  productPrice: number
  productType: string
  productName: string
  productCategory: string
}

export type TrackingSDKPaymentInfo = {
  edccCurrencyFrom?: string
  edccCurrencyTo?: string
  isedcc?: string
  isSavedCard?: boolean
  isCreditCard?: boolean
  paymentStatus?: "confirmed"
  paymentType?: string
  type?: string
  status?: string
}

export type TrackingSDKProps = {
  pageData: TrackingSDKPageData
  hotelInfo?: TrackingSDKHotelInfo
  paymentInfo?: TrackingSDKPaymentInfo
  ancillaries?: TrackingSDKAncillaries
}

export type TrackingSDKData = TrackingSDKPageData & {
  pathName: string
}

type BasePaymentEvent = {
  event: string
  hotelId: string | undefined
  method?: string | null
  isSavedCreditCard?: boolean
  smsEnable?: boolean
  status: "attempt" | "cancelled" | "failed"
}

export type PaymentAttemptStartEvent = BasePaymentEvent

export type PaymentCancelEvent = BasePaymentEvent

export type PaymentFailEvent = BasePaymentEvent & {
  errorMessage?: string
}

export type PaymentEvent =
  | PaymentAttemptStartEvent
  | PaymentCancelEvent
  | PaymentFailEvent

export type LowestRoomPriceEvent = {
  hotelId: string | null
  arrivalDate: string | null
  departureDate: string | null
  lowestPrice: string
  currency?: string
}

// Old tracking setup types:
// TODO: Remove this when we delete "current site"
export type TrackingProps = {
  pageData: {
    pageId: string
    createdDate: string
    publishedDate: string
    englishUrl?: string
    lang: Lang
  }
}

export type TrackingData = {
  lang: Lang
  englishUrl?: string
  pathName: string
  queryString: string
  pageId: string
  publishedDate: string
  createdDate: string
}

export type SiteSectionObject = {
  sitesection1: string
  sitesection2: string
  sitesection3: string
  sitesection4: string
  sitesection5: string
  sitesection6: string
}

export type TrackingPosition =
  | "top menu"
  | "hamburger menu"
  | "join scandic friends sidebar"
  | "enter details"
  | "my stay"
