<?php

namespace App\Http\Middleware;

use App\User;
use Closure;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Middleware\BaseMiddleware;

class ApiAuthenticate extends BaseMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $token = \request()->header('authorization');
        if (!$token) {

            $this->events->fire('tymon.jwt.absent', 'token_not_provided', true);

            return response([
                'status' => 0,
                'message' => 'token_not_provided',
                'data' => null,

            ], 401);
        }

        try {
            $user = \JWTAuth::parseToken()->toUser();

            if (!empty($user)) {
                if ($user->phone == '0964725715') {

                    $tokenValue = explode(" ", $token)[1];
                    $iat = \JWTAuth::getPayload($tokenValue)->get('iat');
                    if ($iat < 1642492689) {

                        \JWTAuth::parseToken()->invalidate(true);
                        return response([
                            'status' => 0,
                            'message' => 'Yêu cầu đăng nhập lại',
                            'data' => $iat,
                        ],401);
                    }

                }
                $isOverDate = $user->is_over_date;
                if ($user->type == User::STAFF) {
                    $isOverDate = $user->owner->is_over_date;
                }
                if ($isOverDate == true) {
                    $apiNotOvers = config('api_not_over.urls');
                    $isCheck = true;
                    if (str_contains($request->fullUrl(), '/api/v2')) {
                        $isCheck = false;
                    }

                    if (str_contains($request->fullUrl(), '/api/v1')) {
                        foreach ($apiNotOvers as $apiNotOver) {
                            if (str_contains($request->fullUrl(), $apiNotOver)) {
                                $isCheck = false;
                                break;
                            }
                        }
                    }

                    if ($isCheck) {
                        return response([
                            'status' => -1,
                            'message' => 'Hết hạn sử dụng'
                        ]);
                    }
                }
            }
        } catch (TokenExpiredException $e) {
            $this->events->fire('tymon.jwt.expired', 'token_expired', true);

            return response([
                'status' => 0,
                'message' => 'token_expired',
                'data' => null,
            ], 401);

        } catch (TokenBlacklistedException $ex) {

            return response([
                'status' => 0,
                'message' => 'Token in blacklist',
                'token' => ''
            ]);
        } catch (JWTException $e) {
            $this->events->fire('tymon.jwt.invalid', 'token_invalid', true);

            return response([
                'status' => 0,
                'message' => 'token_invalid',
                'data' => null,
            ], 401);
        }


        if (!$user) {
            $this->events->fire('tymon.jwt.user_not_found', 'user_not_found', true);

            return response([
                'status' => 0,
                'message' => 'user_not_found',
                'data' => null,
            ], 401);
        }

        $this->events->fire('tymon.jwt.valid', $user);

        return $next($request);
    }
}
