<?php

namespace App\Http\Controllers\Frontend\Auth;

use App\Events\Frontend\Auth\UserRegistered;
use App\Http\Controllers\Controller;

use App\Http\Requests\Frontend\Auth\RegisterBetaRequest;
use App\Http\Requests\Frontend\Auth\RegisterRequest;
use App\Models\Boards\Board;
use App\Models\Lab;
use App\Models\Lookups\Institution_lookup;
use App\Models\Lookups\Position_lookup;
use App\Models\Lookups\Prefix_lookup;
use App\Models\Lookups\Research_focus_lookup;
use App\Repositories\Frontend\Auth\UserRepository;
use Illuminate\Foundation\Auth\RegistersUsers;
use App\Rules\IsValidPassword;
/**
 * Class RegisterController.
 */
class RegisterController extends Controller
{
    use RegistersUsers;

    /**
     * @var UserRepository
     */
    protected $userRepository;

    /**
     * RegisterController constructor.
     *
     * @param UserRepository $userRepository
     */
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    /**
     * Where to redirect users after login.
     *
     * @return string
     */
    public function redirectPath()
    {
        return route(home_route());
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'confirmed', new isValidPassword()],
        ]);
    }

    /**
     * Show the application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showRegistrationForm()
    {
        abort_unless(config('access.registration'), 404);
        $prefix_lookup = Prefix_lookup::all();
        $institution_lookup = Institution_lookup::where('validated', '1')->get();
        $position_lookup = Position_lookup::where('validated', '1')->get();
        $research_lookup = Research_focus_lookup::where('validated', '1')->get();
        return view('frontend.auth.register')
            ->with('prefix_lookup', $prefix_lookup)
            ->with('position_lookup', $position_lookup)
            ->with('institution_lookup', $institution_lookup)
            ->with('research_lookup', $research_lookup);
    }

    /**
     * Show the *beta* application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showBetaRegistrationForm()
    {
        //dd('register_beta');
        //abort_unless(config('access.registration'), 404);
        $institution_lookup = Institution_lookup::where('validated', '1')->get();
        $position_lookup = Position_lookup::where('validated', '1')->get();
        $research_lookup = Research_focus_lookup::where('validated', '1')->get();
        return view('frontend.auth.register_beta')
            ->with('position_lookup', $position_lookup)
            ->with('institution_lookup', $institution_lookup)
            ->with('research_lookup', $research_lookup);;
    }

    /**
     * @param RegisterRequest $request
     *
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     * @throws \Throwable
     */
    public function register(RegisterRequest $request)
    {
        // dd('register_actual');
        // $input = $request::all();
        abort_unless(config('access.registration'), 404);
// make new lookup entries
       // dd($request);
        $request['first_login'] = 'true';
        $user = $this->userRepository->create($request->only(
            'first_name',
            'last_name',
            'email',
            'password'
        ));

        // set the user role- initially user
        $user->assignRole('user');
        // If the user must confirm their email or their account requires approval,
        if (config('access.users.confirm_email') || config('access.users.requires_approval')) {

            auth()->login($user);

            event(new UserRegistered($user));

            return redirect($this->redirectPath())->withFlashSuccess(
                config('access.users.requires_approval') ?
                    __('exceptions.frontend.auth.confirmation.created_pending') :
                    __('exceptions.frontend.auth.confirmation.created_confirm')
            );
        }

        auth()->login($user);

        event(new UserRegistered($user));

        return redirect($this->redirectPath());
    }

    /**
     * @param RegisterRequest $request
     *
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     * @throws \Throwable
     */
    public function register_beta(RegisterBetaRequest $request)
    {
// make new lookup entries
//        if (isset($request['position_lookup_id'])) {
//            if (!(Position_lookup::where('id', $request['position_lookup_id'])->exists())) {
//                $new = Position_lookup::updateOrCreate(['text' => $request['position_lookup_id']]);
//                $request['position_lookup_id'] = $new->id;
//            }
//        }
//
//        if (isset($request['institution_lookup_id'])) {
//            if (!Institution_lookup::find($request['institution_lookup_id'])) {
//                $new = Institution_lookup::updateOrCreate(['text' => $request['institution_lookup_id']]);
//                $request['institution_lookup_id'] = $new->id;
//            }
//        }
        //dd($request);
        $request['first_login'] = 'true';
        $request['is_beta_user'] = '1';
        // make a temporary password
        $request['password'] = uniqid('blah', true);
        $user = $this->userRepository->create_beta($request->only(
            'first_name',
            'last_name',
            'email',
            'password')
        );

        // update teh user with other data
        $user->update($request->only(
//            'position_lookup_id',
//            'institution_lookup_id',
//            'beta_lab_data',
            'is_beta_user'
        ));

        // set the user role- initially user
        $user->assignRole('user');
// add researcher role for beta testers
        $roles[] = 'researcher';

        //and sync role
        $user->syncRoles($roles);

        // add the user to the beta testing lab
        $betalab = Lab::find(1);

        if (!$betalab->members->contains($user)) {
            $betalab->members()->attach($user);
        }
// appropriate roles for a lab member
        $roles = ['lab member'];
        if ($user->role) {
            $roles[] = $user->role->name;
        }
        $user->assignRole($roles);

        // redirect to the 'thank you' page
        return view('frontend.auth.register_beta_acknowledgement');

    }
}
