<?php

namespace App\Http\Middleware;

use App\User;
use Closure;
use Exception;
use Firebase\JWT\ExpiredException;
use Firebase\JWT\JWT;
use Illuminate\Support\Facades\Log;

class JwtMiddleware
{

    public function handle($request, Closure $next, $guard = null)
    {


        $MODULE = env('MODULE');
        $MODULE_CORE = env('MODULE_CORE');
        require_once $MODULE . "/utility/configuration.php";
        require_once $MODULE . "/utility/initialization.php";
        define('MODULE', $MODULE);
        define('MODULE_CORE', $MODULE_CORE);

        require_once $MODULE . "/utility/standard_library.php";
        require_once $MODULE_CORE . "/class/datalayer/dataaccess.php";
        require_once $MODULE_CORE . "/class/common/session.php";

        require_once $MODULE_CORE . "/class/wrapperlayer/company.php";

        require_once $MODULE . "/class/bllayer/apilog.php";
        traceMessage("MODULE : " . $MODULE);
        $token = $request->bearerToken();
        if (!$token) {
            // Unauthorized response if token not there
            return response()->json([
                'error' => 'Token not provided.',
            ], 401);
        }


        try {
            $credentials = JWT::decode($token, env('JWT_SECRET'), ['HS256']);
        } catch (ExpiredException $e) {
            return response()->json([
                'error' => 'Provided token is expired.',
            ], 400);
        } catch (Exception $e) {
            return response()->json([
                'error' => 'An error while decoding token.',
            ], 400);
        }

        $mysession = new \Session();
        $sessionStatus = $mysession->updatesession($credentials->data->sid);
		$userId = $mysession->getvalue("userid");
		
		
        if (!$sessionStatus) {
            return response()->json([
                'error' => 'You have been logout, Please contact system admin',
            ], 551);
        }
        traceMessage("Creedentials:".print_r_log($credentials));
        $user = User::find($userId);
        traceMessage("Creedentials:".print_r_log($user));


        // By pass policy for user changePassword service only
        if ($request->route()[1]['as'] === 'changePassword') {
            // Now let's put the user in the request class so that you can grab it from there
            $request->auth = $user;
            return $next($request);
        }

        // IS RESIGNED USER
        $isResigned = $user['is_resigned'];
        if ($isResigned === "yes") {
            return response()->json([
                'error' => 'You have been logout, Please contact system admin',
            ], 551);
        }

        // IS NEW USER
        $isNewUser = $user['is_new_user'];
        if ($isNewUser === "yes") {
            return response()->json([
                'error' => 'Please change your password',
            ], 552);
        }

        // LAST CHANGE PASSWORD
        $currentDate = date('Y-m-d H:i:s');
        if (!empty($user['last_change_password_date'])) {
            $datetime1 = date_create($user['last_change_password_date']);
            $datetime2 = date_create($currentDate);
            $interval = date_diff($datetime1, $datetime2);
            $days = $interval->format('%a');
        } else
            $days = 0;

        //traceMessage("users:".print_r_log($user)); 
        // PASSWORD_EXPIRE_DAYS
        if ($days >= 30 || empty($user['last_change_password_date'])) {
            return response()->json([
                'error' => 'Please change your password',
            ], 552);
        }

        $bypass = $request->header("x-bypass");
        traceMessage($bypass);

        if ($bypass != "true") {

            // Mobile walay dingay
            // $combineStrMob = base64encode($userid+$sessionId+date('Y-m-d'));
            $createdDateTime = $request->header("x-token-time");
            //$createdDateTime = 1;
            $combineStrWeb = base64_encode($token . $createdDateTime);
            $combineStrMob = $request->header("x-csrf-token");
            traceMessage("-- x csrf-token web---" . $combineStrWeb);
            traceMessage("-- x csrf-token---" . $combineStrMob);
            //return response()->json([
            //        //'error123' => $request->headers->all(),
            //        'error123' => $combineStrWeb."aaaaaaaaaaaaaaaaaaaaaaa".$combineStrMob,
            //    ], 552);
            Log::info('COMING HERE!');

            traceMessage($combineStrWeb . "TEST1111" . $combineStrMob . "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            if ($combineStrMob == $combineStrWeb) {

                $wlCompany = new \WL_Company();
                $paramArr = array();
                $paramArr["table_name"] = "token";
                $c = 0;
                $params = array();
                $params[$c]['key'] = "token";
                $params[$c]['value'] = $combineStrWeb . $request->path();
                $params[$c]['op'] = "=";
                $c++;

                $params[$c]['key'] = "status";
                $params[$c]['value'] = '1';
                $params[$c]['op'] = "=";
                $c++;

                $paramArr["params"] = $params;
                $ret = $wlCompany->GetTableInfo($paramArr);
                //print_r_pre($ret);
                if ($ret['success']) {

                    $tokenInfo = $ret['data'];
                    if ($tokenInfo) {
                        if (($tokenInfo->count) > 0) {
                            //return response()->json([
                            //	'error' => 'Token Found!',
                            //], 400);
                        } else {
                            $userInfo['token'] = $combineStrWeb . $request->path();
                            $userInfo['user_id'] = $user['user_id'];
                            $userInfo['created_at'] = date("Y-m-d H:i:s");
                            $tokenId = $wlCompany->AddToken($userInfo);
                        }
                    }
                }
            } else {
                traceMessage("API NAME: " . $request->path());
                //return response()->json([
                //    'error' => $combineStrMob.'Token Mismatch!'.$combineStrWeb,
                //], 400);
            }
        }

        // Now let's put the user in the request class so that you can grab it from there
        $request->auth = $user;

        $file_name = explode('/', $request->path());

        $data = array();
        $data = array(
            'api_name' => $file_name[count($file_name) - 1],
            'ip_address' => getUserIP(),
            'url' => $request->fullUrl(),
            'trigger_time' => date("Y-m-d H:i:s"),
            'entity_type' => $request->auth['user_type'],
            'entity_id' => $request->auth['user_id'],
        );
        traceMessage("Insert apilog: " . print_r_log($data));
        $blApiLog = new \BL_ApiLog();
        $apiLogId = $blApiLog->AddApiLog($data);
        traceMessage("Inserted AddApiLog 1:" . ($apiLogId));
        // return $apiLogId;



        return $next($request);
    }

    // user_tracking

    // session forcelogout

    // new user force password

    // last change password
}
