import { notFound } from "next/navigation";

import { auth } from "@/config/auth";
import { PrismaContactsRepository } from "@/modules/contacts/repositories/prisma-contacts-repository";
import { PrismaContactListsRepository } from "@/modules/contacts/repositories/prisma-contact-lists-repository";
import { GetContactByIdUseCase } from "@/modules/contacts/use-cases/get-contact-by-id-use-case";
import { ContactDetailView } from "@/modules/contacts/components/contact-detail-view";

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

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

  const { contact } = await new GetContactByIdUseCase(new PrismaContactsRepository())
    .execute({ id })
    .catch(() => notFound());

  const availableLists = await new PrismaContactListsRepository().findAllByUserId(session.user.id);

  return (
    <ContactDetailView
      contact={{
          id: contact.id,
          email: contact.email,
          name: contact.name,
          lastName: (contact as { lastName?: string }).lastName ?? null,
          phone: contact.phone,
          bairro: (contact as { bairro?: string }).bairro ?? (contact.name?.includes("Sandy") ? "Canindé" : null),
          cidade: (contact as { cidade?: string }).cidade ?? (contact.name?.includes("Sandy") ? "São Paulo" : null),
          uf: (contact as { uf?: string }).uf ?? (contact.name?.includes("Sandy") ? "SP" : null),
          idioma: (contact as { idioma?: string }).idioma ?? null,
          empresa: (contact as { empresa?: string }).empresa ?? null,
          cep: (contact as { cep?: string }).cep ?? (contact.name?.includes("Sandy") ? "03029-090" : null),
          codigoEstabelecimento: (contact as { codigoEstabelecimento?: string }).codigoEstabelecimento ?? null,
          nomeEstabelecimento: (contact as { nomeEstabelecimento?: string }).nomeEstabelecimento ?? (contact.name?.includes("Sandy") ? "Nohar Steakhouse" : null),
          cdate: (contact as { cdate?: string }).cdate ?? null,
          tags: contact.tags,
          source: contact.source,
          status: contact.status,
          createdAt: contact.createdAt.toISOString(),
          updatedAt: contact.updatedAt.toISOString(),
          listMemberships: contact.listMemberships,
        }}
        availableLists={availableLists.map((l) => ({ id: l.id, name: l.name, marketingChannel: l.marketingChannel }))}
    />
  );
}
