<?php



namespace App\Http\Controllers\Auth;



use App\Http\Controllers\Controller;

use App\Providers\RouteServiceProvider;

use Illuminate\Auth\Access\AuthorizationException;

use Illuminate\Auth\Events\Verified;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

use Illuminate\Support\Facades\URL;



class VerificationController extends Controller

{

    /*

    |--------------------------------------------------------------------------

    | Email Verification Controller

    |--------------------------------------------------------------------------

    |

    | This controller is responsible for handling email verification for any

    | recently registered user. This controller is also responsible for

    | re-sending verification emails and checking if the email has been

    | verified.

    |

    */



    /**

     * Where to redirect users after verification.

     *

     * @var string

     */

    protected $redirectTo = RouteServiceProvider::HOME;



    /**

     * Create a new controller instance.

     *

     * @return void

     */

    public function __construct()

    {

        $this->middleware('auth');

        $this->middleware('signed')->only('verify');

        $this->middleware('throttle:6,1')->only('verify', 'resend');

    }



    /**

     * Show the email verification notice.

     *

     * @param  \Illuminate\Http\Request  $request

     * @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse

     */

    public function show(Request $request)

    {

        return $request->user()->hasVerifiedEmail()

            ? redirect($this->redirectPath())

            : view('auth.verify');

    }



    /**

     * Mark the authenticated user's email address as verified.

     *

     * @param  \Illuminate\Http\Request  $request

     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse

     *

     * @throws \Illuminate\Auth\Access\AuthorizationException

     */

    public function verify(Request $request)

    {

        if (! URL::hasValidSignature($request)) {

            throw new AuthorizationException;

        }



        if ($request->user()->hasVerifiedEmail()) {

            return $request->wantsJson()

                ? response()->json(['message' => 'Email already verified'])

                : redirect($this->redirectPath());

        }



        if ($request->user()->markEmailAsVerified()) {

            event(new Verified($request->user()));

        }



        if ($response = $this->verified($request)) {

            return $response;

        }



        return $request->wantsJson()

            ? response()->json(['message' => 'Email verified'])

            : redirect($this->redirectPath())->with('verified', true);

    }



    /**

     * Resend the email verification notification.

     *

     * @param  \Illuminate\Http\Request  $request

     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse

     */

    public function resend(Request $request)

    {

        if ($request->user()->hasVerifiedEmail()) {

            return $request->wantsJson()

                ? response()->json(['message' => 'Email already verified'])

                : redirect($this->redirectPath());

        }



        $request->user()->sendEmailVerificationNotification();



        return $request->wantsJson()

            ? response()->json(['message' => 'Verification link sent'])

            : back()->with('resent', true);

    }



    /**

     * The user has been verified.

     *

     * @param  \Illuminate\Http\Request  $request

     * @return mixed

     */

    protected function verified(Request $request)

    {

        //

    }



    /**

     * Get the post-verification redirect path.

     *

     * @return string

     */

    public function redirectPath()

    {

        return $this->redirectTo;

    }

}

