import { notFound } from "next/navigation";

import { auth } from "@/config/auth";
import { PrismaCampaignsRepository } from "@/modules/campaigns/repositories/prisma-campaigns-repository";
import { PrismaEmailEventsRepository } from "@/modules/ses-webhooks/repositories/prisma-email-events-repository";
import { GetCampaignByIdUseCase } from "@/modules/campaigns/use-cases/get-campaign-by-id-use-case";
import { PrismaSendersRepository } from "@/modules/senders/repositories/prisma-senders-repository";
import { GetSendersByUserUseCase } from "@/modules/senders/use-cases/get-senders-by-user-use-case";
import { PrismaContactListsRepository } from "@/modules/contacts/repositories/prisma-contact-lists-repository";
import { GetAllContactListsUseCase } from "@/modules/contacts/use-cases/get-all-contact-lists-use-case";
import { CampaignDetailView } from "@/modules/campaigns/components/campaign-detail-view";

export default async function CampaignDetailPage({
  params,
}: {
  params: Promise<{ id: string }>;
}) {
  const session = await auth();
  const { id } = await params;

  if (!session?.user?.id) {
    notFound();
  }

  const { campaign } = await new GetCampaignByIdUseCase(
    new PrismaCampaignsRepository(),
    new PrismaEmailEventsRepository()
  )
    .execute({ id, userId: session.user.id })
    .catch(() => notFound());

  const { senders } = await new GetSendersByUserUseCase(new PrismaSendersRepository()).execute({
    userId: session.user.id,
  });

  const { lists } = await new GetAllContactListsUseCase(new PrismaContactListsRepository()).execute({
    userId: session.user.id,
  });

  const contactLists = lists.map((list) => ({
    id: list.id,
    name: list.name,
    contactCount: list._count.memberships,
  }));

  return <CampaignDetailView campaign={campaign} senders={senders} contactLists={contactLists} />;
}
