import { notFound } from "next/navigation"

import { GetCurrentBlockPage } from "@/lib/graphql/Query/CurrentBlockPage.graphql"
import { GetCurrentBlockPageTrackingData } from "@/lib/graphql/Query/CurrentBlockPageTrackingData.graphql"
import { request } from "@/lib/graphql/request"

import ContentPage from "@/components/Current/ContentPage"
import Header from "@/components/Current/Header"
import Tracking from "@/components/Current/Tracking"

import type { LangParams, PageArgs, UriParams } from "@/types/params"
import type { GetCurrentBlockPageData } from "@/types/requests/currentBlockPage"
import type { TrackingData } from "@/types/requests/trackingData"

export default async function CurrentContentPage({
  params,
  searchParams,
}: PageArgs<LangParams, UriParams>) {
  try {
    if (!searchParams.uri) {
      throw new Error("Bad URI")
    }

    const response = await request<GetCurrentBlockPageData>(
      GetCurrentBlockPage,
      {
        locale: params.lang,
        url: searchParams.uri,
      },
      {
        next: { tags: [`${searchParams.uri}-${params.lang}`] },
      }
    )

    if (!response.data?.all_current_blocks_page?.total) {
      console.log("#### DATA ####")
      console.log(response.data)
      console.log("SearchParams URI: ", searchParams.uri)
      throw new Error("Not found")
    }

    // This is currently to be considered a temporary solution to provide the tracking with a few values in english to align with existing reports
    const pageDataForTracking = await request<TrackingData>(
      GetCurrentBlockPageTrackingData,
      { uid: response.data.all_current_blocks_page.items[0].system.uid },
      {
        next: { tags: [`${searchParams.uri}-en`] },
      }
    )

    const pageData = response.data.all_current_blocks_page.items[0]

    const trackingData = {
      lang: params.lang,
      publishedDate: pageData.system.updated_at,
      createdDate: pageData.system.created_at,
      pageId: pageData.system.uid,
      englishUrl: pageDataForTracking.data?.current_blocks_page.url,
    }

    return (
      <>
        <Header lang={params.lang} uid={pageData.system.uid} />
        <ContentPage data={response.data} />
        <Tracking pageData={trackingData} />
      </>
    )
  } catch (err) {
    return notFound()
  }
}
