<?php

namespace App\Http\Controllers;

use App\AdditionalFile;
use App\AuditTrail;
use App\Credit;
use App\DynamicUser;
use App\Http\Requests;
use App\Jobs\SendNewRegistrationNotification;
use App\Role;
use App\StanbicUser;
use App\Tools\SmsTools;
use App\User;
use Carbon\Carbon;
use http\Exception;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Response;
use Intervention\Image\Facades\Image;
use Laravel\Socialite\Facades\Socialite;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;


class LoginController extends Controller
{
    use AuthenticatesUsers;

    public function postRegistration(Request $request) {
        $this->validate($request, [
            'full_name' => 'required|max:255',
            'username' => 'required|min:4|max:50|unique:users,username,NULL,id,deleted_at,NULL|unique:stanbic_users,username,NULL,id,deleted_at,NULL',
            'email' => 'required|email',
	    //'email' => 'required|email|unique:users,email',
            'phone_number' => 'required|digits_between:9,16',
            'password' => 'required|min:6',
            'term_agreement' => 'required',
        ]);

        $username = $request->get('username');
        $existingCredit = Credit::whereUsername($username)->first();
        if(!empty($existingCredit)) {
            return back()->withInput($request->all())->withErrors(['username'=>'The username has already been taken!']);
        }
        //get submitted inputs
        $inputs = $request->except(['picture']);

        //get first name and last name
        $parts = explode(" ", $request['full_name']);
        $inputs['first_name'] = array_pop($parts);
        $inputs['last_name'] = implode(" ", $parts);
        $inputs['pass'] = $request['password'];
        $inputs['status'] = 'active';
        $inputs['created_by'] = 'npontu';
        $inputs['is_locked'] = 1;

        //format the phone number
        $inputs['phone_number'] = SmsTools::format_gh_number($request->get('phone_number'));

        //encrypt the password
        $inputs['password'] = bcrypt($request['password']);

        //set the user role
        $role = Role::where('name', 'user')->firstOrFail();
        $inputs['role_id'] = $role->id;

        //create the client\
        DB::beginTransaction();
        $user = User::create($inputs);

//        credit new client
        $user->credit()->create([
           'username' => $user->username,
            'price' => '0.028',
            'email_price' => '0.00332',
            'credit_alloted' => '0.00',
            'old_bal' => '0',
            'new_bal' => '0.00',
            'credit_used' => '0',
            'credited' => '0'
        ]);

        //update picture
        if(!empty($request['picture'])) {
            $file = Input::file('picture');
            $img = Image::make($file)->resize(400, 400);
            Response::make($img->encode('jpeg'));
            $user->picture()->create(['picture'=>$img]);
        }


//
//        if($request->hasFile('file')):
//            foreach ($request->file as $attachment):  /** @var Loop through the file if it's an array $mime */
//                $mime = $attachment->getMimeType();



        if($request->hasFile('additional_files')) {
            foreach ($request->additional_files as $doc):
                    $files['user_id'] = $user->id;
                    $files['file_name'] = date('Y-m-d h:i:s').'_'.$doc->getClientOriginalName();
                    $doc->storePubliclyAs('public/otherfiles',  $files['file_name']);
                    AdditionalFile::query()->create($files);
            endforeach;
        }

        DB::commit();

        //Send email & sms notification to user
        if(strtolower(trim(env('APP_ENV', ''))) != 'local') {
            SendNewRegistrationNotification::dispatch($user)
                ->onQueue('notification');
        }

        //redirect the user back to the browser

        return redirect()->back()->with('success','Your account with MTN Deywuro has been successfully created. You will be notified for access after your account has been reviewed.');

        //log the user in
        $credentials = $request->only( 'email', 'password' );

        if (Auth::attempt($credentials, false)) {
            return redirect()->route('app');
        } else {
            return Redirect::back()->withInput()->withErrors(array('login' => 'An error occured on login, please try again later!'));
        }
    }

    public function resetPassword(Request $request) {

    }

    public function getLogin(Request $request) {
        $name = $request->get('name');
        $reseller = null;






        $message = now().' Login Page Access  from '.$request->ip();
        $this->ip($message);

        if(!empty($name)) {
            $roleId = Role::where('name', 'reseller')->firstOrFail()->id;

            $reseller = User::where([
                'role_id' => $roleId,
                'username' => $name
            ])->first();

        }

        return view('NewUI.login', [
            'reseller' => $reseller
        ]);
    }

    public function postLogin(Request $request) {
        $this->validate($request, [
            'login'    => 'required',
            'password' => 'required'
        ]);
        // dd($request->all());

        //Check for Dynamic user first
        $stanbicUser = DynamicUser::where([
            ['username', '=', $request['login']],
            ['password', '=', $request['password']],
        ])->first();




        if(!empty($stanbicUser)) {
            if($stanbicUser->is_locked) {
                return back()->withInput($request->except('password'))->withErrors(['error'=>'You are NOT allowed to access this platform']);
            }

            $perm = $stanbicUser->group->permissions()->orderBy('id')->first();

            if(empty($perm)) {
                return back()->withInput($request->except('password'))->withErrors(['error'=>'You don\'t have permission to access this platform']);
            }

            Auth::login($stanbicUser->user);
                $request->session()->put('dynamic_user', $stanbicUser);


            //update audit_trail
            AuditTrail::create([
                'user_id' => $stanbicUser->user->id,
                'username' => $stanbicUser->username,
                'date' => Carbon::now()->toDateTimeString(),
                'activity' =>'subuser '.' '.$stanbicUser->username.' logged in'
            ]);


            $message = now().' login form submitted  from '.$request->ip() .' sub username='.$stanbicUser->username;
            $this->ip($message);
            $request->session()->put('myPassword', $stanbicUser->user->pass);

            session()->put('account_type', 'dynamic_user');
            session()->put('dynamic_user_id', $stanbicUser->id);
            session()->put('password',  $stanbicUser->password );
            session()->put('username',  $stanbicUser->username );

            return redirect()->route('welcome');
//            return $request->session()->pull('account_type', 'default');
        }

        // get our login input
        $login = $request->input('login');



        // check login field
        $login_type = filter_var( $login, FILTER_VALIDATE_EMAIL ) ? 'email' : 'username';

        // merge our login field into the request with either email or username as key
        $request->merge([ $login_type => $login ]);

        $credentials = $request->only($login_type, 'password');
        $credentials['role_id'] = Role::where('name', 'user')->firstOrFail()->id;

        $myPassword=$credentials['password'];

        $request->session()->put('myPassword', $myPassword);

        //check the user trying to login
        if(isset($credentials['username']) && !empty($credentials['username']))
            $user = User::where([
                ['role_id', '=', $credentials['role_id']],
                ['username', '=', $credentials['username']]
            ])->first();
        else
            $user = User::where([
                ['role_id', '=', $credentials['role_id']],
                ['email', '=', $credentials['email']]
            ])->first();

        if (!empty($user) && $user->is_locked) {
            //process locked user
            $request->session()->put('locked_user_id', $user->id);
            return redirect()->route('settings.get_locked_user');
        }

        if (Auth::attempt($credentials, $request->has('remember')))
        {
            $user = Auth::user();
            if (empty($user->wrong_password_attempt_count)) {
                $user->wrong_password_attempt_count = 0;
            }
            if ($user->wrong_password_attempt_count > 0) {
                $user->wrong_password_attempt_count = 0;
                $user->save();
            }

            //update audit_trail
            AuditTrail::create([
                'user_id' => $user->id,
                'username' => $user->username,
                'date' => Carbon::now()->toDateTimeString(),
                'activity' => $user->name.' logged in '
            ]);


            $message = now().' login form submitted  from '.$request->ip() .' username='.$user->username;
            $this->ip($message);


            $location =  $user->role_id == 1 ? 'admin/dashboard' : ($user->role_id == 2 ? '/deywuro/welcome' : ($user->role_id == 3 ? 'reseller/dashboard' : '/'));

            if ($user->must_change_password) {
                return redirect()->intended($location);
            } else {
                return redirect()->intended($location);
            }
        } else {
            if (!empty($user)) {
                if (empty($user->wrong_password_attempt_count)) {
                    $user->wrong_password_attempt_count = 0;
                }
                $user->wrong_password_attempt_count++;
                //lock user password after 21 trial
                if ($user->wrong_password_attempt_count >= 30) {
                    $user->is_locked = true;
                }
                $user->save();
            }
//            return redirect()->intended($location);
            return Redirect::back()
                ->withInput($request->only('login', 'remember'))
                ->withErrors([
                    'login' => Lang::get('auth.failed'),
                ]);
        }
    }
//social media routes
    public function redirectTogoogle($provider)
    {
        return Socialite::driver($provider)->stateless()->redirect();
    }

    public function handlegoogleCallback($provider)
    {
        try{
            $user = Socialite::driver($provider)->stateless()->user();
        }catch(Exception $e){
            return redirect('login/{provider}');
        }
        $authUser =$this->createUser($user);
        Auth::login($authUser,true);
        return redirect('/dashboard');


    }
    public function createUser($user){

        $authUser=User::where('google_id',$user->id)->first();
        //dd($user);

        if($authUser){
            return $authUser;
        }
        $name = explode(' ' ,$user->name);
        $email=explode('@',$user->email);
        $email_user=User::where('email',$user->email)->first();
        if(empty($email_user)) {

            $user_new= User::create([
                'name' => $user->name,
                'full_name' => $user->name,
                'first_name' => $name[0],
                'username' => $email[0],
                'last_name' => $name[1],
                'google_id' => $user->id,
                'email' => $user->email,
                'avatar' => $user->avatar,
                'created_by' =>'npontu',
                'role_id' => 2,

            ]);
            Credit::create([
                'user_id'=>$user_new->id,
                'username' => $email[0],
                'price' => '0.028',
                'email_price' => '0.00332',
                'credit_alloted' => '0.15',
                'old_bal' => '0',
                'new_bal' => '0.15',
                'credit_used' => '0',
                'credited' => '0'
            ]);
            return $user_new;
        }else{

            //return \redirect("/errorx")->withErrors("inside failed login method");

//            header("Location: http://google.com");

            header('Location: http://npontutest.deywuro.com/errorx');


            exit();
            //Auth::logout();

            //throw new NotFoundHttpException();


            //return view('errors.414');
        }

    }
    public function error_page(){
        return view('errors.414');
    }

    public function form_data(Request $request)
    {
        $status = "<a class='btn btn-primary btn-sm btn-round check'>
											Check registration status   <i class='fa fa-registered'></i>
										</a>";

        $status = null;
        $forms = "<div class='form-group has-feedback'>
									<input type='text' class='form-control' name='login' value='' placeholder='Username or Email' style='font-size: 0.9em;font-family: serif;text-align: center'>
									<span class='glyphicon glyphicon-envelope form-control-feedback'></span>
								</div>
								<div class='form-group has-feedback'>
									<input type='password'  id='password-field' class='form-control' name='password' placeholder='Password' style='font-size: 0.9em;font-family:serif;text-align: center'>
									<span toggle='password-field' class='fa fa-fw fa-eye field-icon toggle-password'></span>
								</div>
								<hr>
								<div class='row'>
								<div class='col-lg-12 text-center' style='margin-top: -1em'>
										<button type='submit' class='btn btn-outline-amber darken-1' style='width: 50%;font-family: serif;color:#fff !important;font-weight: bolder'>
											Sign In
										</button>
								</div>
									<div class='col-lg-12 text-center'>
										$status
									</div>
								</div>";

        return response()->json($forms);
    }


}


