<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\DB;

class CheckRol
{
    /**
     * Verificar si el usuario tiene uno de los roles permitidos
     *
     * Flujo: Usuario → Perfil → Rol
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  ...$roles  Códigos de roles permitidos
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function handle(Request $request, Closure $next, string ...$roles): Response
    {
        $usuario = $request->user();

        if (!$usuario) {
            return response()->json([
                'success' => false,
                'message' => 'No autorizado',
                'data' => null,
                'errors' => null,
            ], 401);
        }

        // Obtener rol_codigo a través del perfil (una sola consulta)
        $rolCodigo = DB::table('perfil')
            ->join('sys_roles', 'perfil.rol_id', '=', 'sys_roles.rol_id')
            ->where('perfil.per_id', $usuario->per_id)
            ->where('sys_roles.estado', 1)
            ->value('sys_roles.rol_codigo');

        if (!$rolCodigo) {
            return response()->json([
                'success' => false,
                'message' => 'Usuario sin perfil o rol asignado',
                'data' => null,
                'errors' => null,
            ], 403);
        }

        // SISTEMAS y ADMINISTRADOR tienen acceso total
        $rolesConAccesoTotal = ['SISTEMAS', 'ADMINISTRADOR'];
        if (in_array($rolCodigo, $rolesConAccesoTotal)) {
            return $next($request);
        }

        // Convertir roles permitidos a mayúsculas para comparar
        $rolesPermitidos = array_map('strtoupper', $roles);

        if (!in_array($rolCodigo, $rolesPermitidos)) {
            return response()->json([
                'success' => false,
                'message' => 'Acceso denegado para su rol',
                'data' => null,
                'errors' => [
                    'rol_actual' => $rolCodigo,
                    'roles_permitidos' => $rolesPermitidos,
                ],
            ], 403);
        }

        return $next($request);
    }
}
