import { env } from "@/env/server"
import { serverClient } from "@/lib/trpc/server"

import type { AlternateURLs } from "next/dist/lib/metadata/types/alternative-urls-types"

import type {
  ContentTypeParams,
  LangParams,
  PageArgs,
  UIDParams,
} from "@/types/params"
import type { Lang } from "@/constants/languages"

export async function generateMetadata({
  searchParams,
  params,
}: PageArgs<
  LangParams & ContentTypeParams & UIDParams,
  { subpage?: string; filterFromUrl?: string }
>) {
  const { lang } = await params
  const { subpage, filterFromUrl, ...otherSearchParams } = await searchParams
  // If there are other (real) search params, we don't want to index the page as this will
  // cause duplicate content issues.
  const noIndexOnSearchParams = !!Object.keys(otherSearchParams).length
  const caller = await serverClient()
  const { metadata, alternates } = await caller.contentstack.metadata.get({
    subpage,
    filterFromUrl,
    noIndex: noIndexOnSearchParams,
  })

  if (!metadata) {
    return {
      robots: {
        index: env.isLangLive(lang),
        follow: env.isLangLive(lang),
      },
    }
  }

  if (typeof metadata?.robots === "string") {
    return metadata
  }

  return {
    ...metadata,
    robots: {
      ...(metadata.robots ?? {}),
      index: isIndexable(metadata.robots?.index, lang, alternates),
      follow: isIndexable(metadata.robots?.follow, lang, alternates),
    },
  }
}

function isIndexable(
  pageIndexableFromSettings: boolean | null | undefined,
  lang: Lang,
  alternates: AlternateURLs | null
) {
  // This is a special case for whitelisting the scandic friends pages, this can be removed when all pages are live
  const url = getUrl(alternates)
  const firstNonLangSegment = (url ?? "").substring(3)
  if (firstNonLangSegment.startsWith("/scandic-friends")) {
    return true
  }

  // If we are live we want to index the page, but if the page has been marked as noindex in contentstack we don't
  return (pageIndexableFromSettings ?? true) && env.isLangLive(lang)
}

function getUrl(alternates: AlternateURLs | null): string | null {
  try {
    if (!alternates?.canonical) {
      return null
    }

    if (typeof alternates.canonical === "string") {
      return alternates.canonical
    }

    if ("href" in alternates.canonical) {
      return alternates.canonical.href
    }

    if (typeof alternates.canonical.url === "string") {
      return alternates.canonical.url
    }

    return alternates.canonical.url.href
  } catch {
    return null
  }
}
