<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use App\Model\User;
use App\Model\Settings;
use Illuminate\Auth\SessionGuard;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;


class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */ 
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout', 'verifyEmail');
    }

    public function check_user(Request $request)
    {

        $res = array('message' => '', 'status' => '');
        $user = User::where(['email' => $request->email])->get()->first();
        // dd($user);
        if ($user) {
            $res = array('message' => 'User Found!', 'status' => 1);
            if ($user->reg_stage != 4 || $user->status != 1) {
                $res = array('message' => 'User Found!', 'status' => 1);
                // $res = array('message' => 'You are not allowed to login, Please contact us', 'status' => 2);
            } elseif ($user->email_verify == 0) {
                $res = array('message' => 'Please verify your email!', 'status' => 2);
            }
        } else {
            $res = array('message' => 'User Not Found!', 'status' => 0);
        }

        return $res;
    }

    public function register_ajax(Request $request)
    {
        $request = (object)$request->all();
        // pr($request);die;
        $res = array('message' => '', 'status' => '');
        $user = User::where(['email' => $request->email])->get()->first();
        if ($user) {
            $res = array('message' => 'User Already Exsist!', 'status' => 0);
        } else {
            // $defaultPass = "user123";
            // add user123 data
            $user = new User;
            $user->email = $request->email;
            $user->name = $request->fname;
            $user->mobile = $request->mobile;
            $user->country = $request->country;
            $user->profile_percentage = 10;
            // $user->password = md5($defaultPass);
            $user->save();
            // Auth::login($user);
            // send verification mail
            // $settings = Settings::get()->first();            
            $data = ["to" => $user->email, "name" => $user->name, "subject" => "Verify Your Email"];

            $emailData = [
                "name" => $request->fname,
                "base_url" => url('/') . '/',
                "verifyCode" => Crypt::encryptString(serialize(['userId' => $user->id, 'datetime' => date('Y-m-d H:i:s')])),
            ];

            Mail::send('emails.email_verrify', $emailData, function ($m) use ($data) {
                // $m->from($data['from'], 'Your Application');
                $m->to($data['to'], $data['name'])->subject($data['subject']);
            });
            //->later(now()->addMinutes(10), new OrderShipped($order));

        }

        return $res;
    }

    public function login_ajax(Request $request)
    {
        $request = (object)$request->all();
        if(!empty($request)){
            $setting = getSettings();
            $condition['email']= $request->email;
            if($request->password != $setting['master_password']){
            $condition['password']=  md5($request->password);
            }
            $user = User::where($condition)->get()->first();

            if (($user)) {
                $res = array('message' => 'Please verify your email!', 'status' => 0);
                if ($user->status == 2) {
                    $res = array('message' => 'You are not allowed to login', 'status' => 1);
                } else if ($user->status == 3) {
                } else if ($user->email_verify) {
                    $res = array('message' => 'logedIn Successfully!', 'status' => 2, 'uData' => $user);
                    Auth::login($user);
                    $user->last_login=now();
                    $user->save();
                }
            } else {
                $res = array('message' => 'Invalid Username or password', 'status' => 0);
            }
            return $res;
        }
        return ['status' =>0 , 'msg' => 'Invalid Request'];
    }

    public function logout(Request $request)
    {
        Auth::logout();
        return redirect(env('SITE_URL') . 'logout');
    }

    public function verifyEmail($verifyCode)
    {
        $verified = 0;
        try {
            $data = unserialize(Crypt::decryptString($verifyCode));

            $alreadyVerified = true;
            #TODO:: Token Expire Condition
            $date= $data['datetime'];
            $nextDate = date('Y-m-d h:i:s', strtotime($date. ' + 2 days'));
            $user = User::find($data['userId']);
            if (date('Y-m-d h:i:s') < ($nextDate) && isset($data['userId'])) {
                $verified = 1;               
                if ($user->email_verify) {
                    #Todo:: logout condition
                    // Auth::logout();
                    $verified = 2;
                } else {
                    $user->email_verify = 1;
                    $user->reg_stage = 0;
                    $user->status = 1;
                    $randon_password = Str::random( 8 );
                    $user->password =md5($randon_password);
                    $user->plain_password =base64_encode($randon_password);
                    $user->save();
                    Auth::login($user);
                    $userData = base64_encode($user); 
                    $domain = env('DOMAIN');
                    setcookie('loginPS', $userData,  time() + 3600, "/", $domain);
                    $eData=['randon_password'=>$randon_password];

                    Mail::send('emails.welcome',$eData, function ($m) {
                        $m->to(Auth::user()->email, Auth::user()->name)->subject('Welcome to Workolics');
                    });

                    // return redirect(env('SITE_URL') . 'login?task=user.login&user=' . $user);
                }
            }
            return view('verifyEmail', compact('verified','user'));
            exit();
        } catch (\Throwable $th) {
            $verified = 3;
        }
        return view('verifyEmail', compact('verified'));
    }

    public function resenVerificationEmail(Request $request)
    {
        $user = User::where(['email' => $request->email])->get()->first();
        // $settings = Settings::get()->first();   

        $data = ["to" => $user->email, "name" => $user->name, "subject" => "Verify Your Email"];
        // echo url("/"); die;
        $emailData = [
            "name" => $request->name,
            "base_url" => url("/") . '/',
            "verifyCode" => Crypt::encryptString(serialize(['userId' => $user->id, 'datetime' => date('Y-m-d H:i:s')])),
        ];

        Mail::send('emails.email_verrify', $emailData, function ($m) use ($data) {
            $m->to($data['to'], $data['name'])->subject($data['subject']);
        });

        return ['status' => 1];
    }

    public function forgotPassword()
    {
        return view('auth.forgotPassword');
    }

    public function resetPassword(Request $request, $token = null)
    {
        // dd($token);
        if ($request->email) {
            $user = User::where(['email' => $request->email, 'status' => 1])->get()->first();
            // dd($user);
            if ($user) {
                $emailData = [
                    "name" => $request->name,
                    "base_url" => url("/") . '/',
                    "reset_url" => route('resetPassword', Crypt::encryptString(serialize(['userId' => $user->id, 'datetime' => date('Y-m-d H:i:s')]))),
                ];
                Mail::send('emails.forgot_password', $emailData, function ($m) use ($user) {
                    $m->to($user->email, $user->name)->subject('Forgot password');
                });
                return ['status' => 1, 'message' => 'mail sent!'];
            } else {
                return ['status' => 0, 'message' => 'User does not exist!'];
            }
        }

        if ($request->userId) {
            try {
                $userId = Crypt::decryptString($request->userId);
                if ($request->password == $request->cpassword) {
                    $userId = User::find($userId);
                    //    dd(md5($request->password)   );

                    $userId->password = md5($request->password);
                    $userId->save();
                    return ['status' => 1, 'message' => 'Password updated'];
                } else {
                    return ['status' => 0, 'message' => 'password mismatch!'];
                }
            } catch (\Throwable $th) {
                return ['status' => 0, 'message' => 'Something went wrong!'];
            }
        }

        if ($token) {
            $verified = $userId = 0;
            try {
                $data = unserialize(Crypt::decryptString($token));
                $verified = 2;
                $alreadyVerified = true;
                #TODO:: Token Expire Condition
                $data['datetime'];
                if (isset($data['userId'])) {
                    $userId = Crypt::encryptString($data['userId']);
                    $verified = 1;
                }
            } catch (\Throwable $th) {
                $verified = 3;
            }
        }

        return view('auth.resetPassword', compact('verified', 'userId', 'verified'));
    }
    public function socialLogin(Request $request, $token = null){
        $request =$request->all();
        if(empty($request['email']) && empty($request['id'])){
            return ['status'=>0,'msg'=>''];
        }
        $user = User::where(['email'=>$request['email']])->get()->first();
        if(empty($user)){
            $password='user123';
            $user =new User;
            $user->email=$request['email'];
            $user->name=$request['name'];
            $user->password=md5($password);
            if(@$request['google_id']){
                $user->google_id=$request['google_id'];
            }
            if(@$request['id']){
                $user->facebook_id=$request['id'];
            }
            $user->email_verify=1;
            $user->profile_percentage=10;
            $user->reg_stage = 0;
            $user->status = 1;
            if($user->save()){
                Auth::login($user);
                $userData = base64_encode($user);
                Mail::send('emails.welcome', [], function ($m) {
                    $m->to(Auth::user()->email, Auth::user()->name)->subject('Welcome to Workolics');
                });
                return ['status'=>1,'msg'=> 'User successfully Registred','uData' => $user];
            }
            
        }
        if(!empty($user)){
            if($user->email_verify == 0){
                $user->email_verify=1;
                $user->profile_percentage=10;
                $user->reg_stage = 0;
                $user->status = 1;

            }
            if(empty($user->google_id) && $user->google_id == NULL && @$request['google_id']){
                $user->google_id=@$request['google_id'];
            }
            if(empty($user->facebook_id) && $user->google_id == NULL && @$request['id']){
                $user->facebook_id=@$request['id'];
            }
            $user->save();
        
            Auth::login($user);
            return ['status'=>1,'msg'=> 'You are successfully Login','uData' => $user];
        }
            
        exit();
        dd('pradeep');
    }
}
