<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use Tymon\JWTAuth\Facades\JWTAuth;

class AuthenticatedJWT
{
    public function handle(Request $request, Closure $next)
    {
        try {
            if ($payload = JWTAuth::getPayload($request->bearerToken())) {
                $payload_arr = $payload->get();
                $token_type = $payload_arr['type'];
                $user_id = $payload_arr['sub'];
                if ($token_type == 'access' && $user_id) {
                    $request->merge(['user_id' => $user_id]);
                    return $next($request);
                } else
                    throw new TokenInvalidException();
            } else
                throw new TokenInvalidException();
        } catch (TokenExpiredException $e) {
            return response()->json(['error' => 'token_expired'], 419);
        } catch (TokenInvalidException $e) {
            return response()->json(['error' => 'token_invalid'], 401);
        } catch (JWTException $e) {
            return response()->json(['error' => 'token_absent'], 401);
        }
    }
}
