import type { Metadata } from "next";
import { redirect } from "next/navigation";
import { Settings2 } from "lucide-react";
import { PageHeader } from "@/components/shared/page-header";
import { ApiKeyCard } from "@/components/panel/account/api-key-card";
import { PreferencesForm } from "@/components/panel/account/preferences-form";
import { ProfileForm } from "@/components/panel/account/profile-form";
import { SecurityCard } from "@/components/panel/account/security-card";
import { db } from "@/lib/db";
import { isTwoFactorEnabled } from "@/lib/auth";
import { requireUser } from "@/lib/guards";
import { getSetting } from "@/lib/settings";
import { iso } from "@/lib/serialize";
import { accountTexts } from "@/lib/i18n/account";
import { apiKeyDateSettingKey, supportedTimezones } from "@/lib/validation/account";

export const metadata: Metadata = { title: "Account" };

export default async function AccountPage() {
  const session = await requireUser();

  const user = await db.user.findUnique({
    where: { id: session.id },
    select: {
      username: true,
      email: true,
      phone: true,
      firstName: true,
      lastName: true,
      language: true,
      timezone: true,
      status: true,
      twoFactorEnabled: true,
      apiKey: true,
      lastAuthAt: true,
      createdAt: true,
    },
  });

  if (!user) redirect("/signin");

  const [apiKeyCreatedAt, twoFactorEnabled] = await Promise.all([
    user.apiKey ? getSetting<string>(apiKeyDateSettingKey(session.id), "") : Promise.resolve(""),
    isTwoFactorEnabled({ id: session.id, twoFactorEnabled: user.twoFactorEnabled }),
  ]);

  const timezones = supportedTimezones();

  return (
    <div className="mx-auto w-full max-w-screen-2xl p-4 sm:p-6">
      <PageHeader
        title={accountTexts.title}
        description={accountTexts.subtitle}
        icon={Settings2}
      />

      <div className="grid items-start gap-6 lg:grid-cols-2">
        <ProfileForm
          initial={{
            username: user.username,
            email: user.email,
            phone: user.phone ?? "",
            firstName: user.firstName ?? "",
            lastName: user.lastName ?? "",
          }}
        />

        <PreferencesForm
          language={user.language}
          timezone={user.timezone}
          timezones={timezones}
        />

        <SecurityCard
          twoFactorEnabled={twoFactorEnabled}
          status={user.status}
          lastAuthAt={user.lastAuthAt ? iso(user.lastAuthAt) : null}
          createdAt={iso(user.createdAt)}
        />

        <ApiKeyCard apiKey={user.apiKey} createdAt={apiKeyCreatedAt || null} />
      </div>
    </div>
  );
}
