/**
 * Nested enum requires namespace
 */
export namespace endpoints {
  namespace base {
    export const enum path {
      availability = "availability",
      booking = "booking",
      hotel = "hotel",
      package = "package",
      profile = "profile",
    }

    export const enum enitity {
      Ancillary = "Ancillary",
      Availabilities = "availabilities",
      Bookings = "Bookings",
      Breakfast = "breakfast",
      Cities = "Cities",
      Countries = "Countries",
      Hotels = "Hotels",
      Locations = "Locations",
      Packages = "packages",
      Profile = "Profile",
      Reward = "Reward",
      Stays = "Stays",
      Transaction = "Transaction",
    }
  }

  export namespace v1 {
    const version = "v1"
    /**
     * availability (Swagger)
     * https://tstapi.scandichotels.com/availability/swagger/v1/index.html
     */
    export namespace Availability {
      export function city(cityId: string) {
        return `${base.path.availability}/${version}/${base.enitity.Availabilities}/city/${cityId}`
      }
      export function hotel(hotelId: string) {
        return `${base.path.availability}/${version}/${base.enitity.Availabilities}/hotel/${hotelId}`
      }
    }

    /**
     * booking (Swagger)
     * https://tstapi.scandichotels.com/booking/swagger/v1/index.html
     */
    export namespace Booking {
      export const bookings = `${base.path.booking}/${version}/${base.enitity.Bookings}`

      export function booking(confirmationNumber: string) {
        return `${bookings}/${confirmationNumber}`
      }
      export function cancel(confirmationNumber: string) {
        return `${bookings}/${confirmationNumber}/cancel`
      }
      export function status(confirmationNumber: string) {
        return `${bookings}/${confirmationNumber}/status`
      }

      export const enum Stays {
        future = `${base.path.booking}/${version}/${base.enitity.Stays}/future`,
        past = `${base.path.booking}/${version}/${base.enitity.Stays}/past`,
      }
    }

    /**
     * hotel (Swagger)
     * https://tstapi.scandichotels.com/hotel/swagger/v1/index.html
     */
    export namespace Hotel {
      export const cities = `${base.path.hotel}/${version}/${base.enitity.Cities}`
      export namespace Cities {
        export function city(cityId: string) {
          return `${cities}/${cityId}`
        }
        export function country(countryId: string) {
          return `${cities}/country/${countryId}`
        }
        export function hotel(hotelId: string) {
          return `${cities}/hotel/${hotelId}`
        }
      }

      export const countries = `${base.path.hotel}/${version}/${base.enitity.Countries}`
      export namespace Countries {
        export function country(countryId: string) {
          return `${countries}/${countryId}`
        }
      }

      export const hotels = `${base.path.hotel}/${version}/${base.enitity.Hotels}`
      export namespace Hotels {
        export function hotel(hotelId: string) {
          return `${hotels}/${hotelId}`
        }
        export function meetingRooms(hotelId: string) {
          return `${hotels}/${hotelId}/meetingRooms`
        }
        export function merchantInformation(hotelId: string) {
          return `${hotels}/${hotelId}/merchantInformation`
        }
        export function nearbyHotels(hotelId: string) {
          return `${hotels}/${hotelId}/nearbyHotels`
        }
        export function restaurants(hotelId: string) {
          return `${hotels}/${hotelId}/restaurants`
        }
        export function roomCategories(hotelId: string) {
          return `${hotels}/${hotelId}/roomCategories`
        }
      }

      export const locations = `${base.path.hotel}/${version}/${base.enitity.Locations}`
    }

    /**
     * package (Swagger)
     * https://tstapi.scandichotels.com/package/swagger/v1/index.html
     */
    export namespace Package {
      export namespace Ancillary {
        export function hotel(hotelId: string) {
          return `${base.path.package}/${version}/${base.enitity.Ancillary}/hotel/${hotelId}`
        }
        export function hotelAncillaries(hotelId: string) {
          return `${base.path.package}/${version}/${base.enitity.Ancillary}/hotel/${hotelId}/ancillaries`
        }
      }

      export namespace Breakfast {
        export function hotel(hotelId: string) {
          return `${base.path.package}/${version}/${base.enitity.Breakfast}/hotel/${hotelId}`
        }
      }

      export namespace Packages {
        export function hotel(hotelId: string) {
          return `${base.path.package}/${version}/${base.enitity.Packages}/hotel/${hotelId}`
        }
      }
    }

    /**
     * profile (Swagger)
     * https://tstapi.scandichotels.com/profile/swagger/v1/index.html
     */
    export namespace Profile {
      export const invalidateSessions = `${base.path.profile}/${version}/${base.enitity.Profile}/invalidateSessions`
      export const membership = `${base.path.profile}/${version}/${base.enitity.Profile}/membership`
      export const profile = `${base.path.profile}/${version}/${base.enitity.Profile}`
      export const subscriberId = `${base.path.profile}/${version}/${base.enitity.Profile}/SubscriberId`

      // TODO: Remove once new endpoints are out in production.
      export const reward = `${base.path.profile}/${version}/${base.enitity.Profile}/reward`
      export const tierRewards = `${base.path.profile}/${version}/${base.enitity.Profile}/tierRewards`

      export function deleteProfile(profileId: string) {
        return `${profile}/${profileId}`
      }

      export const creditCards = `${base.path.profile}/${version}/${base.enitity.Profile}/creditCards`
      export namespace CreditCards {
        export const initiateSaveCard = `${creditCards}/initiateSaveCard`

        export function deleteCreditCard(creditCardId: string) {
          return `${creditCards}/${creditCardId}`
        }
        export function transaction(transactionId: string) {
          return `${creditCards}/${transactionId}`
        }
      }

      export namespace Reward {
        export const allTiers = `${base.path.profile}/${version}/${base.enitity.Reward}/allTiers`
        export const reward = `${base.path.profile}/${version}/${base.enitity.Reward}`
        export const redeem = `${base.path.profile}/${version}/${base.enitity.Reward}/redeem`
        export const unwrap = `${base.path.profile}/${version}/${base.enitity.Reward}/unwrap`

        export function claim(rewardId: string) {
          return `${base.path.profile}/${version}/${base.enitity.Reward}/Claim/${rewardId}`
        }
      }

      export const enum Transaction {
        friendTransactions = `${base.path.profile}/${version}/${base.enitity.Transaction}/friendTransactions`,
      }
    }
  }
}

export type Endpoint = string
