<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Illuminate\Http\Request;

use App\Http\Requests\LoginRequest;

use Socialite;
use App\Models\User;
use App\Models\Page;
use App\Utilities\PageResponse;

class LoginController extends Controller
{
    /**
     * Display the login view.
     *
     * @return \Illuminate\View\View
    public function create()
    {
        return view('auth.login');
    }
     */

    public function view()
    {
        $page = (new Page())->findByFullSlug('login');
        session()->regenerate();
        return (new PageResponse())->view($page, 'pages.view');
    }

    public function store(LoginRequest $request)
    {
        if (request('previous_url')) {
            $redirect = request('previous_url');
        } else {
            $redirect = session()->get('url.intended') ?? '/';
        }

        $request->authenticate();
        $request->session()->regenerate();
        $user = auth()->user();
        $user->setSessionTimeout();

        if (!$user->activated_at) {
            $user->activated_at = now();
            $user->save();
        }

        $this->createEditingToken();
        $this->checkIsGuardian();

        if (request()->expectsJson()) {
            if (Str::contains($redirect, 'signature')) {
                $redirect_url = $redirect;
            } else {
                $redirect_url = $redirect.'?success=Login%20Successful';
            }

            return response()->json([
                'success' => 'Login Successful',
                'redirect' => $redirect_url,
            ]);
        } else {
            return redirect()->intended($redirect)->with(['success' => 'Login Successful']);
        }
    }

    /**
     * Destroy an authenticated session.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(Request $request)
    {
        Auth::guard('web')->logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();

        if (request()->expectsJson()) {
            return response()->json([
                //'success' => 'Logout Complete',
                //'redirect' => request('timeout') ? '/login?error=Session%20Expired' : url()->previous().'?success=Logout%20Complete',
                'redirect' => request('timeout') ? '/login?error=Session%20Expired' : '/login?success=Logout%20Complete',
            ]);
        } else {
            //return redirect(url()->previous())->with(['success' => 'Logout Complete']);
            return redirect('/login')->with(['success' => 'Logout Complete']);
        }
    }

    /**
     * Redirect to Google for OAuth
     */
    public function redirectToGoogle()
    {
        /*
        $intended = session()->get('url.intended');
        session()->invalidate();
        if ($intended) {
            session()->put('url.intended', $intended);
        }
         */
        return Socialite::driver('google')->with(['hd' => 'brentwood.ca', 'prompt' => 'select_account'])->redirect();
    }

    /**
     * Process the successful response from a Google Login
     */
    public function handleGoogleCallback()
    {
        $user = User::createOrUpdateFromGoogle(Socialite::driver('google')->user());
        $user->setGroupsFromGoogle();
        auth()->login($user, true);
        $user = auth()->user();
        $user->setSessionTimeout();

        if (!$user->activated_at) {
            $user->activated_at = now();
            $user->save();
        }

        $this->createEditingToken();

        return redirect()->intended('/hub')->with(['success' => 'Login Successful']);
    }

    /**
     * Set the intended page that was being requested before we are redirected
     * to the login page
     */
    public function intendedUrl()
    {
        if (request('url')) {
            session()->put('url.intended', request('url'));
        }

        return response()->json([
            'url' => request('url'),
        ]);
    }

    /**
     * A json request to see if the authenticated users session is still valid
     * otherwise we send a response code that will log them out
     */
    public function timeoutCheck()
    {
        if ($this->isTimedOut() && !request('activity')) {
            return response()->json(['error' => 'Session Expired'], 419);
        } else {
            if (request('activity')) {
                auth()->user()->setSessionTimeout();
                return response()->json(['success' => 'Session Updated']);
            }
            return response()->json(['success' => 'Session Valid']);
        }
    }

    protected function isTimedOut()
    {
        $timeout = session()->get('timeout');

        if (!$timeout) {
            return true;
        }

        return $timeout->isPast();
    }

    protected function createEditingToken()
    {
        auth()->user()->tokens()->delete();
        $token = auth()->user()->createToken('hocuspocus')->plainTextToken;
        session()->put('editing-token', $token);
    }

    protected function checkIsGuardian()
    {
        if (auth()->user()->isGuardian()) {
            auth()->user()->addRole('guardian');
        } else {
            auth()->user()->removeRole('guardian');
        }
    }
}
