<?php

namespace App\Http\Controllers\Esme;

use App\AuditTrail;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use App\Role;
use App\Tools\SmsTools;
use App\User;
use App\Credit;
use Auth;
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\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;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    public function resetPassword(Request $request) {

    }

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

        // 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', 'esme')->firstOrFail()->id;

        //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 '
            ]);

            if ($user->must_change_password) {
                //process change user password
                //TODO: Change user password
//                abort(500, 'Your password has to be changed!');
                //return redirect()->route('settings.get_change_password');
                return redirect()->intended('/esme/dashboard');
            } else {
                return redirect()->intended('/esme/dashboard');
            }
        } 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 >= 25) {
                    $user->is_locked = true;
                }
                $user->save();
            }
            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();


        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' =>'reseller',
                'role_id' => 4,

            ]);
              Credit::create([
                  'user_id'=>$user_new->id,
                  'username' => $email[0],
                  'price' => '0.03',
                  'email_price' => '0.00332',
                  'credit_alloted' => '0.15',
                  'old_bal' => '0',
                  'new_bal' => '0.15',
                  'credit_used' => '0',
                  'credited' => '0'
              ]);
            return $user_new;
        }else{
            header('Location: http://npontutest.deywuro.com/errorx');


            exit();        }

    }
}
