import { getTranslations } from "next-intl/server";
import { headers } from "next/headers";
import { notFound } from "next/navigation";

import { redirect } from "@/i18n/navigation";
import { routing, type Locale } from "@/i18n/routing";
import { auth } from "@/lib/auth";

import { InvitationActions } from "./invitation-actions";

export default async function AcceptInvitationPage({
  params,
}: {
  params: Promise<{ id: string; locale: Locale }>;
}) {
  const { id: invitationId, locale } = await params;

  const session = await auth.api.getSession({ headers: await headers() });
  if (!session) {
    redirect({
      href: `/login?next=/accept-invitation/${invitationId}`,
      locale: locale ?? routing.defaultLocale,
    });
  }

  const t = await getTranslations("Invitation");

  let invitation: Awaited<ReturnType<typeof auth.api.getInvitation>> | null = null;
  try {
    invitation = await auth.api.getInvitation({
      headers: await headers(),
      query: { id: invitationId },
    });
  } catch {
    notFound();
  }
  if (!invitation) notFound();

  const expiresAt = invitation.expiresAt ? new Date(invitation.expiresAt) : null;
  const isExpired = expiresAt ? expiresAt < new Date() : false;

  if (isExpired) {
    return (
      <main className="mx-auto flex max-w-md flex-col gap-4 px-4 py-12 text-center">
        <h1 className="text-xl font-semibold">{t("expiredTitle")}</h1>
        <p className="text-sm text-muted-foreground">{t("expiredDescription")}</p>
      </main>
    );
  }

  const orgName = (invitation as { organizationName?: string }).organizationName ?? "—";
  const inviterEmail = (invitation as { inviterEmail?: string }).inviterEmail ?? "—";
  const role = invitation.role ?? "member";

  return (
    <main className="mx-auto flex max-w-md flex-col gap-6 px-4 py-12">
      <header className="flex flex-col gap-2 text-center">
        <h1 className="text-2xl font-semibold tracking-tight">{t("title", { orgName })}</h1>
        <p className="text-sm text-muted-foreground">
          {t("youWereInvited", { inviterEmail, orgName, role })}
        </p>
      </header>

      <InvitationActions invitationId={invitationId} />
    </main>
  );
}
