import { NextResponse } from "next/server";
import bcrypt from "bcrypt";
import { Role } from "@/generated/prisma/client";
import { prisma } from "@/lib/prisma";

export async function POST(request: Request) {
  try {
    const data = await request.json();
    const { name, username, password, role } = data;

    // Validar que todos los campos estén presentes
    if (!name || !username || !password) {
      return NextResponse.json(
        { message: "Todos los campos son obligatorios." },
        { status: 400 }
      );
    }

    // Validar que el rol sea válido
    if (role && !["USER", "ADMIN"].includes(role)) {
      return NextResponse.json({ message: "Rol inválido." }, { status: 400 });
    }

    // Validar que el username no exista
    const existingUser = await prisma.user.findUnique({
      where: { username: username },
    });

    if (existingUser) {
      return NextResponse.json(
        { message: "El nombre de usuario ya está en uso." },
        { status: 400 }
      );
    }

    // Hashear la contraseña
    const passwordHash = await bcrypt.hash(password, 10);

    // Crear el nuevo usuario
    const newUser = await prisma.user.create({
      data: {
        name,
        username,
        passwordHash,
        role: (role as Role) || "USER", // Por defecto USER si no se especifica
      },
    });

    // Omitir la contraseña hasheada en la respuesta
    const { passwordHash: _, ...userWithoutPassword } = newUser;

    return NextResponse.json(userWithoutPassword);
  } catch (error) {
    console.error(error);
    return NextResponse.json(
      { message: "Ocurrió un error al registrar el usuario." },
      { status: 500 }
    );
  }
}
