<?php

namespace App\Http\Controllers\api;

use Illuminate\Http\Request;
use App\Http\Requests\Login;
use App ;
use Illuminate\Support\Facades\Auth;
use Validator;
use Hash;
use App\User;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Facades\Mail;
use App\Mail\EmailVerification as EmailVerification ;
use  App\Http\Controllers\Controller as Controller ;
use App\Http\Controllers\api\OutPut;
class AuthApiController extends Controller
{
    use OutPut;
    use SendsPasswordResetEmails;
    public function registerUser(Request $request){
        if(!empty($request->user_lang)) {
            app()->setLocale($request->user_lang);
        }
        else {
            app()->setLocale('en');
        }
        $valid=Validator::make($request->all(),[
            //'password'=>'required|Confirmed|Filled|string|min:6',
            //'name'=>'required|Filled|string',
            'mobile'=>'required|Filled|string',
            //'gender'=>'required|Filled|string',
            //'email'=>'required|email',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }
        $client = new \GuzzleHttp\Client();
        $checkUser=\App\User::where('mobile' , $request->mobile)->first();
        if(!$checkUser) {
            $user = new User();
            $newUser = $user->createUser($request->input());
            if(substr($newUser->mobile, 0, 1)==2){
                if($request->mobile =='201090688397'){
                    \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470000000'){
                    \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470111111'){
                    \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
                }
                //$response = $client->request('GET', 'http://api.smsala.com/api/SendSMS?api_id=API907413703507&api_password=Jg0U01Gh72&sms_type=P&encoding=T&sender_id=Info&phonenumber='.$newUser->mobile.'&textmessage='.$newUser->veraction_code.'%20is%20the%20OTP%20');
            }
            else{
                if($request->mobile =='97470726944'){
                    \App\User::where('id', $newUser->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470000000'){
                    \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470111111'){
                    \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile !='97470726944') {
                    //$response = $client->request('GET', 'http://api.smsala.com/api/SendSMS?api_id=API259215507883&api_password=PBGhMdWgjT&sms_type=P&encoding=T&sender_id=Zajil%20Qatar&phonenumber=' . $newUser->mobile . '&textmessage=This%20is%20your%20OTP%20' . $newUser->veraction_code . '%20,%20to%20sign%20in%20Zajil%20Qatar%20app.');
                }
            }
        }
        else{
            $checkUser->veraction_code=str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
            $checkUser->save();
            if(substr($checkUser->mobile, 0, 1)==2){
                if($checkUser->mobile =='201090688397'){
                    \App\User::where('id', $checkUser->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470000000'){
                    \App\User::where('id', $checkUser->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470111111'){
                    \App\User::where('id', $checkUser->id)->update(array('veraction_code' => '123456'));
                }
                //$response = $client->request('GET', 'http://api.smsala.com/api/SendSMS?api_id=API907413703507&api_password=Jg0U01Gh72&sms_type=P&encoding=T&sender_id=Info&phonenumber='.$checkUser->mobile.'&textmessage='.$checkUser->veraction_code.'%20is%20the%20OTP%20');
            }
            else{
                if($request->mobile =='97470726944'){
                    \App\User::where('id', $checkUser->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470000000'){
                    \App\User::where('id', $checkUser->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile =='97470111111'){
                    \App\User::where('id', $checkUser->id)->update(array('veraction_code' => '123456'));
                }
                if($request->mobile !='97470726944') {
                    //$response = $client->request('GET', 'http://api.smsala.com/api/SendSMS?api_id=API259215507883&api_password=PBGhMdWgjT&sms_type=P&encoding=T&sender_id=Zajil%20Qatar&phonenumber=' . $checkUser->mobile . '&textmessage=This%20is%20your%20OTP%20' . $checkUser->veraction_code . '%20,%20to%20sign%20in%20Zajil%20Qatar%20app.');
                }
            }

        }

        //Mail::to($response)->send(new EmailVerification($response->token , $response->email));
        if($request->mobile !='97470726944') {
            //$response = $response->getBody()->getContents();
        }
        //print_r($response);
        return OutPut::Response('',__('messages.register_successful'),200);
        return OutPut::Response($response,'',200);
    }
    public function validateMobile(Request $request){
        if(!empty($request->user_lang)) {
            app()->setLocale($request->user_lang);
        }
        else {
            app()->setLocale('en');
        }
        $valid=Validator::make($request->all(),[
            'mobile'=>'required|Filled|string',
            'veraction_code'=>'required|Filled|string|min:6',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }

        $user=\App\User::where('mobile',$request->mobile)->where('veraction_code',$request->veraction_code)->first();
        if(!$user){
            return OutPut::Response('',__('messages.wrong_mobile_veraction_code'),403);
        }
        $user->verified=1;
        $user->save();
        return OutPut::Response('',__('messages.your_account_successful'),200);
    }
    public function resendOptCode(Request $request){
        if(!empty($request->user_lang)) {
            app()->setLocale($request->user_lang);
        }
        else {
            app()->setLocale('en');
        }
        $valid=Validator::make($request->all(),[
            'mobile'=>'required|Filled|string',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }

        $user= \App\User::where('mobile',$request->mobile)->first();
        if(!$user){
            return OutPut::Response('',__('messages.we_havent_mobile'),200);
        }

        $client = new \GuzzleHttp\Client();
        if(substr($user->mobile, 0, 1)==2){
            if($request->mobile =='201090688397'){
                \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
            }
            if($request->mobile =='97470000000'){
                \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
            }
            if($request->mobile =='97470111111'){
                \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
            }
            //$response = $client->request('GET', 'http://api.smsala.com/api/SendSMS?api_id=API907413703507&api_password=Jg0U01Gh72&sms_type=P&encoding=T&sender_id=Info&phonenumber='.$user->mobile.'&textmessage='.$user->veraction_code.'%20is%20the%20OTP%20');
        }else{
            if($request->mobile =='97470726944'){
                \App\User::where('id', $user->id)->update(array('veraction_code' => '123456'));
            }
            if($request->mobile !='97470726944') {
                //$response = $client->request('GET', 'http://api.smsala.com/api/SendSMS?api_id=API259215507883&api_password=PBGhMdWgjT&sms_type=P&encoding=T&sender_id=Zajil%20Qatar&phonenumber=' . $user->mobile . '&textmessage=This%20is%20your%20OTP%20' . $user->veraction_code . '%20,%20to%20sign%20in%20Zajil%20Qatar%20app.');
            }
        }
        //$response = $response->getBody()->getContents();
        //print_r($response);
        return OutPut::Response('',__('messages.send_successful'),200);
    }
    public function registerCompany(Request $request){
        if(!empty($request->user_lang)) {
            app()->setLocale($request->user_lang);
        }
        else {
            app()->setLocale('en');
        }
        $valid=Validator::make($request->all(),[
            'password'=>'required|Confirmed|Filled|string|min:6',
            //'name'=>'required|Filled|string',
            //'email'=>'required|email|unique:users',
            'company_cat'=>'required|Filled|string',
            'company_sub_cat'=>'required|Filled|string',
            //'des'=>'required|Filled|string',
            //'company_location'=>'required|Filled|string',
            'mobile'=>'required|Unique:users|Filled|string',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }

        $user=new User();
        $response=$user->createCompany($request->input());

        //Mail::to($response)->send(new EmailVerification($response->token , $response->email));


        return OutPut::Response('',__('messages.register_successful'),200);
        return OutPut::Response($response,'',200);
    }

    public function login(Request $request){
        if(!empty($request->user_lang )) {
            app()->setLocale($request->user_lang);
        }
        else {
            app()->setLocale('en');
        }
        $valid=Validator::make($request->all(),[
            'mobile'=>'required|Filled|string',
            //'password'=>'required|Filled|string|min:6',
            "veraction_code"=>'required|Filled|string',
//            "deviceid"=>'required|Filled|string',
//            "user_time_zone"=>'Filled|string',
//            "user_lang"=>'Filled|string',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }
        $user = User::where('mobile', $request->mobile)->where('veraction_code',$request->veraction_code)->first();
        if($user){
            //$user=   Auth::login($checkUser);
                if($user->locale==''){
                    $user->locale='en';
                    $user->save();
                }
            $user->verified=1;
            $user->save();
            $userLang =$user->locale;


            // set the user current Language
            //App::setlocale($user->lang);

            $pushtoken= \App\User::find($user->id);
            $pushtoken->pushtoken = $request->pushtoken ;
           $pushtoken->save();

            $respone= [
                "name"=> $user->name,
                "mobile"=> $user->mobile ,
                "email"=> $user->email,
                "id"=> $user->id,
                "lang"=>$userLang,
                "verified"=>(isset($user->verified)) ? $user->verified : 0,
                "sent_notifications"=>  ($user->notifications_off==0) ? true : false,
            ];

            return OutPut::Response($respone,'',200);
            }
        else{
            return OutPut::Response('',__('messages.login_error'),403);
        }

    }
    public function resetpassword(Request $request){
        app()->setLocale(Auth::user()->token()->user_lang);
        $valid=Validator::make($request->all(),[
            'password'=>'required|Filled|string|min:6',
            'newPassword'=>'required|Confirmed|Filled|string|min:6',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }
        $userId=Auth::user()->id;
        $user=new User();
        $oldPassword=$request->input("password");


        if(!Hash::check($oldPassword,Auth::user()->password)){
            return OutPut::Response('',__('messages.password_change_error'),403);
        }
        $saveNewPassword=$user->resetPassword($request->newPassword,$userId);
        // if resetPassword function return true, them new password saved successfully
        if($saveNewPassword){
            // revoke the old tokens of this user
            $currentToken=$request->user()->token()->id;
            $tokens=$request->user()->tokens;
            foreach($tokens as $token){
                // delete all except the current one
                if($token->id==$currentToken){continue;}
                $token->delete();
            }


            return OutPut::Response('',__('messages.password_change_successful'),200);
        }else{
            return OutPut::Response('',__('messages.password_change_error'),403);
        }
    }

    public function logout(Request $request){
        if(Auth::check()){
            $valid=Validator::make($request->all(),[
                'device_id'=>'required|Filled|string',
            ]);
            if($valid->fails()){
                return OutPut::Response('',$valid->Errors(),403);
            }
            $currentToken=$request->user()->token()->id;
            $token=Auth::user()->tokens->find($currentToken);
            $token->delete();
            $user=Auth::user();
            $pushToken=\App\Pushtoken::where('user_id',$user->id)->where('device_id',$request->device_id)->first();
            if($pushToken) {
                $pushToken->token='';
                $pushToken->save();
            }

            return OutPut::Response('','',200);
        }
        return OutPut::Response('','',403);
    }
// send mail to user with link to form where he can enter his new one
    public function forgetpassword(Request $request){
        if(!empty($request->user_lang )) {
            app()->setLocale($request->user_lang);
        }
        else {
            app()->setLocale('ar');
        }
        $valid=Validator::make($request->all(),[
            'email'=>'required|Filled|email|string',
            'user_lang'=>'Filled|string',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }
        $userCheck = User::where('email', $request->email)->first();
        if(!$userCheck) {
            return OutPut::Response('',__('messages.email_not_registered_before'),403);
        }
//        if($userCheck->verified==0) {
//            return OutPut::Response('',__('messages.verify_account'),403);
//        }
//        if($userCheck->disabled==1 || $userCheck->deleted_at!=Null) {
//            return OutPut::Response('',__('messages.sending_reset_mail_error'),403);
//        }

        $response = $this->broker()->sendResetLink($request->only('email'));
        if(Password::RESET_LINK_SENT){
            return OutPut::Response('',__('messages.forget_password_email_successful'),200);
        }else{
            return OutPut::Response('',__('messages.sending_reset_mail_error'),403);
        }


    }


    function resendVerifiedEmail(Request $request)
    {
        if(!empty($request->user_lang )) {
            app()->setLocale($request->user_lang);
        }
        else {
            app()->setLocale('ar');
        }
        $valid=Validator::make($request->all(),[
            'email'=>'required|Filled|email|string',
            'user_lang'=>'Filled|string',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }

        $user = new User ();
        $userExists = $user->getUserByEmail($request->email);
        $userVerified =  $user->checkUserverification($userExists->token);
        if(!$userExists) {
            return OutPut::Response('',__('messages.worng_eamil'),403);
        }
        if(($userVerified == 1)) {
            return OutPut::Response('',__('messages.already_verified'),403);
        }
        else {
            Mail::to($userExists)->send(new EmailVerification($userExists->token ));
            return OutPut::Response('',__('messages.review_mail'),200);
        }
    }

    public function resetPasswordByMobile(Request $request){
        if(!empty($request->lang )) {
            app()->setLocale($request->lang);
        }
        else {
            app()->setLocale('ar');
        }
        $valid=Validator::make($request->all(),[
            'mobile'=>'required|Filled|string',
            'newPassword'=>'required|Confirmed|Filled|string|min:6',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }
        $user=\App\User::where('mobile',$request->mobile)->first();
        if(!$user){
            return OutPut::Response('',__('messages.wrong_mobile'),200);
        }

        $user->password =   bcrypt($request->newPassword);
        $user->save();

            return OutPut::Response('',__('messages.password_change_successful'),200);
    }


    public function newLogin(Request $request){
        $valid=Validator::make($request->all(),[
            'mobile'=>'required|Filled|string',
            'session_status'=>'required|Filled|string',
            "token"=>'required|Filled|string',
        ]);
        if($valid->fails()){
            return OutPut::Response('',$valid->Errors(),403);
        }
        $user = \App\User::where('mobile' , $request->mobile)->first();
        if(!$user){
            $newUser=new User();
            $user=$newUser->createUserNew($request->input());
        }

        $userLang =$user->locale;

        $pushtoken= \App\User::find($user->id);
        $pushtoken->session_status = $request->session_status ;
        $pushtoken->pushtoken  = $request->token ;
        $pushtoken->save();

        if($user->role_id==2){
            $user_type= "company";
            $respone= [
                "name"=> $user->name,
                "mobile"=> $user->mobile ,
                "email"=> $user->email,
                "id"=> $user->id,
                "lang"=>$userLang,
                "user_type"=>$user_type,
            ];
        }else{
            $user_type= "user";
            $respone= [
                "name"=> $user->name,
                "mobile"=> $user->mobile ,
                "email"=> $user->email,
                "id"=> $user->id,
                "lang"=>$userLang,
                "user_type"=>$user_type
            ];
        }
        return OutPut::Response($respone,'',200);
    }
}
