<?php
 
namespace App\Http\Middleware;

use App\Helpers\Security;
use App\Models\ApiEvent;
use App\Models\ApiTokenBearer;
use App\Models\ApiTokenPermission;
use App\Models\ApiTokenWhitelist;
use App\Providers\RouteServiceProvider;

use App\Notifications\SlackNotification;

use Closure;
use Notification;
 
class Token
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */

    public function handle($_request, Closure $_next, ...$_perms)
    {
        $valid_token_information = Security::valid_bearer_token($_request, $_perms ?? []);

        switch($valid_token_information[0]) {
            case 'INACTIVE':
                ApiEvent::create([
                    'token_id'      => $valid_token_information[1],
                    'ip'            => Security::real_ip(),
                    'user_agent'    => $_request->userAgent(),
                    'route'         => $_request->path(),
                    'payload'       => json_encode($_request->input()),
                    'description'   => 'Inactive Token Usage Attempt, Method: ' . $_request->method(),
                ]);

                break;
            case 'EXPIRED':
                ApiEvent::create([
                    'token_id'      => $valid_token_information[1],
                    'ip'            => Security::real_ip(),
                    'user_agent'    => $_request->userAgent(),
                    'route'         => $_request->path(),
                    'payload'       => json_encode($_request->input()),
                    'description'   => 'Expired Bearer Usage Attempt, Method: ' . $_request->method(),
                ]);
                break;
            default:
                if($valid_token_information[2]) {
                    try {
                        ApiEvent::create([
                            'token_id'      => $valid_token_information[1],
                            'ip'            => Security::real_ip(),
                            'user_agent'    => $_request->userAgent(),
                            'route'         => $_request->path(),
                            'payload'       => json_encode($_request->input()),
                            'description'   => 'Method: ' . $_request->method(),
                        ]);
                    } catch(\Exception $ex) {
                        \Log::debug("Massive issue accessing API event table - This should only occur in development contexts...");
                    }

                    return $_next($_request);
                }
                break;
                
        }

        return response()->json(['detail' => 'Invalid Request'], 401);
    }
 
}