import type { Metadata } from "next";
import { cookies } from "next/headers";
import { redirect } from "next/navigation";

import { prisma } from "@/lib/prisma";

import {
  AUTH_COOKIE_NAME,
} from "@/lib/auth/constants";

import {
  hashSessionToken,
  isValidSessionTokenFormat,
} from "@/lib/auth/session-token";

import {
  loadAuthorizationForUser,
} from "@/lib/auth/authorization";

import ChangePasswordForm from "./ChangePasswordForm";

export const metadata: Metadata = {
  title: "Change Admin Password",
  robots: {
    index: false,
    follow: false,
  },
};

export const dynamic = "force-dynamic";

export default async function ChangePasswordPage() {
  const cookieStore = await cookies();

  const token =
    cookieStore.get(AUTH_COOKIE_NAME)?.value;

  if (
    !token ||
    !isValidSessionTokenFormat(token)
  ) {
    redirect("/admin/login");
  }

  const session = await prisma.authSession.findUnique({
    where: {
      tokenHash: hashSessionToken(token),
    },
    select: {
      userId: true,
      expiresAt: true,
      revokedAt: true,
    },
  });

  if (
    !session ||
    session.revokedAt !== null ||
    session.expiresAt.getTime() <= Date.now()
  ) {
    redirect("/admin/login");
  }

  const authorization =
    await loadAuthorizationForUser(session.userId);

  if (
    !authorization ||
    authorization.status !== "ACTIVE" ||
    authorization.roles.length === 0
  ) {
    redirect("/admin/login");
  }

  return <ChangePasswordForm />;
}
