<?php
namespace App\Middleware;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class MyMiddleware implements MiddlewareInterface
{
    public function process(Request $request, RequestHandlerInterface $handler): Response
    {
        // Tu lógica para verificar la condición
//         $condition = false; // Aquí debes realizar la comprobación que desees

//         if ($condition) {
//             // Si la condición es verdadera, continúa con la ejecución de la solicitud
//             return $handler->handle($request);
//         } else {
//             // Si la condición es falsa, puedes responder con un error o redirigir, por ejemplo:
//             $response = new \Slim\Psr7\Response();
//             $response->getBody()->write('La condición es falsa. Acceso denegado.');
//             return $response->withStatus(403);
//         }
      
        $jwtHeader = $request->getHeaderLine('Authorization');
        if (!$jwtHeader) {
            throw new \Exception('JWT Token required.', 403);
        }
        $jwt = explode('Bearer ', $jwtHeader);
        if (!isset($jwt[1])) {
            throw new \Exception('JWT Token invalid.', 403);
        }

        try {
            $token = (string) $jwt[1];
            $key = getenv('SECRET_KEY');
            // Decodificar el token JWT con la clave secreta para obtener el payload
            $payload = JWT::decode($token, new Key($key, 'HS256'));

            // Obtener el tiempo actual
            $tiempoActual = time();

            // Verificar si el token ha expirado
            if ($payload->exp < $tiempoActual) {
                // El token ha expirado
                throw new \Exception('El token JWT ha expirado.', 403);
            } else {
                // El token es válido y aún no ha expirado
            }
        } catch (\Exception $e) {
            $mensajeError = $e->getMessage();
            // Si hay un error al decodificar el token, se considera inválido
            throw new \Exception('JWT Token invalid.', 403);
//             throw new \Exception('El token JWT no es válido. ERROR: ' . $mensajeError . ' [$token] ' . $token . ' [$key] ' . $key, 403);
        }
      
        return $handler->handle($request); // Respuesta exitosa
    }
}
