import { getIntl } from "@/i18n"

import { truncateTextAfterLastPeriod } from "../truncate"

import type { RawMetadataSchema } from "@/types/trpc/routers/contentstack/metadata"

function getSubpageDescription(
  subpageUrl: string,
  additionalHotelData: RawMetadataSchema["additionalHotelData"],
  hotelRestaurants: RawMetadataSchema["hotelRestaurants"]
) {
  const restaurantSubPage = hotelRestaurants?.find(
    (restaurant) => restaurant.nameInUrl === subpageUrl
  )
  if (restaurantSubPage?.elevatorPitch) {
    return restaurantSubPage.elevatorPitch
  }

  if (!additionalHotelData) {
    return null
  }

  switch (subpageUrl) {
    case additionalHotelData.hotelParking.nameInUrl:
      return additionalHotelData.hotelParking.elevatorPitch
    case additionalHotelData.healthAndFitness.nameInUrl:
      return additionalHotelData.healthAndFitness.elevatorPitch
    case additionalHotelData.hotelSpecialNeeds.nameInUrl:
      return additionalHotelData.hotelSpecialNeeds.elevatorPitch
    case additionalHotelData.meetingRooms.nameInUrl:
      return additionalHotelData.meetingRooms.elevatorPitch
    default:
      return null
  }
}

export async function getHotelPageDescription(data: RawMetadataSchema) {
  const intl = await getIntl()
  const { subpageUrl, hotelData, additionalHotelData, hotelRestaurants } = data
  if (!hotelData) {
    return null
  }

  if (subpageUrl) {
    const subpageDescription = getSubpageDescription(
      subpageUrl,
      additionalHotelData,
      hotelRestaurants
    )

    if (subpageDescription) {
      return truncateTextAfterLastPeriod(subpageDescription)
    }
  }

  const hotelName = hotelData.name
  const location = hotelData.address.city
  const amenities = hotelData.detailedFacilities

  if (amenities.length < 4) {
    return intl.formatMessage(
      { defaultMessage: "{hotelName} in {location}. Book your stay now!" },
      { hotelName, location }
    )
  }

  const hotelDescription = intl.formatMessage(
    {
      defaultMessage:
        "{hotelName} in {location} offers {amenity1} and {amenity2}. Guests can also enjoy {amenity3} and {amenity4}. Book your stay at {hotelName} today!",
    },
    {
      hotelName,
      location,
      amenity1: amenities[0].name,
      amenity2: amenities[1].name,
      amenity3: amenities[2].name,
      amenity4: amenities[3].name,
    }
  )
  const shortHotelDescription = intl.formatMessage(
    {
      defaultMessage:
        "{hotelName} in {location} offers {amenity1} and {amenity2}. Guests can also enjoy {amenity3} and {amenity4}.",
    },
    {
      hotelName,
      location,
      amenity1: amenities[0].name,
      amenity2: amenities[1].name,
      amenity3: amenities[2].name,
      amenity4: amenities[3].name,
    }
  )

  if (hotelDescription.length > 160) {
    if (shortHotelDescription.length > 160) {
      return truncateTextAfterLastPeriod(shortHotelDescription)
    }
    return shortHotelDescription
  } else {
    return hotelDescription
  }
}
