<?php

namespace App\Http\Controllers\Auth;

// Laravel Specifics
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

// Creatia Specifics
use App\Helpers\Security;
use App\Http\Controllers\BaseController;
use App\Models\ApiTokenBearer;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;

class BearerController extends BaseController
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['issue', 'revoke']]);
    }

    public function issue(Request $_request) {
        if($token_id = Security::valid_token_information($_request)) {

            // Generate new bearer token if everything provided is valid. We'll keep it hashed for arguments sake.
            $random_bearer = Str::random(32);
            $expiration_at = Carbon::now()->addSeconds(600);

            // Generate secret
            ApiTokenBearer::create([
                'bearer' => $random_bearer,
                'expiration_at' => $expiration_at,
                'token_id' => $token_id
            ]);

            return response()->json([
                'bearer' => $random_bearer,
                'expiry' => $expiration_at->timestamp
            ], 200);
        }

        Log::debug("Bearer controller issuance failed.", [
            'address'   => Security::real_ip(),
            'auth'      => $_request->header('Authorization')
        ]);

        return response()->json([], 401);
    }

    public function revoke(Request $_request) {
        [$bearer, $token, $valid] = Security::valid_bearer_token($_request, []);
        if($valid) {
            ApiTokenBearer::where('bearer', '=', $bearer)->delete();

            // Drop the cached resolution so revocation takes effect immediately.
            Redis::del("api-bearer-$bearer");

            return response()->json([], 200);
        }

        return response()->json([], 401);
    }
}
