"use server";

import bcrypt from "bcryptjs";
import { auth } from "@/auth";
import { prisma } from "@/lib/db";

export type ActionResult = { success: true } | { success: false; error: string };

export async function changeName(newName: string): Promise<ActionResult> {
  const session = await auth();
  if (!session?.user?.id) return { success: false, error: "Non authentifié" };

  const trimmed = newName.trim();
  if (!trimmed) return { success: false, error: "Le nom ne peut pas être vide" };
  if (trimmed.length > 64) return { success: false, error: "Le nom est trop long (64 caractères max)" };

  try {
    await prisma.user.update({
      where: { id: session.user.id },
      data: { name: trimmed },
    });
    return { success: true };
  } catch (e) {
    console.error("Name change error:", e);
    return { success: false, error: "Erreur lors du changement de nom" };
  }
}

export async function changePassword(
  currentPassword: string,
  newPassword: string
): Promise<ActionResult> {
  const session = await auth();
  if (!session?.user?.id) return { success: false, error: "Non authentifié" };

  if (!currentPassword || !newPassword) {
    return { success: false, error: "Mot de passe actuel et nouveau requis" };
  }
  if (newPassword.length < 8) {
    return { success: false, error: "Le nouveau mot de passe doit faire au moins 8 caractères" };
  }

  const user = await prisma.user.findUnique({
    where: { id: session.user.id },
    select: { passwordHash: true },
  });
  if (!user?.passwordHash) {
    return { success: false, error: "Compte sans mot de passe (connexion SSO)" };
  }

  const ok = await bcrypt.compare(String(currentPassword), user.passwordHash);
  if (!ok) return { success: false, error: "Mot de passe actuel incorrect" };

  try {
    const passwordHash = await bcrypt.hash(String(newPassword), 10);
    await prisma.user.update({
      where: { id: session.user.id },
      data: { passwordHash },
    });
    return { success: true };
  } catch (e) {
    console.error("Password change error:", e);
    return { success: false, error: "Erreur lors du changement de mot de passe" };
  }
}
