import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { CharacterClass } from "@/prisma/generated/prisma/enums";

export async function POST(request: Request) {
  try {
    const body = await request.json();
    const { userId, username, avatar, bio, characterClass } = body;

    if (!userId) {
      return NextResponse.json(
        { error: "ID utilisateur requis" },
        { status: 400 }
      );
    }

    // Vérifier que l'utilisateur existe et a été créé récemment (dans les 10 dernières minutes)
    const user = await prisma.user.findUnique({
      where: { id: userId },
    });

    if (!user) {
      return NextResponse.json(
        { error: "Utilisateur non trouvé" },
        { status: 404 }
      );
    }

    // Vérifier que le compte a été créé récemment (dans les 10 dernières minutes)
    const tenMinutesAgo = new Date(Date.now() - 10 * 60 * 1000);
    if (user.createdAt < tenMinutesAgo) {
      return NextResponse.json(
        { error: "Temps écoulé pour finaliser l'inscription" },
        { status: 400 }
      );
    }

    // Validation username
    if (username !== undefined) {
      if (typeof username !== "string" || username.trim().length === 0) {
        return NextResponse.json(
          { error: "Le nom d'utilisateur ne peut pas être vide" },
          { status: 400 }
        );
      }

      if (username.length < 3 || username.length > 20) {
        return NextResponse.json(
          { error: "Le nom d'utilisateur doit contenir entre 3 et 20 caractères" },
          { status: 400 }
        );
      }

      // Vérifier si le username est déjà pris par un autre utilisateur
      const existingUser = await prisma.user.findFirst({
        where: {
          username: username.trim(),
          NOT: { id: userId },
        },
      });

      if (existingUser) {
        return NextResponse.json(
          { error: "Ce nom d'utilisateur est déjà pris" },
          { status: 400 }
        );
      }
    }

    // Validation bio
    if (bio !== undefined && bio !== null) {
      if (typeof bio !== "string") {
        return NextResponse.json(
          { error: "La bio doit être une chaîne de caractères" },
          { status: 400 }
        );
      }
      if (bio.length > 500) {
        return NextResponse.json(
          { error: "La bio ne peut pas dépasser 500 caractères" },
          { status: 400 }
        );
      }
    }

    // Validation characterClass
    const validClasses = [
      "WARRIOR",
      "MAGE",
      "ROGUE",
      "RANGER",
      "PALADIN",
      "ENGINEER",
      "MERCHANT",
      "SCHOLAR",
      "BERSERKER",
      "NECROMANCER",
    ];
    if (characterClass !== undefined && characterClass !== null) {
      if (!validClasses.includes(characterClass)) {
        return NextResponse.json(
          { error: "Classe de personnage invalide" },
          { status: 400 }
        );
      }
    }

    // Mettre à jour l'utilisateur
    const updateData: {
      username?: string;
      avatar?: string | null;
      bio?: string | null;
      characterClass?: CharacterClass | null;
    } = {};
    
    if (username !== undefined) {
      updateData.username = username.trim();
    }
    if (avatar !== undefined) {
      updateData.avatar = avatar || null;
    }
    if (bio !== undefined) {
      if (bio === null || bio === "") {
        updateData.bio = null;
      } else if (typeof bio === "string") {
        updateData.bio = bio.trim() || null;
      } else {
        updateData.bio = null;
      }
    }
    if (characterClass !== undefined) {
      updateData.characterClass = (characterClass as CharacterClass) || null;
    }

    // Si aucun champ à mettre à jour, retourner succès quand même
    if (Object.keys(updateData).length === 0) {
      return NextResponse.json({
        message: "Profil finalisé avec succès",
        userId: user.id,
      });
    }

    const updatedUser = await prisma.user.update({
      where: { id: userId },
      data: updateData,
    });

    return NextResponse.json({
      message: "Profil finalisé avec succès",
      userId: updatedUser.id,
    });
  } catch (error) {
    console.error("Error completing registration:", error);
    const errorMessage = error instanceof Error ? error.message : "Erreur inconnue";
    return NextResponse.json(
      { error: `Erreur lors de la finalisation de l'inscription: ${errorMessage}` },
      { status: 500 }
    );
  }
}

