<?php

namespace App\Http\Controllers\Reseller;

use App\AuditTrail;
use App\Credit;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use App\Role;
use App\Tools\SmsTools;
use App\User;
use Auth;
use Carbon\Carbon;
use http\Exception;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
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 getLogin(Request $request) {
       // return $request;
        $name = $request->get('name');
        $reseller = null;

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

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

        }

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

    public function postRegistration(Request $request) {
        $this->validate($request, [
            'organisation' => 'required|max:255',
            '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|unique:users,email',
            'phone_number' => 'required|digits_between:9,16',
            'password' => 'required|min:6',
            'term_agreement' => 'required',
//            'picture' => 'image'
        ]);
        //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';

        //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', 'reseller')->firstOrFail();
        $inputs['role_id'] = $role->id;

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

        //credit new client
        $user->credit()->create([
            'username' => $user->username,
            'price' => 0.03,
            'credit_alloted' => 0.15,
            'old_bal' => 0,
            'new_bal' => 0.15,
            '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]);
        }

        //Send email notification to user
        try
        {
            $m_email = 'support@npontu.com';
            if(!empty($m_email)) {
                //prepare data to pass to email view
                $data = [
                    'username' => $request['username'],
                    'password' => $request['password'],
                    'full_name' => $request['full_name'],
                    'loginUrl' => route('reseller.login', ['name'=>$request['username']])
                ];
                //send email notification to clent
                Mail::send('emails.registration_msg', $data, function ($m) use ($request) {
                    $m_email = 'support@npontu.com';
                    $m->from($m_email, 'Deywuro');
                    $m->to($request['email'], $request['full_name']);
                    $m->subject('Welcome to Deywuro!');
                });
            }
        }
        catch (\Exception $ex){}

        // send sms to client
        try
        {
            $msg = "Hello {$inputs['first_name']},
            Your account with Deywuro has been successfully created.
            Your username is: {$request['username']} and your password is: {$request['password']}. Thank you";

            @SmsTools::send_internal_sms($inputs['phone_number'], $msg);
        } catch (\Exception $ex){}

        // send sms to support/debby
        try
        {
            $msg = "Hello Support,
A new reseller has been registered on the SMS platform, kindly find below his details:
Name: {$request['full_name']}
Phone Number: {$request['phone_number']}
Username: {$request['username']}
Email: {$request['email']}";

            @SmsTools::send_internal_sms('233243375520', $msg);
            @SmsTools::send_internal_sms('233246567599', $msg);
        } catch (\Exception $ex){}

        //log the user in
        $credentials = $request->only( 'email', 'password' );
        $credentials['role_id'] = Role::where('name', 'reseller')->firstOrFail()->id;
        if (Auth::attempt($credentials, false)) {
            return redirect()->route('reseller.app');
        } else {
            return Redirect::back()->withInput()->withErrors(array('login' => 'An error occured on login, please try again later!'));
        }
    }

    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', 'reseller')->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('/reseller/dashboard');
            } else {
                return redirect()->intended('/reseller/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'),
                ]);
        }

//        return null;
    }
    //social media routes
    public function redirectTogoogle()
    {
        return Socialite::driver('google')->stateless()->redirect();
    }

    public function handlegoogleCallback()
    {
        try{
            $user = Socialite::driver('google')->stateless()->user();
        }catch(Exception $e){
            return redirect('login/google');
        }
        $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' =>'npontu',
                'role_id' => 3,

            ]);
            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{
            header('Location: http://npontutest.deywuro.com/errorx');


            exit();        }

    }
}
