<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Contracts\Auth\Factory as Auth;

class Authenticate
{
    /**
     * The authentication factory instance.
     *
     * @var \Illuminate\Contracts\Auth\Factory
     */
    protected $auth;

    /**
     * Create a new middleware instance.
     *
     * @param  \Illuminate\Contracts\Auth\Factory  $auth
     * @return void
     */
    public function __construct(Auth $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string[]  ...$guards
     * @return mixed
     *
     * @throws \Illuminate\Auth\AuthenticationException
     */
    public function handle($request, Closure $next, ...$guards)
    {

        $this->authenticate($guards);

        //is blocked
        if(in_array('user', $guards) && $this->auth->user()->blocked == 1){
            return redirect(route('user_blocked'));
        }
        //100 wizzard is finish
        if(in_array('user', $guards) && $this->auth->user()->wizard !== 100){
            //0-10 == start wizard form register
            if(in_array('user', $guards) && $this->auth->user()->wizard < 10){
                return redirect(route('wizard_register'));
            }
            //10-20 == start wizard form create Lead
            if(in_array('user', $guards) && $this->auth->user()->wizard < 20){
                return redirect(route('wizard_create'));
            }
            //20 is payment
            if(in_array('user', $guards) && $this->auth->user()->wizard == 20){
                $allow = [
                    'user_checkout',
                    'user_checkout_store',
                    'user_checkout_final',

                ];
                if(in_array($request->route()->getName(), $allow)){
                    return $next($request);
                }
                return redirect(route('wizard_payment'));
            }
        }
        return $next($request);
    }

    /**
     * Determine if the user is logged in to any of the given guards.
     *
     * @param  array  $guards
     * @return void
     *
     * @throws \Illuminate\Auth\AuthenticationException
     */
    protected function authenticate(array $guards)
    {
        if (empty($guards)) {
            return $this->auth->authenticate();
        }

        foreach ($guards as $guard) {
            if ($this->auth->guard($guard)->check()) {
                return $this->auth->shouldUse($guard);
            }
        }

        throw new AuthenticationException('Unauthenticated.', $guards);
    }
}
