"use server";

import { redirect } from "next/navigation";
import { z } from "zod";
import { prisma } from "@/lib/prisma";
import { clearSessionCookie, setSessionCookie } from "@/lib/session";
import { PROFILE_TYPES } from "@/lib/roles";
import { toSessionUser } from "@/lib/users";

const registerSchema = z.object({
  name: z.string().trim().min(2).max(80),
  email: z.string().trim().email(),
  password: z.string().min(8).max(80),
  type: z.string(),
  company: z.string().trim().max(120).optional(),
  location: z.string().trim().max(120).optional(),
  country: z.string().trim().max(80).optional(),
  specialties: z.string().trim().max(200).optional(),
});

const AUTH_CLOSED =
  "This preview is browse-only. Sign-in and registration are closed — the floor stays open to look.";

export async function registerAction(_prev: { error?: string; notice?: string } | null, formData: FormData) {
  const parsed = registerSchema.safeParse({
    name: formData.get("name"),
    email: formData.get("email"),
    password: formData.get("password"),
    type: formData.get("type"),
    company: formData.get("company") || "",
    location: formData.get("location") || "",
    country: formData.get("country") || "",
    specialties: formData.get("specialties") || "",
  });
  if (!parsed.success) {
    return { error: "Please complete the form with a valid email and a password of 8+ characters." };
  }
  const typeOk = PROFILE_TYPES.some((item) => item.value === parsed.data.type);
  if (!typeOk) {
    return { error: "Choose a profile type." };
  }

  return { notice: AUTH_CLOSED };
}

export async function loginAction(_prev: { error?: string; notice?: string } | null, _formData: FormData) {
  return { notice: AUTH_CLOSED };
}

export async function logoutAction() {
  await clearSessionCookie();
  redirect("/");
}

export async function updateProfileAction(_prev: { error?: string; ok?: boolean } | null, formData: FormData) {
  const { readSession } = await import("@/lib/session");
  const session = await readSession();
  if (!session) return { error: "Sign in to edit your profile." };

  await prisma.profile.upsert({
    where: { userId: session.id },
    create: {
      userId: session.id,
      type: String(formData.get("type") || "collector"),
      company: String(formData.get("company") || ""),
      location: String(formData.get("location") || ""),
      country: String(formData.get("country") || ""),
      bio: String(formData.get("bio") || ""),
      specialties: String(formData.get("specialties") || ""),
      originFocus: String(formData.get("originFocus") || ""),
      yearsInTrade: String(formData.get("yearsInTrade") || ""),
      website: String(formData.get("website") || ""),
      labs: String(formData.get("labs") || ""),
    },
    update: {
      type: String(formData.get("type") || "collector"),
      company: String(formData.get("company") || ""),
      location: String(formData.get("location") || ""),
      country: String(formData.get("country") || ""),
      bio: String(formData.get("bio") || ""),
      specialties: String(formData.get("specialties") || ""),
      originFocus: String(formData.get("originFocus") || ""),
      yearsInTrade: String(formData.get("yearsInTrade") || ""),
      website: String(formData.get("website") || ""),
      labs: String(formData.get("labs") || ""),
    },
  });

  await prisma.user.update({
    where: { id: session.id },
    data: { name: String(formData.get("name") || session.name) },
  });

  return { ok: true };
}

export async function applyVerificationAction() {
  const { readSession, setSessionCookie } = await import("@/lib/session");
  const session = await readSession();
  if (!session) redirect("/login");
  await prisma.user.update({
    where: { id: session.id },
    data: { verificationStatus: "pending" },
  });
  const user = await prisma.user.findUnique({ where: { id: session.id } });
  if (user) await setSessionCookie(toSessionUser(user));
  redirect("/settings?applied=verify");
}

export async function saveProfile(formData: FormData): Promise<void> {
  const result = await updateProfileAction(null, formData);
  if (result?.error) {
    redirect("/settings?error=1");
  }
  redirect("/settings?saved=1");
}

export async function applyWholesaleAction() {
  const { readSession, setSessionCookie } = await import("@/lib/session");
  const session = await readSession();
  if (!session) redirect("/login");
  await prisma.user.update({
    where: { id: session.id },
    data: { wholesaleStatus: "pending" },
  });
  const user = await prisma.user.findUnique({ where: { id: session.id } });
  if (user) await setSessionCookie(toSessionUser(user));
  redirect("/settings?applied=wholesale");
}
