<?php

namespace App\Console\Commands;

use App\Helpers\Helper;
use Illuminate\Console\Command;
use App\Models\User;
use Laravel\Passport\TokenRepository;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use DB;

class GeneratePersonalAccessToken extends Command
{

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'snipeit:make-api-key 
                        {--user_id= : The ID of the user to create the token for.}
                        {--name= : The name of the new API token}
                        {--key-only : Only return the value of the API key}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'This console command allows you to generate Personal API tokens to be used with the Snipe-IT JSON REST API on behalf of a user.';


    /**
     * The token repository implementation.
     *
     * @var \Laravel\Passport\TokenRepository
     */
    protected $tokenRepository;


    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct(TokenRepository $tokenRepository, ValidationFactory $validation)
    {
        $this->validation = $validation;
        $this->tokenRepository = $tokenRepository;
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {

        $accessTokenName = $this->option('name');
        if ($accessTokenName=='') {
            $accessTokenName = 'CLI Auth Token';
        }

        if ($this->option('user_id')=='') {
            return $this->error('ERROR: user_id cannot be blank.');
        }

        if ($user = User::find($this->option('user_id'))) {

            $createAccessToken = $user->createToken($accessTokenName)->accessToken;

            if ($this->option('key-only')) {
                $this->info($createAccessToken);

            } else {

                $this->warn('Your API Token has been created. Be sure to copy this token now, as it will not be accessible again.');

                if ($token = DB::table('oauth_access_tokens')->where('user_id', '=', $user->id)->where('name','=',$accessTokenName)->orderBy('created_at', 'desc')->first()) {
                    $this->info('API Token ID: '.$token->id);
                }

                $this->info('API Token User: '.$user->present()->fullName.' ('.$user->username.')');
                $this->info('API Token Name: '.$accessTokenName);
                $this->info('API Token: '.$createAccessToken);
            }
        } else {
           return $this->error('ERROR: Invalid user. API key was not created.');
        }




    }
}
