"use server";
import "server-only";

import * as context from "next/headers";
import { redirect } from "next/navigation";
import { auth } from "@/auth/lucia";
import prisma from "@/utils/db";

// --------- CHANGER LE MOT DE PASSE ----------
export async function changePassword(_: any, formData: FormData) {
  const authRequest = auth.handleRequest("POST", context);
  const session = await authRequest.validate();
  if (!session) return { ok: false, message: "Non authentifié." };

  const userId = session.user.userId;
  const currentPassword = String(formData.get("currentPassword") || "");
  const newPassword = String(formData.get("newPassword") || "");
  const confirmNewPassword = String(formData.get("confirmNewPassword") || "");

  if (!currentPassword || !newPassword)
    return { ok: false, message: "Champs requis manquants." };
  if (newPassword.length < 8)
    return { ok: false, message: "Le nouveau mot de passe doit contenir au moins 8 caractères." };
  if (newPassword !== confirmNewPassword)
    return { ok: false, message: "La confirmation ne correspond pas." };

  // 👉 import dynamique pour éviter le bundling client
  const { Argon2id } = await import("oslo/password");

  const key = await prisma.key.findFirst({
    where: { user_id: userId, provider_id: "email" },
    select: { id: true, hashed_password: true },
  });
  if (!key?.hashed_password)
    return { ok: false, message: "Aucune clé de mot de passe trouvée." };

  const ok = await new Argon2id().verify(key.hashed_password, currentPassword);
  if (!ok) return { ok: false, message: "Ancien mot de passe incorrect." };

  const hash = await new Argon2id().hash(newPassword);
  await prisma.key.update({ where: { id: key.id }, data: { hashed_password: hash } });

  try {
    // invalide toutes les sessions
    // @ts-ignore
    await auth.invalidateUserSessions(userId);
  } catch {
    await prisma.session.deleteMany({ where: { user_id: userId } });
  }
  authRequest.setSession(null);

  return { ok: true, message: "Mot de passe mis à jour. Veuillez vous reconnecter." };
}

// --------- SUPPRIMER MON COMPTE ----------
export async function deleteMyAccount(_: any, formData: FormData) {
  const authRequest = auth.handleRequest("POST", context);
  const session = await authRequest.validate();
  if (!session) return { ok: false, message: "Non authentifié." };

  const userId = session.user.userId;
  const confirm = String(formData.get("confirm") || "");
  if (confirm.toUpperCase() !== "DELETE")
    return { ok: false, message: 'Tapez "DELETE" pour confirmer.' };

  try {
    await prisma.$transaction(async (tx) => {
      await tx.session.deleteMany({ where: { user_id: userId } });
      await tx.key.deleteMany({ where: { user_id: userId } });
      await tx.expert.deleteMany({ where: { user_id: userId } });
      await tx.admin_expert_application.deleteMany({ where: { userId } });
      await tx.expertApplicationAnswer.deleteMany({ where: { userId } }).catch(() => {});
      await tx.user.delete({ where: { id: userId } });
    });

    try {
      // @ts-ignore
      await auth.invalidateUserSessions(userId);
    } catch {
      await prisma.session.deleteMany({ where: { user_id: userId } });
    }
    authRequest.setSession(null);

    redirect("/");
  } catch (e: any) {
    return { ok: false, message: e?.message ?? "Suppression impossible." };
  }
}
