<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\BaseController;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use Log;

class TokenController extends BaseController
{
    /*
    |--------------------------------------------------------------------------
    | Token Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles any email-token based requests that come in.
    | - Signups
    | - Resets
    |
    */

    /**
     * Where to redirect users after the password has been set.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    public function check(Request $_request, $_type, $_token) {
        $valid_token = User::where($_type === 'reset' ? 'reset_token' : 'signup_token', '=', $_token)->count();

        if($valid_token) {
            return response()->json(['detail' => 'Valid Token'], 200);
        }

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

    public static function valid_password($_password) {
        return !Validator::make([ 'password' => $_password ], [
            'password' => [
                'required',            // Has to exist
                'min:8',               // Atleast eight characters
                'regex:/[a-z]/',       // Has a lowercase letter
                'regex:/[A-Z]/',       // Has a uppercase letter
                'regex:/[0-9]/',       // Has a number
                'regex:/[^a-zA-Z\d]/', // Has a special character
            ]
        ])->fails();
    }

    public function setup(Request $_request, $_token) {
        // Pull out password.
        $password = $_request->input('password');

        // Check whether the password is even valid.
        if(self::valid_password($password)) {
            // Check whether the token is at all valid.
            $valid_token_user = User::where('signup_token', '=', $_token)->first();

            if($valid_token_user) {
                $valid_token_user->fill([
                    'password'      => Hash::make($password),
                    'signup_token'  => null
                ]);
    
                $valid_token_user->save();

                return response()->json(['detail' => 'Account Setup Successful'], 200);
            }
        }

        return response()->json(['detail' => 'Account Setup Failed'], 500);
    }

    public function reset(Request $_request, $_token) {
        // Pull out password.
        $password = $_request->input('password');

        // Check whether the password is even valid.
        if(self::valid_password($password)) {
            // Check whether the token is at all valid.
            $valid_token_user = User::where('reset_token', '=', $_token)->get()->first();

            Log::debug($valid_token_user);
            Log::debug($_token);

            if($valid_token_user) {
                $valid_token_user->fill([
                    'password'      => Hash::make($password),
                    'reset_token'   => null
                ]);
    
                $valid_token_user->save();

                return response()->json(['detail' => 'Password Reset Successful'], 200);
            }
        }

        return response()->json(['detail' => 'Password Reset Failed'], 500);
    }
}
