import type { Metadata } from "next";
import { notFound } from "next/navigation";
import { PageContainer } from "@/components/layout/PageContainer";
import { EventDetailView } from "@/components/dashboard/EventDetailView";
import { requireAuth } from "@/modules/auth";
import { eventService } from "@/modules/events";
import {
  PREBUILT_MODULES,
  PREBUILT_MODULE_BY_SLUG,
  type PrebuiltModuleDefinition,
} from "@/modules/modules/module-catalog";
import { connectToDatabase } from "@/lib/db/mongoose";
import { Module } from "@/modules/modules/module.model";

export const dynamic = "force-dynamic";

export async function generateMetadata({
  params,
}: {
  params: Promise<{ eventId: string }>;
}): Promise<Metadata> {
  const { eventId } = await params;
  const event = await eventService.findById(eventId);
  return { title: event ? `${event.title} · Event Manager` : "Event" };
}

export default async function EventDetailPage({
  params,
}: {
  params: Promise<{ eventId: string }>;
}) {
  const session = await requireAuth();
  const { eventId } = await params;
  const event = await eventService.findById(eventId);
  if (!event || event.userId !== session.user.id) notFound();

  const snapshotModules =
    event.templateSnapshot?.modules
      .filter((m) => m.enabled)
      .sort((a, b) => a.displayOrder - b.displayOrder) ?? [];

  const slugs = snapshotModules.length
    ? snapshotModules.map((m) => m.slug)
    : PREBUILT_MODULES.filter((m) => !m.implicit).map((m) => m.slug);

  await connectToDatabase();
  const dbModules = await Module.find({ slug: { $in: slugs } })
    .select("slug name description icon iconImage image category")
    .exec();
  const bySlug = new Map(
    dbModules.map((d) => [
      d.slug,
      {
        icon: d.icon,
        iconImage: d.iconImage ?? null,
        image: d.image ?? null,
        name: d.name,
        description: d.description,
        category: d.category,
      },
    ]),
  );

  const buildFromSlug = (slug: string): PrebuiltModuleDefinition | null => {
    const staticDef = PREBUILT_MODULE_BY_SLUG.get(slug);
    if (!staticDef) return null;
    const override = bySlug.get(slug);
    return {
      ...staticDef,
      icon: override?.icon ?? staticDef.icon,
      iconImage:
        override?.iconImage !== undefined && override.iconImage !== null
          ? override.iconImage
          : staticDef.iconImage ?? null,
      image:
        override?.image !== undefined && override.image !== null
          ? override.image
          : staticDef.image ?? null,
      name: override?.name ?? staticDef.name,
      description: override?.description ?? staticDef.description,
      category: override?.category ?? staticDef.category,
    };
  };

  const modules: PrebuiltModuleDefinition[] = snapshotModules.length
    ? snapshotModules
        .map((m) => buildFromSlug(m.slug))
        .filter((v): v is PrebuiltModuleDefinition => Boolean(v))
    : PREBUILT_MODULES.filter((m) => m.implicit === false)
        .map((m) => buildFromSlug(m.slug))
        .filter((v): v is PrebuiltModuleDefinition => Boolean(v));

  const attachedAdvanceFolderIds =
    event.templateSnapshot?.advanceFolders?.filter((a) => a.enabled)
      .map((a) => a.folderId) ?? [];

  return (
    <PageContainer>
      <EventDetailView
        event={event}
        modules={modules.map((m) => ({
          slug: m.slug,
          name: m.name,
          description: m.description,
          icon: m.icon,
          iconImage: m.iconImage ?? null,
          image: m.image ?? null,
          category: m.category,
          itemFields: m.itemFields ?? [],
          eventFields: m.eventFields ?? [],
        }))}
        advanceFolderIds={attachedAdvanceFolderIds}
      />
    </PageContainer>
  );
}
