<?php

namespace App\Http\Middleware;

use Carbon\Carbon;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Facades\JWTFactory;

class AuthenticateJWT
{
    public function handle(Request $request, Closure $next)
    {
        /** @var Response $response  **/
        $response = $next($request);
        $response_data = json_decode($response->getContent(), true);
        $user_data = $response_data['user'] ?? null;

        if ($user_data && isset($user_data['user_id'])) {
            $access_custom_claims = [
                'sub' => $user_data['user_id'],
                'type' => 'access',
                // TODO remove later
                // 'exp' => Carbon::now()->addSeconds(20)->getTimestamp()
            ];

            $refresh_custom_claims = [
                'sub' => $user_data['user_id'],
                'type' => 'refresh',
                'exp' => Carbon::today()->addYear()->getTimestamp()
            ];

            $access_payload = JWTFactory::make($access_custom_claims);
            $refresh_payload = JWTFactory::make($refresh_custom_claims);
            $access_token = JWTAuth::encode($access_payload);
            $refresh_token = JWTAuth::encode($refresh_payload);
            return array_merge([
                'tokens' => [
                    'access' => $access_token->get(),
                    'refresh' => $refresh_token->get()
                ]
            ], $response_data);
        }

        return $response;
    }}
