<?php

declare(strict_types=1);

namespace App\Controller\User;

use App\CustomResponse as Response;
use Fig\Http\Message\StatusCodeInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

final class Verify extends Base
{
    public function __invoke(Request $request, Response $response): Response
    {
        $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');
            $payload = JWT::decode($token, new Key($key, 'HS256'));
            $tiempoActual = time();
            if ($payload->exp < $tiempoActual) {
                throw new \Exception('El token JWT ha expirado.', 403);
            } else {
            }
        } catch (\Exception $e) {
            $mensajeError = $e->getMessage();
            return $response->withJson('Token invalido', 403);
            // throw new \Exception('El token JWT no es válido. ERROR: ' . $mensajeError . ' [$token] ' . $token . ' [$key] ' . $key, 403);
        }

        try {
//             $tiempoRestante = $payload->exp - $tiempoActual;
            $tiempoRestanteSegundos = $payload->exp - $tiempoActual;
            $tiempoRestanteMinutos = $tiempoRestanteSegundos / 60;
            return $response->withJson(['tiempo' => intval($tiempoRestanteMinutos)], 200);
        } catch (\Exception $e) {
            return $response->withJson('Token inválido', 403);
        }

        // return $response->withJson('Token valido', 200);

    }
}
