<?php

namespace App\Http\Middleware;

use App\ConsumerAPIRequests;
use App\BasicAccess;
use App\Logs;
use App\Slack;
use Closure;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class BasicMiddleware extends BasicAccess
{
    private $request = null;
    protected $errorCode = [
        'Wrong number of segments' => 401,
        'Signature verification failed' => 402,
        'Expired token' => 408
    ];
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $API_ID = ConsumerAPIRequests::log(['enc' => $request->all()]);

        try {
            $this->request = $request;
            if($this->verifyAccessToken($request)) {
                $this->request->request->add(['data' => json_decode(json_encode($this->decodeJWT($this->request))), 'user' => $this->user, 'secret' => $this->secret]);
            }

            if ($error = $this->isError($request, $this->request)){
                return $error;
            }

            ConsumerAPIRequests::log(['dec' => $this->request->all(), 'id' => $API_ID, 'user' => $this->user]);
            $response = $next($this->request);
            ConsumerAPIRequests::log(['dec_r' => ($response instanceof JsonResponse ? $response->getOriginalContent() : $response), 'id' => $API_ID, 'user' => $this->user]);
            $responseReturn = response()->json($this->encodeJWT(new Request(['data' => ($response instanceof JsonResponse ? $response->getOriginalContent() : $response), 'user' => $this->user]), $this->secret), 200);
            ConsumerAPIRequests::log(['enc_r' => ($responseReturn instanceof JsonResponse ? $responseReturn->getOriginalContent() : $responseReturn), 'id' => $API_ID, 'user' => $this->user]);
            return $responseReturn;
        } catch (Exception $e) {
            return $this->initErrors(['message' => "Exception occurred while signature verification", 'code' => $this->errorCode[$e->getMessage()], 'type' => 'CF_EXCEPTION','cf_error_code' => $e->getLine()]);
        }
    }

    public function isError(Request $request, Request $requestDec){
        if(request()->is('consumer/*') && (empty($request->all()) || empty($requestDec->all()))){
            return response()->json($this->encodeJWT(new Request(['data' => ['status' => 'FAIL', 'message' => 'Please check your input and try again'], 'user' => $this->user]), $this->secret), 200);
        }

        return false;
    }
}