import { NextResponse } from "next/server";
import bcrypt from "bcryptjs";
import { db } from "@/lib/db";
import { createToken } from "@/lib/auth";
import crypto from "crypto"; // Para generar el ID de sesión

export async function POST(req: Request) {
  try {
    const { email, password } = await req.json();

    const [rows]: any = await db.query(
      "SELECT * FROM users WHERE email = ? LIMIT 1",
      [email],
    );

    if (rows.length === 0) {
      return NextResponse.json({ error: "Usuario no encontrado" }, { status: 404 });
    }

    const user = rows[0];
    const valid = await bcrypt.compare(password, user.password_hash);

    if (!valid) {
      return NextResponse.json({ error: "Contraseña incorrecta" }, { status: 401 });
    }

    if (user.active === 0) {
      return NextResponse.json(
        { error: "Tu cuenta ha sido inhabilitada. Contacta a tu Líder." },
        { status: 403 }
      );
    }

    // --- LÓGICA DE SESIÓN ÚNICA ---
    const sessionId = crypto.randomUUID(); // Generamos un ID único para esta conexión

    // Guardamos este ID en la base de datos (invalidando el anterior)
    await db.query(
      "UPDATE users SET current_session_id = ? WHERE id = ?",
      [sessionId, user.id]
    );

    // Creamos el token incluyendo el sessionId y el status active
    const token = createToken({
      id: user.id,
      role: user.role,
      name: user.full_name,
      active: user.active,
      sessionId: sessionId // <--- El token ahora lleva el sello de la sesión actual
    });

    const response = NextResponse.json({
      ok: true,
      user: {
        id: user.id,
        role: user.role,
        name: user.full_name,
      },
    });

    response.cookies.set("token", token, {
      httpOnly: true,
      secure: process.env.NODE_ENV === "production", // Mejor seguridad en producción
      sameSite: "lax",
      path: "/",
      maxAge: 60 * 60 * 24 * 7,
    });

    return response;
  } catch (error) {
    console.error("LOGIN API ERROR:", error);
    return NextResponse.json({ error: "Error interno" }, { status: 500 });
  }
}