import {
  descriptionForPhoto,
  titleForPhoto,
} from '@/photo';
import { Metadata } from 'next';
import { redirect } from 'next/navigation';
import {
  PATH_ROOT,
  absolutePathForPhoto,
  absolutePathForPhotoImage,
} from '@/site/paths';
import PhotoDetailPage from '@/photo/PhotoDetailPage';
import { getPhotoCached } from '@/cache';
import { getPhotos, getUniqueFilmSimulations } from '@/services/postgres';
import { ReactNode } from 'react';
import { FilmSimulation } from '@/simulation';
import { getPhotosFilmSimulationDataCached } from '@/simulation/data';

interface PhotoFilmSimulationProps {
  params: { photoId: string, simulation: FilmSimulation }
}

export async function generateStaticParams() {
  const params: PhotoFilmSimulationProps[] = [];

  const simulations = await getUniqueFilmSimulations();
  simulations.forEach(async ({ simulation }) => {
    const photos = await getPhotos({ simulation });
    params.push(...photos.map(photo => ({
      params: { photoId: photo.id, simulation },
    })));
  });

  return params;
}

export async function generateMetadata({
  params: { photoId, simulation },
}: PhotoFilmSimulationProps): Promise<Metadata> {
  const photo = await getPhotoCached(photoId);

  if (!photo) { return {}; }

  const title = titleForPhoto(photo);
  const description = descriptionForPhoto(photo);
  const images = absolutePathForPhotoImage(photo);
  const url = absolutePathForPhoto(photo, simulation);

  return {
    title,
    description,
    openGraph: {
      title,
      images,
      description,
      url,
    },
    twitter: {
      title,
      description,
      images,
      card: 'summary_large_image',
    },
  };
}

export default async function PhotoFilmSimulationPage({
  params: { photoId, simulation },
  children,
}: PhotoFilmSimulationProps & { children: ReactNode }) {
  const photo = await getPhotoCached(photoId);

  if (!photo) { redirect(PATH_ROOT); }

  const [
    photos,
    count,
    dateRange,
  ] = await getPhotosFilmSimulationDataCached({ simulation });

  return <>
    {children}
    <PhotoDetailPage {...{ photo, photos, simulation, count, dateRange }} />
  </>;
}
