import { PublicLayout } from '@/components/layout/public/public-layout';
import { Metadata } from 'next';
import { createHelpers } from '@/lib/trpc/server';
import PageGrid from './_components/page-grid';
import { dehydrate, HydrationBoundary } from '@tanstack/react-query';
import { TopicsEnum } from '@/config/enums';
import {
  checkboxOptions,
  initialBounds,
  initialLimit,
  sponsored
} from './_constants/map-options';
import { redirect } from 'next/navigation';
import { Routes } from '@/config/routes';
import { buildMetadataFromContent, generateMetaTags } from '@/lib/meta-tags/server';

const kortContent = {
  title: 'kort',
  description: 'Magasinet KBH kort',
  author: 'Magasinet KBH',
  url: 'https://magasinetkbh.dk/kort',
};

export async function generateMetadata(): Promise<Metadata> {
  return await buildMetadataFromContent(kortContent);
}

export default async function MapPage({
  searchParams
}: {
  searchParams?: Promise<Record<string, string>>;
}) {
  const params = await searchParams;
  const helpers = await createHelpers();
  const filtersParam = params?.filters;

  if (filtersParam) {
    const filters = filtersParam.split(',').filter(Boolean);
    const allowedIds = checkboxOptions.map((option) => option.id);
    const isValid = filters.every((param) => allowedIds.includes(param));
    if (!isValid) {
      redirect(Routes.MAP);
    }
  }

  const topic = (() => {
    if (!filtersParam) return undefined;
    const arr = filtersParam.split(',').filter((item) => item !== sponsored);
    return arr.length ? (arr as TopicsEnum[]) : undefined;
  })();

  const isSponsored = !!filtersParam?.includes(sponsored);

  await Promise.all([
    helpers.posts.list.prefetch({
      topic,
      isSponsored,
      bounds: initialBounds,
      limit: initialLimit,
      notTopic: [TopicsEnum.REVIEWS]
    }),
    helpers.posts.count.prefetch({
      topic,
      isSponsored,
      bounds: initialBounds,
      notTopic: [TopicsEnum.REVIEWS]
    }),
    helpers.posts.getGeolocations.prefetch({
      topic,
      isSponsored,
      bounds: initialBounds,
      notTopic: [TopicsEnum.REVIEWS]
    })
  ]);

  const { jsonLd } = await generateMetaTags(kortContent);

  return (
    <PublicLayout>
      {jsonLd && (
        <script
          type='application/ld+json'
          dangerouslySetInnerHTML={{
            __html: JSON.stringify(jsonLd).replace(/</g, '\\u003c')
          }}
        />
      )}
      <HydrationBoundary state={dehydrate(helpers.queryClient)}>
        <PageGrid />
      </HydrationBoundary>
    </PublicLayout>
  );
}
