// src/app/api/employees/[id]/route.ts
import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "../../auth/[...nextauth]/route";
import { prisma } from "@/lib/prisma";
import bcrypt from "bcrypt";

// ✅ PATCH - Actualizar empleado
export async function PATCH(
  request: NextRequest,
  context: { params: Promise<{ id: string }> } // ⚠️ params es Promise
) {
  try {
    const session = await getServerSession(authOptions);

    console.log("📝 [PATCH /api/employees/[id]] Iniciando...");

    if (!session || !session.user) {
      console.log("❌ [PATCH] Sin sesión");
      return NextResponse.json({ error: "No autenticado" }, { status: 401 });
    }

    if (session.user.role !== "ADMIN") {
      console.log("❌ [PATCH] No es admin");
      return NextResponse.json(
        { error: "No tienes permisos para realizar esta acción" },
        { status: 403 }
      );
    }

    // ⚠️ AWAIT params
    const { id } = await context.params;
    const body = await request.json();
    const { name, username, role, password } = body;

    console.log("📝 [PATCH] ID:", id);
    console.log("📝 [PATCH] Datos:", { name, username, role });

    const employee = await prisma.user.findUnique({
      where: { id },
    });

    if (!employee) {
      console.log("❌ [PATCH] Empleado no encontrado");
      return NextResponse.json(
        { error: "Empleado no encontrado" },
        { status: 404 }
      );
    }

    if (username && username !== employee.username) {
      const existingUser = await prisma.user.findUnique({
        where: { username },
      });

      if (existingUser) {
        console.log("❌ [PATCH] Username ya existe");
        return NextResponse.json(
          { error: "El nombre de usuario ya está en uso" },
          { status: 400 }
        );
      }
    }

    const updateData: any = {};

    if (name !== undefined) updateData.name = name;
    if (username !== undefined) updateData.username = username;
    if (role !== undefined) updateData.role = role;

    if (password && password.trim() !== "") {
      console.log("🔐 [PATCH] Actualizando contraseña");
      updateData.passwordHash = await bcrypt.hash(password, 10);
    }

    const updatedEmployee = await prisma.user.update({
      where: { id },
      data: updateData,
      select: {
        id: true,
        name: true,
        username: true,
        role: true,
        createdAt: true,
        updatedAt: true,
      },
    });

    console.log("✅ [PATCH] Empleado actualizado:", updatedEmployee.username);

    return NextResponse.json({
      success: true,
      message: "Empleado actualizado correctamente",
      employee: updatedEmployee,
    });
  } catch (error) {
    console.error("❌ [PATCH] Error:", error);
    return NextResponse.json(
      { error: "Error al actualizar el empleado" },
      { status: 500 }
    );
  }
}

// ✅ DELETE - Eliminar empleado
export async function DELETE(
  request: NextRequest,
  context: { params: Promise<{ id: string }> } // ⚠️ params es Promise
) {
  try {
    const session = await getServerSession(authOptions);

    console.log("🗑️ [DELETE /api/employees/[id]] Iniciando...");

    if (!session || !session.user) {
      console.log("❌ [DELETE] Sin sesión");
      return NextResponse.json({ error: "No autenticado" }, { status: 401 });
    }

    if (session.user.role !== "ADMIN") {
      console.log("❌ [DELETE] No es admin");
      return NextResponse.json(
        { error: "No tienes permisos para realizar esta acción" },
        { status: 403 }
      );
    }

    // ⚠️ AWAIT params
    const { id } = await context.params;
    console.log("🗑️ [DELETE] ID:", id);

    const employee = await prisma.user.findUnique({
      where: { id },
    });

    if (!employee) {
      console.log("❌ [DELETE] Empleado no encontrado");
      return NextResponse.json(
        { error: "Empleado no encontrado" },
        { status: 404 }
      );
    }

    if (session.user.id === id) {
      console.log("❌ [DELETE] Intentando eliminar su propia cuenta");
      return NextResponse.json(
        { error: "No puedes eliminar tu propia cuenta" },
        { status: 400 }
      );
    }

    await prisma.user.delete({
      where: { id },
    });

    console.log("✅ [DELETE] Empleado eliminado:", employee.username);

    return NextResponse.json({
      success: true,
      message: "Empleado eliminado correctamente",
    });
  } catch (error) {
    console.error("❌ [DELETE] Error:", error);
    return NextResponse.json(
      { error: "Error al eliminar el empleado" },
      { status: 500 }
    );
  }
}