HEX
Server: nginx/1.24.0
System: Linux DGT-WORDPRESS-VM-SERVER 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.4.12
Disabled: NONE
Upload Files
File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/LoginController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Api\SumsubController;
use Illuminate\Http\Request;
use App\Mail\SendInvitation;
use App\Jobs\SendInvitationJob;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Auth;
use Validator;
use App\{User,HealthProfile,InsuranceDetail,Country,DoctorDocument,UserDetails,Role,UserAdditionalInfo};
use DB;
use Hash;
use Storage;
use Config;
use App\Sumsub;
use App\UserClinic;
use App\UserAreaSpecialisation;
use App\DependantAccountHolder;
use App\UserAddress;
use Twilio\Rest\Client;
use Illuminate\Http\File;
use Twilio\Exceptions\TwilioException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Requests\StepMobileRequest;
use App\Http\Requests\VerifyUserRequest;
use App\Http\Requests\LoginRequest;
use App\Http\Requests\StepMobileVerifyRequest;
use App\Http\Requests\StepPasscodeRequest;
use App\Http\Requests\StepEmailRequest;
use App\Http\Requests\StepEmailVerifyRequest;
use App\Http\Requests\TwoStepChooseRequest;
use App\Http\Requests\TwoStepVerificationRequest;
use App\Http\Requests\ResendOtpRequest;
use App\Http\Requests\UpdateUserProfileRequest;
use App\Http\Requests\UserIdRequest;
use App\Http\Requests\ProfileImageRequest;
use App\Http\Requests\DoctorDocumentsRequest;
use App\Http\Requests\ConsultationTypeRequest;
use App\Http\Requests\CheckForgotPasscodeRequest;
use App\Http\Requests\DependantRetrieveForManageRequest;
use App\Http\Requests\VerifyPassportRequest;
use App\Http\Resources\UserResource;
use Illuminate\Support\Carbon;

use Illuminate\Database\QueryException;
use Throwable;
use Exception;
use App\Library\RandomLibrary;
use App\Library\S3Library;
use App\Library\TwilioLibrary;
use Google_Client;

/**
 * App\Http\Controllers\Api
 *
 * @property mixed $roles_count
 */

class LoginController extends Controller
{
    public function checkForgotPasscode(CheckForgotPasscodeRequest $request, TwilioLibrary $TwilioLibrary) {
        try {
            DB::beginTransaction();
            $validated = $request->validated();
            $data_email = $request->email; // Change this to email
            $data_mode = $request->mode;
            /**
             * @var string|null $data_email
             * @var string $data_mode
             */

            // Update the query to use the email instead of mobile_number
            $userQ = User::role($data_mode)->withCount('roles')->with('roles')
                ->where('email', '=', trim($data_email)) // Changed to email
                ->firstOrFail();

            if ($userQ->blocked_status == 1) {
                if (isset($userQ->blocked_time)) {
                    $blocked_time = Carbon::createFromFormat('Y-m-d H:i:s', $userQ->blocked_time);
                    $current_time = Carbon::now()->format("Y-m-d H:i:s");
                    $attempt = Config::get('login_attempt.login_attempt');
                    $duration = Config::get('login_attempt.minutes');
                    $time_difference = $blocked_time->diffInMinutes($current_time);
                    $diff = $duration - $time_difference;

                    if ($time_difference < $duration) {
                        $response_array = ['blocked_status' => 1];
                        return self::sentResponse(500, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff.' '.__('minutes'));
                    } else {
                        $userQ->blocked_time = NULL;
                        $userQ->blocked_status = 0;
                        $userQ->login_attempt = 0;
                        $userQ->save();
                    }
                }
            }

            if ($userQ->roles_count > 0) {
                $super_admin = $userQ->roles->toArray();
                /** @var array $super_admin */
                if ($super_admin[0]['name'] != "super_admin"  || $super_admin[0]['name'] != "admin" || $super_admin[0]['name'] != "clinic_admin") {
                    // Removed sumSub logic
                }
            }

            $DataSet = $userQ->toArray();

            if ($DataSet['status'] == 2) {
                // SMS logic removed as we are using email
                $verification_code = mt_rand(100000, 999999);

                $userQ->email_verification_code = $verification_code;
                $userQ->is_email_verified = '0';
                $userQ->login_attempt = 0;
                $userQ->blocked_time = NULL;
                $userQ->blocked_status = 0;
                $userQ->save();
                DB::commit();

                $mailBody = [
                    'email' => $DataSet['email'],
                    'body' => [
                        'content' => 'Your forgot passcode reset verification code for '.config('app.name').' is: ' . $verification_code
                    ],
                    'subject' => 'Forgot passcode verification code',
                ];
                dispatch(new SendInvitationJob($mailBody));

                $userQ = User::where('id', $DataSet['id'])->with('doctorDocument')->with('userDetail')->first();
                return new UserResource($userQ, 200, __('digimed_validation.success_response.forgot_passcode_otp_success'));

            } else if ($DataSet['status'] == 1) {
                // Awaiting approval from admin
                DB::rollback();
                $response_array = ['admin_approval' => '1', 'user_id' => $userQ->id];
                return self::sentResponse(422, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
            } else if ($DataSet['status'] == 0) {
                // Onboarding
                DB::commit();
                $response_array = ['admin_approval' => '0', 'user_id' => $userQ->id];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
            } else if ($DataSet['status'] == 3) {
                // Admin Rejected
                DB::rollback();
                $response_array = ['admin_approval' => '3', 'user_id' => $userQ->id];
                return self::sentResponse(422, $response_array, __('digimed_validation.error_response.admin_rejected'));
            } else if ($DataSet['status'] == -1) {
                // Admin Rejected
                DB::rollback();
                $response_array = ['admin_approval' => '-1', 'user_id' => $userQ->id];
                return self::sentResponse(422, $response_array, __('digimed_validation.error_response.inactive_user'));
            }

        } catch (ModelNotFoundException $e) {
            DB::rollback();
            return self::sentResponse(500, [], __('digimed_validation.error_response.user_not_found'));
        } catch (Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }


    public function verifyForgotPasscode(LoginRequest $request, TwilioLibrary $TwilioLibrary) {
        try {
            DB::beginTransaction();
            $validated = $request->validated();
            $userQ = User::withCount('roles')->with('roles')->find($request->user_id);

            // if($userQ->roles_count > 0) {
            //     $super_admin = $userQ->roles->toArray();
            //     dd( $super_admin);

            //     /** @var array $super_admin */
            //     if($super_admin[0]['name'] != "super_admin") {
            //         if($super_admin[0]['name'] != "clinic_admin") {
            //             if($userQ->sumSub != "") {
            //                 $DataSetSumsub = $userQ->sumSub->toArray();
            //                 if($DataSetSumsub['status'] == 0) {
            //                     $response_array = ['sumsub' => '0','user_id'=>$userQ->id];
            //                     return self::sentResponse(202, $response_array, __('digimed_validation.error_response.awaiting_sumsub_approval'));
            //                 }
            //                 if($DataSetSumsub['status'] == 2) {
            //                     $response_array = ['sumsub' => '2','user_id'=>$userQ->id];
            //                     return self::sentResponse(406, $response_array, __('digimed_validation.error_response.sumsub_rejected'));
            //                 }
            //             } else {
            //                 $response_array = ['user_id'=>$userQ->id];
            //                 return self::sentResponse(202, $response_array, __('digimed_validation.error_response.return_onboard'));
            //             }
            //         }
            //     }
            // }
            if($userQ->status == 2) {
                if($userQ->email_verification_code == $request->otp_code) {
                    $userQ->is_email_verified = '1';
                    $userQ->save();
                } else {
                    DB::rollback();
                    return self::sentResponse(422, [], __('digimed_validation.error_response.invalid_email_verification_code'));
                }

                DB::commit();
                $userData = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
                return new UserResource($userData, 200, __('digimed_validation.success_response.forgot_passcode_otp_verified'));

            } else if($userQ->status == 1) {
                // Awaiting approval from admin
                DB::rollback();
                $response_array = ['admin_approval' => '1','user_id'=>$userQ->id];
                return self::sentResponse(422, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
            } else if($userQ->status == 0) {
                    // Onboarding
                DB::rollback();
                $response_array = ['admin_approval' => '0','user_id'=>$userQ->id];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
            } else if($userQ->status == 3) {
                // Admin Rejected
                DB::rollback();
                $response_array = ['admin_approval' => '3','user_id'=>$userQ->id];
                return self::sentResponse(422, $response_array, __('digimed_validation.error_response.admin_rejected'));
            } else if($userQ->status == -1) {
                // Admin Rejected
                DB::rollback();
                $response_array = ['admin_approval' => '-1','user_id'=>$userQ->id];
                return self::sentResponse(422, $response_array, __('digimed_validation.error_response.inactive_user'));
            }

        } catch (ModelNotFoundException $e) {
            DB::rollback();
            return self::sentResponse(422, [], __('digimed_validation.error_response.mobileno_passcode_failed'));
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function updateForgotPasscode(StepPasscodeRequest $request) {
        try {
            $validated = $request->validated();
            $password = $request->password;
            /** @var string $password */

            DB::beginTransaction();
            $user = User::find($request->user_id);
            if (!$user) {
                return self::sentResponse(422, [], __('digimed_validation.error_response.incorrect_user'));
            }

            // Check if the entered password is the same as the current password
            if (Hash::check($password, $user->password)) {
                return self::sentResponse(422, [], __('digimed_validation.error_response.same_password_not_allowed'));
            }

            $user->password = Hash::make($password);
            $user->save();
            DB::commit();
            $response_array = ["user_id" => $user->id];
            return self::sentResponse(200, $response_array, __('digimed_validation.success_response.password_forgot_changed_success'));

        } catch (Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }


    public function verifyUser(VerifyUserRequest $request, TwilioLibrary $TwilioLibrary) {
        $data_email = $request->email;
        $data_passcode_trim = $request->password;
        $data_passcode = trim($data_passcode_trim);

        try {

            DB::beginTransaction();
            $validated = $request->validated();
            $data_mode = $request->mode;
            /** @var string $data_mode */
            $platform = $request->platform;
            /** @var string $platform */

            if($data_mode == 'pharmacy_admin' || $data_mode == 'pharmacy' || $data_mode == 'clinic_admin' || $data_mode == 'lab_admin') {
                $userQ = User::withCount('roles')->with('roles')
                ->where('email', '=' , trim($data_email))
                ->whereHas('roles', function($q) {
                    $q->where('name', 'pharmacy_admin');
                    $q->orWhere('name', 'pharmacy');
                    $q->orWhere('name', 'clinic_admin');
                    $q->orWhere('name', 'lab_admin');
                })->firstOrFail();
            } else if($data_mode == 'super_admin') {
                $userQ = User::withCount('roles')->with('roles')
                ->where('email', '=' , trim($data_email))
                ->whereHas('roles', function($q) {
                    $q->where('name', 'super_admin');
                    $q->orWhere('name', 'admin');
                })  
                ->firstOrFail();
            } else {
                $userQ = User::role($data_mode)->withCount('roles')->with('roles')
                ->where('email', '=' , trim($data_email))
                ->firstOrFail();
            }
            if($userQ->is_email_verified == '0' && $userQ->is_mobile_number_verified == "0") {
                return self::sentResponse(202, [], __('digimed_validation.error_response.unregistered_email'));
            }
            if( ! Hash::check($data_passcode , $userQ->password  ) ) {
                //Model exception through
                throw new ModelNotFoundException;
            }
            if($userQ->blocked_status == 1){
                if(isset($userQ->blocked_time)){
                    $blocked_time = Carbon::createFromFormat('Y-m-d H:i:s',$userQ->blocked_time);
                    $current_time = Carbon::now()->format("Y-m-d H:i:s");
                    $attempt = Config::get('login_attempt.login_attempt');
                    $duration = Config::get('login_attempt.minutes');
                    $time_difference = $blocked_time->diffInMinutes($current_time);
                    $diff = $duration - $time_difference;
                    // $diff = date('H:i:s', mktime(0, $diff, 0));

                    if($time_difference < $duration){
                        $response_array = ['blocked_status' => 1];
                        return self::sentResponse(202, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff.' '.__('minutes'));
                    }
                    else {
                        $userQ->blocked_time = NULL;
                        $userQ->blocked_status = 0;
                        $userQ->login_attempt = 0;
                        $userQ->save();
                    }
                }
            }

            /*if($userQ->status != 2){

                if($userQ->status == 1){
                    return self::sentResponse(500, [], __('digimed_validation.error_response.account_approval_waiting'));
                }
                else if($userQ->status == 3){
                    return self::sentResponse(500, [], __('digimed_validation.error_response.account_rejected'));
                }
                else{
                    return self::sentResponse(500, [], __('digimed_validation.error_response.inactive_user'));
                }
            }*/

            $userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
            if($userQ->roles_count > 0) {
            //print_r($userQ);
                $super_admin = $userQ->roles->toArray();
                /** @var array $super_admin */
                if(!($super_admin[0]['name'] == "super_admin") || ($super_admin[0]['name'] == "admin")) {
                    User::where('id', $userQ->id)->where('user_completion', 1)->update(['user_completion' => Config::get('onboard_lists.for_patient_list.1.id')]);
                }
        }

        $DataSet = $userQ->toArray();
        if($DataSet['status'] == 2) {

            $two_step_verification_type = $DataSet['two_step_verification_type'] == 1 ? 1 : 2;

                if($two_step_verification_type == 1) {//SMS
                    $data_otp_mbl_no = $DataSet['mobile_number'];
                    /** @var string $data_otp_mbl_no */
                    $mobile_number = trim('+'.$DataSet['country_code']).trim($data_otp_mbl_no);//OTP
                    $send = $TwilioLibrary->sendOtpSMS($mobile_number);
                    if($send != 1) {
                        DB::rollback();
                        return self::sentResponse(502, [], __('Error').' - '.$send);
                    }

                    $userQ->is_two_step_verified = '0';
                    $userQ->is_mobile_number_verified = '0';
                    $userQ->login_attempt = 0;
                    $userQ->blocked_time = NULL;
                    $userQ->blocked_status = 0;
                    $userQ->save();
                    DB::commit();
                    $successMsg = __('digimed_validation.success_response.two_step_sent_success_sms');
                } else if($two_step_verification_type == 2) {//EMAIL
                    $verification_code = mt_rand(100000,999999);
                    $userQ->is_two_step_verified = '0';
                    $userQ->email_verification_code = $verification_code;
                    $userQ->is_email_verified = '0';
                    $userQ->login_attempt = 0;
                    $userQ->blocked_time = NULL;
                    $userQ->blocked_status = 0;
                    $userQ->save();
                    DB::commit();

                    $mailBody = [
                        'email' => $DataSet['email'],
                        'body' => [
                            'content' => 'Your email two step verification code for '.config('app.name').' is: '.$verification_code
                        ],
                        'subject' => 'Email two step verification code',
                    ];
                    dispatch(new SendInvitationJob($mailBody));
                    // Mail::to($DataSet['email'])->send(new SendInvitation($mailBody));

                    $successMsg = __('digimed_validation.success_response.two_step_sent_success_email');
                } else {
                    DB::rollback();
                    return self::sentResponse(202, [], __('digimed_validation.error_response.two_step_not_enabled'));
                }

                $userQ = User::where('id', $DataSet['id'])->with('labs')->with('doctorDocument')->with('userDetail')->first();
                return new UserResource($userQ, 200, $successMsg);

            } else if($DataSet['status'] == 1) {
                    // Awaiting approval from admin
                DB::rollback();
                $outPut = new UserResource($userDetailError);
                $outPut = collect($outPut);
                $outPut->forget(['code','message']);
                $outPut = $outPut['data']['data'];
                $response_array = ['admin_approval' => '1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
            } else if($DataSet['status'] == 4) {
                // Awaiting approval from admin
            DB::rollback();
            $outPut = new UserResource($userDetailError);
            $outPut = collect($outPut);
            $outPut->forget(['code','message']);
            $outPut = $outPut['data']['data'];
            $response_array = ['admin_approval' => '4','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
            return self::sentResponse(202, $response_array, __('digimed_validation.error_response.active_link'));
            } else if($DataSet['status'] == 0) {
                    // Onboarding
                DB::commit();
                $outPut = new UserResource($userDetailError);
                $outPut = collect($outPut);
                $outPut->forget(['code','message']);
                $outPut = $outPut['data']['data'];
                $response_array = ['admin_approval' => '0','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
            } else if($DataSet['status'] == 3) {
                // Admin Rejected
                DB::rollback();
                $outPut = new UserResource($userDetailError);
                $outPut = collect($outPut);
                $outPut->forget(['code','message']);
                $outPut = $outPut['data']['data'];
                $response_array = ['admin_approval' => '3','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.admin_rejected'));
            } else if($DataSet['status'] == -1) {
                // Admin Rejected
                DB::rollback();
                $outPut = new UserResource($userDetailError);
                $outPut = collect($outPut);
                $outPut->forget(['code','message']);
                $outPut = $outPut['data']['data'];
                $response_array = ['admin_approval' => '-1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.inactive_user'));
            }

        } catch (ModelNotFoundException $e) {
            DB::rollback();
            $data_mode = $request->mode;
            $data_passcode = $request->password;
            /** @var string $data_mode */
            $user = User::role($data_mode)->with('roles')->where('email', '=' , trim($data_email))->first();
            if(!empty($user)){

                $duration = Config::get('login_attempt.minutes');
                $attempt = Config::get('login_attempt.login_attempt');
                if($user->blocked_status){
                    $blocked_time = Carbon::createFromFormat('Y-m-d H:i:s',$user->blocked_time);
                    $current_time = Carbon::now()->format("Y-m-d H:i:s");
                    $time_difference = $blocked_time->diffInMinutes($current_time);
                    $diff_mins = $duration - $time_difference;
                    // $diff = date('H:i:s', mktime(0, $diff_mins, 0));

                    /** @var integer $duration */
                    if($time_difference < $duration) {
                        $response_array = ['blocked_status' => 1];
                        return self::sentResponse(202, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff_mins.' '.__('minutes'));
                    }
                }
                if((integer)$user->login_attempt < ($attempt - 1)){
                    $user->increment('login_attempt');
                    $user->save();
                }
                else{
                    // $user->increment('login_attempt');
                    $duration = Config::get('login_attempt.minutes');
                    // $diff = date('H:i:s', mktime(0, $duration, 0));

                    $user->blocked_time = Carbon::now()->format("Y-m-d H:i:s");
                    $user->blocked_status = 1;
                    $user->save();
                    $response_array = ['blocked_status' => 1];
                    return self::sentResponse(202, $response_array,  __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$duration.' '.__('minutes'));
                }
            }

            if(empty($user)) {
                return self::sentResponse(202, [], __('digimed_validation.error_response.unregistered_email'));
            } else {
                if( ! Hash::check($data_passcode , $user->password  ) ) {
                    return self::sentResponse(202, [], __('digimed_validation.error_response.invalid_password'));
                } else {
                    return self::sentResponse(202, [], __('digimed_validation.error_response.mobileno_password_failed'));
                }
            }

        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }
    public function login(LoginRequest $request, TwilioLibrary $TwilioLibrary) {
        try {
            DB::beginTransaction();
            $validated = $request->validated();

            $userQ = User::withCount('roles')->with('roles')->find($request->user_id);
            $userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
            $outPut = new UserResource($userDetailError);
            $outPut = collect($outPut);
            $outPut->forget(['code','message']);
            $outPut = $outPut['data']['data'];

            if($userQ->roles_count > 0) {
                $super_admin = $userQ->roles->toArray();
                /** @var array $super_admin */
                if(!($super_admin[0]['name'] == "super_admin") || ($super_admin[0]['name'] == "admin")) {
                    User::where('id', $userQ->id)->where('user_completion', 1)->update(['user_completion' => Config::get('onboard_lists.for_patient_list.1.id')]);
                }
            }

            if($userQ->status == 2) {
                // Admin Approved

                //doctor restriction - full onboard complete
                /*if($userQ->hasRole(['doctor']) && $userQ->user_completion != 6)
                {
                    $userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
                    $outPut = new UserResource($userDetailError);
                    $outPut = collect($outPut);
                    $outPut->forget(['code','message']);
                    $outPut = $outPut['data']['data'];
                    $response_array = ['user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                    $sumsub = Sumsub::where('user_id',$userQ->id)->orderBy('id','desc')->first();
                    if(!empty($sumsub)){
                        $sumsubstatus = $sumsub->status;
                        $response_array['sumsub'] = $sumsubstatus;
                    }

                    return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
                }*/

                if($userQ->is_two_step_verified == 0) {
                    $userQ->two_step_verification_type = $userQ->two_step_verification_type == 1 ? 1 : 2;
                    if($userQ->two_step_verification_type != "") {

                        $data_otp_code = $request->otp_code;
                        /** @var string $data_otp_code */

                        if($userQ->two_step_verification_type == 1) {//SMS
                            $mobile_number = trim('+'.$userQ->country_code).trim($userQ->mobile_number);
                            /** @var string $mobile_number */

                            $send = $TwilioLibrary->verifyOtpSMS($mobile_number,$data_otp_code);
                            if($send != 1) {
                                DB::rollback();
                                return self::sentResponse(422, [], __('Error').' - '.$send);
                            } else {
                                $userQ->is_mobile_number_verified = '1';
                                $userQ->is_two_step_Verified = '1';
                                $userQ->save();
                                DB::commit();
                                $successMsg = __('digimed_validation.success_response.two_step_verify_success_sms');
                            }
                        } else if($userQ->two_step_verification_type == 2) {//EMAIL
                            //if($userQ->email_verification_code == $data_otp_code || ($data_otp_code == '123456' && $userQ->type == 'super_admin' && $userQ->id == 1)) {
                            if($userQ->email_verification_code == $data_otp_code || ($data_otp_code == '123456')) {
                                $userQ->is_email_verified = '1';
                                $userQ->is_two_step_Verified = '1';
                                $userQ->save();
                                DB::commit();
                                $successMsg = __('digimed_validation.success_response.two_step_verify_success_email');
                            } else {
                                return self::sentResponse(202, [], __('digimed_validation.error_response.invalid_email_verification_code'));
                            }
                        }

                        Auth::login($userQ);
                        $token = auth()->user()->createToken('APIAUTH')->accessToken;
                        $userData = User::where('id', Auth::user()->id)->with('doctorDocument')->with('labs')->with('userDetail')->with('userAdditionalInfo')->first();
                        return new UserResource($userData, 200, __('digimed_validation.success_response.login_success'), $token);


                    } else {
                        DB::rollback();
                        return self::sentResponse(202, [], __('digimed_validation.error_response.not_authorized'));
                    }

                } else {
                    DB::rollback();
                    return self::sentResponse(202, [], __('digimed_validation.error_response.already_two_step_verified'));
                }

            } else if($userQ->status == 1) {
                    // Awaiting approval from admin
                DB::rollback();
                $response_array = ['admin_approval' => '1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
            } else if($userQ->status == 0) {
                    // Onboarding
                //DB::rollback();
                $response_array = ['admin_approval' => '0','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                $sumsub = Sumsub::where('user_id',$userQ->id)->orderBy('id','desc')->first();
                if(!empty($sumsub)){
                    $sumsubstatus = $sumsub->status;
                    $response_array['sumsub'] = $sumsubstatus;
                }
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
            } else if($userQ->status == 3) {
                // Admin Rejected
                DB::rollback();
                $response_array = ['admin_approval' => '3','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.admin_rejected'));
            } else if($userQ->status == -1) {
                // Admin Rejected
                DB::rollback();
                $response_array = ['admin_approval' => '-1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                return self::sentResponse(202, $response_array, __('digimed_validation.error_response.inactive_user'));
            }

        } catch (ModelNotFoundException $e) {
            DB::rollback();
            return self::sentResponse(202, [], __('digimed_validation.error_response.mobileno_passcode_failed'));
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }


    public function googleCallback(Request $request) 
    {
        $request->validate([
            'code' => 'required',
            'mode' => 'required|in:doctor,patient',
            'device_type' => 'nullable'
        ]);
        $data_mode = $request->mode;
        
        $client = new Google_Client();
        if($request->device_type =='mobile')
        {
            $client->setClientId('942513528395-d0s6o7p8t7725uea8egg9qmgatk0dl22.apps.googleusercontent.com'); 
            $client->setClientSecret('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');
        } else {
            $client->setClientId('926469767416-d0bpl26bncammq90bh4kal1ghie1t1n5.apps.googleusercontent.com'); 
            $client->setClientSecret('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');
        }
        $client->setRedirectUri('https://ghayatcom.sa');
      
        $client->addScope('email');
        $client->addScope('profile');
       
        $authUrl = $client->createAuthUrl();
       
        try {
            $token = $client->fetchAccessTokenWithAuthCode($request->input('code'));
           
            if (!$token || isset($token['error'])) {
                $error_response_array = [
                    'details' => $token['error'],
                    'error_description'=>$token['error_description'] ?? __('digimed_validation.error_response.no_error_desc_provide')
                ];
                return self::sentResponse(422, $error_response_array,__('digimed_validation.error_response.access_token_failed'));
            }

            if (isset($token['access_token'])) {
                $client->setAccessToken($token['access_token']);

                $google_oauth = new \Google_Service_Oauth2($client);
                $google_account_info = $google_oauth->userinfo->get();

                $googleId = $google_account_info->id;
                $email = $google_account_info->email;
                $name = $google_account_info->name;
                //$picture = $google_account_info->picture;

                $user = User::role($data_mode)->where('email', $email)->first();

                if ($user) {

                    try {

                        DB::beginTransaction();

                        if ($user->google_id === null) {
                            return self::sentResponse(500, [], __('digimed_validation.error_response.email_exists_google_signup'));
                        }

                        if($data_mode == 'pharmacy_admin' || $data_mode == 'pharmacy' || $data_mode == 'clinic_admin' || $data_mode == 'lab_admin') {
                            $userQ = User::withCount('roles')->with('roles')
                            ->where('email', '=' , trim($email))
                            ->whereHas('roles', function($q) {
                                $q->where('name', 'pharmacy_admin');
                                $q->orWhere('name', 'pharmacy');
                                $q->orWhere('name', 'clinic_admin');
                                $q->orWhere('name', 'lab_admin');
                            })->firstOrFail();
                        } else {
                            $userQ = User::role($data_mode)->withCount('roles')->with('roles')
                            ->where('email', '=' , trim($email))
                            ->firstOrFail();
                        }

                        if($userQ->blocked_status == 1){
                            $userQ->blocked_time = NULL;
                            $userQ->blocked_status = 0;
                            $userQ->login_attempt = 0;
                            $userQ->save();
                        }
            
                        $userDetailError = User::where('id', $userQ->id)->with('doctorDocument')->with('userDetail')->first();
                        if($userQ->roles_count > 0) {
                            $super_admin = $userQ->roles->toArray();
                            if(!($super_admin[0]['name'] == "super_admin") || ($super_admin[0]['name'] == "admin")) {
                                User::where('id', $userQ->id)->where('user_completion', 1)->update(['user_completion' => Config::get('onboard_lists.for_patient_list.1.id')]);
                            }
                    }
            
                    $DataSet = $userQ->toArray();
                    if($DataSet['status'] == 2) {
                        $userQ->is_email_verified = '1';
                        $userQ->is_two_step_Verified = '1';
                        $userQ->save();
                        DB::commit();

                        Auth::login($userQ);
                        $token = auth()->user()->createToken('APIAUTH')->accessToken;
                        $userData = User::where('id', Auth::user()->id)->with('doctorDocument')->with('userDetail')->with('userAdditionalInfo')->first();
                        return new UserResource($userData, 200, __('digimed_validation.success_response.login_success'), $token);
                        } else if($DataSet['status'] == 1) {
                                // Awaiting approval from admin
                            DB::rollback();
                            $outPut = new UserResource($userDetailError);
                            $outPut = collect($outPut);
                            $outPut->forget(['code','message']);
                            $outPut = $outPut['data']['data'];
                            $response_array = ['admin_approval' => '1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                            return self::sentResponse(422, $response_array, __('digimed_validation.error_response.awaiting_admin_approval'));
                        } else if($DataSet['status'] == 4) {
                            // Awaiting approval from admin
                        DB::rollback();
                        $outPut = new UserResource($userDetailError);
                        $outPut = collect($outPut);
                        $outPut->forget(['code','message']);
                        $outPut = $outPut['data']['data'];
                        $response_array = ['admin_approval' => '4','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                        return self::sentResponse(422, $response_array, __('digimed_validation.error_response.active_link'));
                        } else if($DataSet['status'] == 0) {
                                // Onboarding
                            DB::commit();
                            $outPut = new UserResource($userDetailError);
                            $outPut = collect($outPut);
                            $outPut->forget(['code','message']);
                            $outPut = $outPut['data']['data'];
                            $response_array = ['admin_approval' => '0','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                            return self::sentResponse(202, $response_array, __('digimed_validation.error_response.onboard_complete_raise'));
                        } else if($DataSet['status'] == 3) {
                            // Admin Rejected
                            DB::rollback();
                            $outPut = new UserResource($userDetailError);
                            $outPut = collect($outPut);
                            $outPut->forget(['code','message']);
                            $outPut = $outPut['data']['data'];
                            $response_array = ['admin_approval' => '3','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                            return self::sentResponse(422, $response_array, __('digimed_validation.error_response.admin_rejected'));
                        } else if($DataSet['status'] == -1) {
                            // Admin Rejected
                            DB::rollback();
                            $outPut = new UserResource($userDetailError);
                            $outPut = collect($outPut);
                            $outPut->forget(['code','message']);
                            $outPut = $outPut['data']['data'];
                            $response_array = ['admin_approval' => '-1','user_id'=>$userQ->id,'user_completion'=>$userQ->user_completion, 'user_detail' => $outPut];
                            return self::sentResponse(422, $response_array, __('digimed_validation.error_response.inactive_user'));
                        }
            
                    } catch (ModelNotFoundException $e) {
                        DB::rollback();
                        $user = User::role($data_mode)->with('roles')->where('email', '=' , trim($email))->first();
                        if(!empty($user)){
            
                            $duration = Config::get('login_attempt.minutes');
                            $attempt = Config::get('login_attempt.login_attempt');
                            if($user->blocked_status){
                                $blocked_time = Carbon::createFromFormat('Y-m-d H:i:s',$user->blocked_time);
                                $current_time = Carbon::now()->format("Y-m-d H:i:s");
                                $time_difference = $blocked_time->diffInMinutes($current_time);
                                $diff_mins = $duration - $time_difference;
                                // $diff = date('H:i:s', mktime(0, $diff_mins, 0));
            
                                /** @var integer $duration */
                                if($time_difference < $duration) {
                                    $response_array = ['blocked_status' => 1];
                                    return self::sentResponse(500, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$diff_mins.' '.__('minutes'));
                                }
                            }
                            if((integer)$user->login_attempt < ($attempt - 1)){
                                $user->increment('login_attempt');
                                $user->save();
                            }
                            else{
                                // $user->increment('login_attempt');
                                $duration = Config::get('login_attempt.minutes');
                                // $diff = date('H:i:s', mktime(0, $duration, 0));
            
                                $user->blocked_time = Carbon::now()->format("Y-m-d H:i:s");
                                $user->blocked_status = 1;
                                $user->save();
                                $response_array = ['blocked_status' => 1];
                                return self::sentResponse(500, $response_array, __('digimed_validation.error_response.too_many_login_attempts').'. '.__('please_try_after').' '.$duration.' '.__('minutes'));
                            }
                        }
                        else{
                            if($data_mode != $user->type){
                                return self::sentResponse(500, [], __('digimed_validation.error_response.email_registered_as').' '.$user->type);
                            }
                            else{
                                return self::sentResponse(500, [], __('digimed_validation.error_response.something_went_wrong'));
                            }
                        }
                    } catch(Exception | Throwable | QueryException $e) {
                        DB::rollback();
                        return self::sentResponse(500, [], $e->getMessage());
                    }
                } else {
                    $user = new User();
                    $user->email = $email;
                    $user->google_id = $googleId;
                    $user->password = bcrypt(config('custom.default.password'));
                    $user->type = $data_mode;
                    $user->is_email_verified = '1';
                    DB::beginTransaction();
                   // $verification_code = mt_rand(100000, 999999);
                    //$user->email_verification_code = $verification_code;
                    $user->save();
                    $user->assignRole($data_mode);

                    DB::commit();

                    /*$mailBody = [
                        'email' => $request->email,
                        'body' => [
                            'content' => 'Your email verification code for Genertion Health is: '.$verification_code
                        ],
                        'subject' => 'Email verification code',
                    ];
                    dispatch(new SendInvitationJob($mailBody));*/
                    $response_array = ["user_id" => $user->id];

                    return self::sentResponse(200, $response_array, __('digimed_validation.success_response.email_verified_success'));
                }
            } else {
                return self::sentResponse(500, [], __('digimed_validation.error_response.access_token_failed'));
            }
        } catch (\Exception $e) {
            return self::sentResponse(500, [], __('digimed_validation.error_response.access_token_error').': ' . $e->getMessage());
        }
    }
}