import { env } from "@/env/server"

import type {
  BreadcrumbList,
  Hotel as HotelSchema,
  ListItem,
  WithContext,
} from "schema-dts"

import type { HotelData } from "@/types/hotel"
import type { Breadcrumbs } from "@/types/trpc/routers/contentstack/breadcrumbs"

export function generateBreadcrumbsSchema(breadcrumbs: Breadcrumbs) {
  const itemListElement: ListItem[] = breadcrumbs.map((item, index) => ({
    "@type": "ListItem",
    position: index + 1,
    name: item.title,
    // Only include "item" if "href" exists; otherwise, omit it
    ...(item.href ? { item: `${env.PUBLIC_URL}${item.href}` } : {}),
  }))

  const jsonLd: WithContext<BreadcrumbList> = {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    itemListElement,
  }

  return {
    key: "breadcrumbs",
    type: "application/ld+json",
    jsonLd,
  }
}

export function generateHotelSchema(hotelData: HotelData) {
  const { hotel, additionalData } = hotelData
  const ratings = hotel.ratings?.tripAdvisor
  const checkinData = hotel.hotelFacts.checkin
  const image =
    additionalData.gallery?.heroImages[0] ||
    additionalData.gallery?.smallerImages[0]
  const facilities = hotel.detailedFacilities
  const jsonLd: WithContext<HotelSchema> = {
    "@context": "https://schema.org",
    "@type": "Hotel",
    name: hotel.name,
    address: {
      "@type": "PostalAddress",
      streetAddress: hotel.address.streetAddress,
      addressLocality: hotel.address.city,
      postalCode: hotel.address.zipCode,
      addressCountry: hotel.address.country,
    },
    checkinTime: checkinData.checkInTime,
    checkoutTime: checkinData.checkOutTime,
    amenityFeature: facilities.map((facility) => ({
      "@type": "LocationFeatureSpecification",
      name: facility.name,
    })),
  }

  if (image) {
    jsonLd.image = {
      "@type": "ImageObject",
      url: image.imageSizes.small,
      caption: image.metaData.title,
    }
  }

  if (ratings && ratings.rating && ratings.numberOfReviews) {
    jsonLd.aggregateRating = {
      "@type": "AggregateRating",
      ratingValue: ratings.rating,
      reviewCount: ratings.numberOfReviews,
    }
  }

  return {
    type: "application/ld+json",
    jsonLd,
  }
}
