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/RegisterController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Mail\SendInvitation;
use App\Jobs\SendInvitationJob;
use App\Jobs\SendEmailNotificationJob;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Auth;
use Validator;
use App\{User,HealthProfile,InsuranceDetail,Country,DoctorDocument,UserDetails,Role,UserSettingsNotification,Pharmacy,UserPharmacy};
use DB;
use Hash;
use Storage;
use Config;
use App\UserClinic;
use App\AdminSettings;
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\UpdateDoctorProfileRequest;
use App\Http\Requests\ReviewDoctorRequest;
use App\Http\Requests\ActivateAccountRequest;
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\Requests\UpdatePharmacyUserProfileRequest;
use App\Http\Requests\UpdatePharmacyProfileRequest;
use App\Http\Requests\UpdatePharmacyAddressRequest;
use App\Http\Resources\UserResource;
use Illuminate\Support\Carbon;
use App\Helpers\GeneralHelper;
use Illuminate\Database\QueryException;
use Throwable;
use Exception;
use App\Library\RandomLibrary;
use App\Library\S3Library;
use App\Library\TwilioLibrary;
use Illuminate\Support\Str;
use App\Sumsub;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use Illuminate\Support\Facades\Crypt;

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

class RegisterController extends Controller
{

    public function stepMobile(StepMobileRequest $request, RandomLibrary $randomLibrary, TwilioLibrary $TwilioLibrary) {
        try {
            $validated = $request->validated();
            $dependant_id = $request->dependant_id;
            $user_id = $request->user_id;

            $data_country_code = $request->country_code;
            $data_mobile_number = $request->mobile_number;
            $data_type = $request->type;
            /**
            * @var string $data_country_code
            * @var string $data_mobile_number
            * @var string $data_type
            */

            $country = Country::where('phone_code', $data_country_code)->first();
            if(!$country) {
                return self::sentResponse(200, [], __('digimed_validation.error_response.country_code_not_valid'));
            }

            if(!empty($user_id)) {
                $user = User::find($user_id);
            } else {
                if($data_type == 'pharmacy_admin') {
                    $user = User::with('doctorDocument')->with('userDetail')->where('mobile_number', $data_mobile_number)->whereHas('roles', function($q) {
                            $q->where('name', 'pharmacy_admin');
                            $q->orWhere('name', 'pharmacy');
                        }
                    )->first();
                    if(!empty($user)) {
                        return self::sentResponse(401, [], __('digimed_validation.error_response.mobileno_in_use'));
                    }
                } else {
                    $user = User::with('doctorDocument')->with('userDetail')->where('mobile_number', $data_mobile_number)->whereHas(
                    'roles', function($q) use ($data_type){
                            $q->where('name', $data_type);
                        }
                    )->first();
                }
            }

            DB::beginTransaction();
            if(!empty($user)) {

                if ($dependant_id != "") {
                    //Dependant flow
                    $userDependant = User::with('doctorDocument')->with('userDetail')->find($dependant_id);
                    $userDependant->country_code = trim($data_country_code);
                    $userDependant->mobile_number = trim($data_mobile_number);
                    $userDependant->is_mobile_number_verified = '0';
                    $userDependant->country_id = $country->id;

                    if ($data_type == 'patient') {
                        /** @var string|null $column */
                        $column = 'unique_id';
                        /** @var string $forCondition */
                        $forCondition = 'patient';
                        /** @var string|null $patient_id */
                        $patient_id = $randomLibrary->randomPluck(NULL, new User, $column, $forCondition);
                        $userDependant->unique_id = $patient_id;
                    }

                    $userDependant->save();
                } elseif(!empty($user_id)) {
                    $user->country_code = trim($data_country_code);
                    $user->mobile_number = trim($data_mobile_number);
                    $user->country_id = $country->id;
                    $user->save();
                    $user->assignRole('pharmacy');
                } else {
                    if($user->hasRole('super_admin') || $user->hasRole('admin')) {
                        return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
                    }
                }
                // $user->roles()->detach();
                // $user->save();
                // $user->assignRole($data_type);
            } else {

                if($dependant_id != "") {
                    //Dependant flow
                    $userDependant = User::with('doctorDocument')->with('userDetail')->find($dependant_id);
                    $userDependant->country_code = trim($data_country_code);
                    $userDependant->mobile_number = trim($data_mobile_number);
                    $userDependant->is_mobile_number_verified = '0';
                    $userDependant->country_id = $country->id;
                    if ($data_type == 'patient') {
                        /** @var string|null $column */
                        $column = 'unique_id';
                        /** @var string $forCondition */
                        $forCondition = 'patient';
                        /** @var string|null $patient_id */
                        $patient_id = $randomLibrary->randomPluck(NULL, new User, $column, $forCondition);
                        $userDependant->unique_id = $patient_id;
                    }
                    $userDependant->save();

                } else {
                    //Normal flow
                    $array['type'] = $data_type;
                    $array['country_code'] = trim($data_country_code);
                    $array['mobile_number'] = trim($data_mobile_number);
                    $array['is_mobile_number_verified'] = '0';
                    $array['country_id'] = $country->id;

                    if ($data_type == 'patient') {
                        /** @var string|null $column */
                        $column = 'unique_id';
                        /** @var string $forCondition */
                        $forCondition = 'patient';
                        /** @var string|null $patient_id */
                        $patient_id = $randomLibrary->randomPluck(NULL, new User, $column, $forCondition);
                        $array['unique_id'] = $patient_id;
                    }
                    $user = User::create($array);

                    $user->assignRole($data_type);

                    if($data_type == 'patient' || $data_type == 'doctor') {
                        $external_user_id = substr(md5(date('Y-m-d H:i:s')), 0, 10);
                        $type = strtoupper("ID_CARD");
                        $application_id = substr(md5(date('Y-m-d H:i:s')), 0, 15);
                        $file_name =Str::random(10);
                        $upload_id =rand(00000, 99999);

                        $sumsub = new Sumsub();
                        $sumsub->user_id = $user->id;
                        $sumsub->application_id = $application_id;
                        $sumsub->type = $type;
                        $sumsub->external_user_id = $external_user_id;
                        $sumsub->file_name = $file_name;
                        $sumsub->upload_id = $upload_id;
                        $sumsub->status = '1';
                        $sumsub->created_by = $user->id;
                        $sumsub->save();
                    }

                    $userSettings = UserSettingsNotification::create(['user_id' => $user->id]);
                }
            }

            //OTP
            $mobile_number = trim('+'.$data_country_code).trim($data_mobile_number);
            $send = $TwilioLibrary->sendOtpSMS($mobile_number);
            if($send!=1) {
                DB::rollback();
                return self::sentResponse(200, [], 'Error - '.$send);
            }
            DB::commit();
            return new UserResource(User::find($user->id), 200);

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

    public function stepMobileVerify(StepMobileVerifyRequest $request, TwilioLibrary $TwilioLibrary) {
        try {
            $validated = $request->validated();
            $mobile_number_verification_code = $request->mobile_number_verification_code;
            $data_mobile_number = $request->mobile_number;
            $data_country_code = $request->country_code;

            /**
            * @var string $mobile_number_verification_code
            * @var string $data_mobile_number
            * @var string $data_country_code
            */

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

            $mobile_number = trim('+'.$request->country_code).trim($data_mobile_number);
            $send = $TwilioLibrary->verifyOtpSMS($mobile_number,$mobile_number_verification_code);
            if($send != 1) {
                DB::rollback();
                return self::sentResponse(200, [], 'Error - '.$send);
            } else {
                $user->is_mobile_number_verified = '1';
                $user->updated_by = $request->user_id;
                $user->save();
                DB::commit();
                $response_array = ["user_id" => $user->id];
                return self::sentResponse(200, $response_array, __('digimed_validation.success_response.mobile_no_verified_success'));
            }

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

    public function stepPasscode(StepPasscodeRequest $request) {
        try {
            $validated = $request->validated();
            $passcode = $request->passcode;
            /** @var string $passcode */
            DB::beginTransaction();
            $user = User::find($request->user_id);
            if(!$user) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
            }
            $user->passcode = Hash::make($passcode);

            if($user->roles[0]->name == "pharmacy_admin") {
                $user->user_completion = Config::get('onboard_lists.for_pharmacy_list.1.id');
            }
            if($user->roles[0]->name == "pharmacy") {
                $user->user_completion = Config::get('onboard_lists.for_pharmacy_list.1.id');
            }

            $user->save();
            DB::commit();
            $response_array = ["user_id" => $user->id];

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

    public function stepEmail(StepEmailRequest $request) {
        try {
            $validated = $request->validated();
            $encryptedEmail = Crypt::encryptString($request->email);

            $user_email_details = User::where('email', $request->email)->first();

            if ($user_email_details) {
                if ($user_email_details->is_email_verified == 0) {
                    // If the user exists but is not verified, resend the verification code
                    DB::beginTransaction();
                    $verification_code = GeneralHelper::generateOtpCode();
                    $user_email_details->email_verification_code = $verification_code;
                    $user_email_details->save();
                    DB::commit();
    
                    // Send verification email again
                    $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_email_details->id];
                    return self::sentResponse(200, $response_array, __('digimed_validation.error_response.not_verified_account'));
                }
                return self::sentResponse(500, [], __('digimed_validation.error_response.same_email_exists'));
            }

            $user = new User();
            $user->email = $request->email;
            $user->type = $request->type;
            $user->password = bcrypt($request->password);
            $user->type = $request->type;
            $user->is_email_verified = '0';
            DB::beginTransaction();
            $verification_code = GeneralHelper::generateOtpCode();
            $user->email_verification_code = $verification_code;
            $user->save();
            DB::commit();
            $users = User::select('id')->where('email', $request->email)->first();
            $roleId = $request->type === 'patient' ? 4 : 3;
            DB::table('model_has_roles')->insert([
                'role_id' => $roleId,
                'model_type' => "App\User",
                'model_id' => $users->id,
            ]);

            $mailBody = [
                'email' => $request->email,
                'body' => [
                    'content' => 'Your email verification code for Genertion Health is: '.$verification_code
                ],
                'subject' => 'Email verification code',
            ];
            dispatch(new SendInvitationJob($mailBody));
            // Mail::to($request->email)->send(new SendInvitation($mailBody));
            $response_array = ["user_id" => $user->id];
            return self::sentResponse(200, $response_array, __('digimed_validation.success_response.verification_sent_your_reg_mail'));
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }


    public function stepEmailVerify(StepEmailVerifyRequest $request)
    {
        try {
            $validated = $request->validated();

            $user = User::find($request->user_id);
            if(!$user) {
                return self::sentResponse(500, [], __('digimed_validation.error_response.incorrect_user'));
            }
            DB::beginTransaction();
            if($user->email_verification_code == $request->email_verification_code) {
                $user->is_email_verified = '1';
                $user->save();
                DB::commit();
                $response_array = ["user_id" => $user->id];
                return self::sentResponse(200, $response_array, __('digimed_validation.success_response.email_verified_success'));
            } else {
                return self::sentResponse(205, [], __('digimed_validation.error_response.invalid_email_verification_code'));
            }

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

    public function twoStepChoose(TwoStepChooseRequest $request, TwilioLibrary $TwilioLibrary) {
        try {
            $successMsg = "";
            $validated = $request->validated();

            $user = User::with('roles')->find($request->user_id);
            if(!$user) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
            }
            DB::beginTransaction();
            if($request->type == 1) {//SMS
                $mobile_number = trim('+'.$user->country_code).trim($user->mobile_number);//OTP
                $send = $TwilioLibrary->sendOtpSMS($mobile_number);
                if($send != 1) {
                    DB::rollback();
                    return self::sentResponse(200, [], 'Error - '.$send);
                }
                $user->two_step_verification_type = $request->type;
                $user->is_two_step_verified = '0';
                $user->is_mobile_number_verified = '0';
                $user->save();
                DB::commit();
                $successMsg = __('digimed_validation.success_response.two_step_sent_success_sms');
            } else if($request->type == 2) {//EMAIL
                $verification_code = mt_rand(100000,999999);
                $user->two_step_verification_type = $request->type;
                $user->is_two_step_verified = '0';
                $user->email_verification_code = $verification_code;
                $user->is_email_verified = '0';
                $user->save();
                DB::commit();

                $mailBody = [
                    'email' => $user->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($user->email)->send(new SendInvitation($mailBody));
                $successMsg = __('digimed_validation.success_response.two_step_sent_success_email');
            }

            $response_array = ["user_id" => $user->id];
            return self::sentResponse(200, $response_array, $successMsg);

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

    public function twoStepVerification(TwoStepVerificationRequest $request, TwilioLibrary $TwilioLibrary)
    {
        try {
            $validated = $request->validated();

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

            if($user->is_two_step_verified == 0) {
                if($user->two_step_verification_type != "") {
                    $successMsg = "";
                    DB::beginTransaction();
                if($user->two_step_verification_type == 1) {//SMS
                    $mobile_number = trim('+'.$user->country_code).trim($user->mobile_number);
                    $data_verification_code = $request->verification_code;
                    /** @var string $data_verification_code */
                    $send = $TwilioLibrary->verifyOtpSMS($mobile_number,$data_verification_code);
                    if($send != 1) {
                        DB::rollback();
                        return self::sentResponse(200, [], 'Error - '.$send);
                    } else {
                        $user->is_mobile_number_verified = '1';
                        $user->is_two_step_Verified = '1';
                        $user->user_completion = Config::get('onboard_lists.for_patient_list.0.id');//User Completion -> Registration Completed.
                        $user->save();
                        DB::commit();
                        $successMsg = __('digimed_validation.success_response.two_step_verify_success_sms');
                    }
                } else if($user->two_step_verification_type == 2) {//EMAIL
                    if($user->email_verification_code == $request->verification_code) {
                        $user->is_email_verified = '1';
                        $user->is_two_step_Verified = '1';
                        $user->user_completion = Config::get('onboard_lists.for_patient_list.0.id');//User Completion -> Registration Completed.
                        $user->save();
                        DB::commit();
                        $successMsg = __('digimed_validation.success_response.two_step_verify_success_email');
                    } else {
                        return self::sentResponse(401, [], __('digimed_validation.error_response.invalid_email_verification_code'));
                    }
                }

                    $response_array = ["user_id" => $user->id];
                    return self::sentResponse(200, $response_array, $successMsg);
                } else {
                    return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
                }
            } else {
                return self::sentResponse(401, [], __('digimed_validation.error_response.already_two_step_verified'));
            }
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function resendOtp(ResendOtpRequest $request, TwilioLibrary $TwilioLibrary) {
    try {
        $successMsg = "";
        $validated = $request->validated();
        $msgtype = $request->message_type;
        DB::beginTransaction();
        $user = User::with('roles')->find($request->user_id);
        if(!$user){
            return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
        }

            if($msgtype == 2) {
                if(empty($user->email)) {
                    return self::sentResponse(401, [], __('digimed_validation.error_response.email_not_available'));
                }
                $verification_code = mt_rand(100000,999999);

                $user->email_verification_code = $verification_code;
                $user->is_email_verified = '0';
                $user->save();
                DB::commit();

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

                $successMsg = __('digimed_validation.success_response.verification_sent_your_reg_mail');

            } else if($msgtype == 1) {//SMS

                $mobile_number = trim('+'.$user->country_code).trim($user->mobile_number);
                $send = $TwilioLibrary->sendOtpSMS($mobile_number);
                if($send != 1) {
                    DB::rollback();
                    return self::sentResponse(200, [], 'Error - '.$send);
                } else {
                    $user->is_mobile_number_verified = '0';
                    $user->save();
                    DB::commit();

                    $successMsg = __('digimed_validation.success_response.verification_sent_your_reg_mbl');
                }
            }

            $response_array = ["user_id" => $user->id];
            return self::sentResponse(200, $response_array, $successMsg);
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function updateUserProfile(UpdateUserProfileRequest $request) {
        try {
            $validated = $request->validated();

            $user = User::with('roles')->find($request->user_id);
            if(!$user) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
            }
            DB::beginTransaction();
            $data_dob = $request->dob;
            /** @var string $data_dob */
            $user->first_name = $request->first_name;
            $user->last_name = $request->last_name;
            $user->gender = $request->gender;
            $user->dob = date('Y-m-d',strtotime(str_replace('/', '-', $data_dob)));
            $user->country_id = $request->country_code;
            $user->country_code = $request->country_code;
            $user->weight = $request->weight;
            $user->height = $request->height;
            $user->smoker = $request->smoker;
            $user->region = $request->region;
            $user->mobile_number = $request->mobile_number;
            $user->status = '2';
            $user->ethnicity = $request->ethnicity;
            $notification = UserSettingsNotification::firstOrNew(['user_id' => $request->user_id]);
            $notification->reminders_email ="1";
            $notification->reminders_inapp = "1";
            $notification->reminders_push = "1";
            $notification->appt_confirm_changes_email = "1";
            $notification->appt_confirm_changes_inapp = "1";
            $notification->appt_confirm_changes_push ="1";
            $notification->updated_by = $request->user_id;
            $notification->save();

            // dd($user);
            /** @var object $user->roles() */

            if($user->is_email_verified ==1){
                $user->save();
            }
            else{
                return self::sentResponse(402, [], __('digimed_validation.error_response.email_not_verified'));
            }
            DB::commit();

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

    public function updateDoctorProfile(UpdateDoctorProfileRequest $request) {
        try {
            $validated = $request->validated();

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

            DB::beginTransaction();

            $data_dob = $request->dob;
            /** @var string $data_dob */
            $user->first_name = $request->first_name;
            $user->last_name = $request->last_name;
            $user->gender = $request->gender;
            $user->dob = date('Y-m-d', strtotime(str_replace('/', '-', $data_dob)));
            $user->country_id = $request->country_code;
            $user->country_code = $request->country_code;
            $user->mobile_number = $request->mobile_number;
            $user->address = $request->address;
            $user->status = '1';
            $user->user_completion = '3';
            // New fields for personal and professional details
            $user->medical_license_number = $request->medical_license_number;
            $user->save();
            $notification = UserSettingsNotification::firstOrNew(['user_id' => $request->user_id]);
            $notification->reminders_email ="1";
            $notification->reminders_inapp = "1";
            $notification->reminders_push = "1";
            $notification->appt_confirm_changes_email = "1";
            $notification->appt_confirm_changes_inapp = "1";
            $notification->appt_confirm_changes_push ="1";
            $notification->updated_by = $request->user_id;
            $notification->save();

            $userdetails = UserDetails::firstOrNew(['user_id' => $request->user_id]);
            $userdetails->medical_council_regno = $request->reg_no;
            $userdetails->created_by = $request->user_id;
            $userdetails->save();
            $lastDetailID = $userdetails->id;

            $data_specilation = $request->specilation;
            /** @var string $data_specilation */
            if ($data_specilation != "") {
                $queryDelete = new UserAreaSpecialisation();
                $querySpecilation = $queryDelete->where('user_detail_id', $lastDetailID);
                if ($querySpecilation->count() > 0) {
                    $querySpecilation->update(['deleted_by' => $request->user_id]);
                    $querySpecilation->delete();
                }
                $areaSpecialisationExplode = explode(',', $data_specilation);
                for ($i = 0; $i < count($areaSpecialisationExplode); $i++) {
                    $query = new UserAreaSpecialisation();
                    $query->user_detail_id = $lastDetailID;
                    $query->area_specialisation_id = $areaSpecialisationExplode[$i];
                    $query->created_by = $request->user_id;
                    $query->save();
                }
            }

            $data_clinic = $request->clinic;
            /** @var string $data_clinic */
            if ($data_clinic != "") {
                $queryDelete = new UserClinic();
                $queryUserClinic = $queryDelete->where('user_detail_id', $lastDetailID);
                if ($queryUserClinic->count() > 0) {
                    $queryUserClinic->update(['deleted_by' => $request->user_id]);
                    $queryUserClinic->delete();
                }

                $clinicExplode = explode(',', $data_clinic);
                for ($i = 0; $i < count($clinicExplode); $i++) {
                    $queryUserClinic = new UserClinic();
                    $queryUserClinic->user_detail_id = $lastDetailID;
                    $queryUserClinic->clinic_id = $clinicExplode[$i];
                    $queryUserClinic->created_by = $request->user_id;
                    $queryUserClinic->save();
                }
            }

            $adminEmail = AdminSettings::select('email_username')->first();
            $emailUsername = $adminEmail ? $adminEmail->email_username : null;
            $mailBody = [
                'email' => $emailUsername,
                'body' => [
                    'content' => 'A new registration request has been submitted by ' . $user->name . '. Please review and approve or reject the request.',
                ],
                'subject' => 'New Registration Request'
            ];
            dispatch(new SendEmailNotificationJob($mailBody));

            DB::commit();

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

    public function reviewDoctor(ReviewDoctorRequest $request)
    {
        $action = $request->action; // 'approve' or 'reject'
        $user_id = $request->user_id;

        // Retrieve the user by ID
        $user = User::find($user_id);

        if (!$user) {
            return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
        }

        try {
            DB::beginTransaction();

            if ($action === 'approve') {
                $user->status = '4'; // Approved status
                $user->email_verification_code = Str::random(32); // Generate a random token
                $user->save();

                // Generate the activation link
                $activationLink = route('user.activate', [
                    'user_id' => $user_id,
                    'email_verification_code' => $user->email_verification_code
                ]);

                // Prepare the email body
                $mailBody = [
                    'email' => $user->email,
                    'body' => [
                        'content' => 'Congratulations, your registration has been approved. Click the following link to activate your account: ' . $activationLink
                    ],
                    'subject' => 'Account Activation'
                ];
                dispatch(new SendEmailNotificationJob($mailBody));
                DB::commit();
                $log_msg = 'Registration approved for user ' . $user->name;
                return self::sentResponse(200, [], __('digimed_validation.success_response.doctor_request_approve_success'));

            } else {
                $user->status = '3'; // Rejected status
                $user->save();

                // Prepare the rejection email body
                $mailBody = [
                    'email' => $user->email,
                    'body' => [
                        'content' => 'Your registration request has been rejected. If you have any questions, please contact support.'
                    ],
                    'subject' => 'Registration Request Rejected'
                ];
                dispatch(new SendEmailNotificationJob($mailBody));
                DB::commit();
                $log_msg = 'Registration rejected for user ' . $user->name;
                return self::sentResponse(200, [], __('digimed_validation.success_response.doctor_request_rejected'));

            }

            DB::commit();

            // Log the action
            GeneralHelper::auditLog($log_msg, 'User', $user_id);

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


    public function activateAccount(ActivateAccountRequest $request)
    {
        // Retrieve the user by ID
        $user_id = $request->user_id;
        $user = User::find($user_id);
        $verification_code = $request->email_verification_code;

        if (!$user) {
            return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
        }

        // Verify the email_verification_code
        if ($user->email_verification_code !== $verification_code) {
            return self::sentResponse(500, [], __('digimed_validation.error_response.invalid_activation_token'));
        }

        // Activate the user
        $user->status = '2'; // or another status indicating active user
        $user->email_verification_code = ''; // Clear the activation token
        $user->save();

        return self::sentResponse(200, [], __('digimed_validation.success_response.account_activated_success'));
    }

    public function updatePharmacyUserProfile(UpdatePharmacyUserProfileRequest $request)
    {
        try {
            $validated = $request->validated();
            $user = User::with('roles')->find($request->user_id);
            if(!$user) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
            }
            $user->first_name = $request->first_name;
            $user->last_name = $request->last_name;

            if($user->roles[0]->name == "pharmacy_admin") {
                $user->user_completion = Config::get('onboard_lists.for_pharmacy_list.2.id');
                $user->status = '1'; //Awaiting admin approval
            }
            if($user->roles[0]->name == "pharmacy") {
                $user->user_completion = Config::get('onboard_lists.for_pharmacy_list.2.id');
                $user->status = '2';
            }
            $user->save();
            return self::sentResponse(200, [], __('digimed_validation.success_response.user_details_store_success'));
        } catch(Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function updatePharmacyProfile(UpdatePharmacyProfileRequest $request,S3Library $S3Library)
    {
        try {
            $validated = $request->validated();
            /** @var string|null $data_logo */
            $data_logo = $request->logo;
            /** @var string|null $user_id */
            $user_id = $request->user_id;

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

            if($user->roles[0]->name == "pharmacy") {
                return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
            }
            DB::beginTransaction();
            $pharmacy = Pharmacy::firstOrNew([
                'created_by' => $user_id,
            ]);

            if($user->roles[0]->name == "pharmacy_admin") {
                $pharmacy->name = $request->pharmacy_name;
                $pharmacy->registration_number = $request->registration_number;
            }

            if (!empty($data_logo)) {
                if($S3Library->is_base64($data_logo)) {  //Base 64
                    $digimedFile = $S3Library->base64($data_logo, $user_id, ['image'], 'digimed/images/pharmacy-logo/');
                    if($digimedFile['code'] == 200) {
                        $pharmacy->logo = $digimedFile['data'];
                    }
                }
            }
            $pharmacy->save();

            $userPharmacy = UserPharmacy::firstOrNew([
                'user_id' => $user_id,
                'pharmacy_id' => $pharmacy->id,
            ]);
            $userPharmacy->save();
            DB::commit();
            return self::sentResponse(200, [], __('digimed_validation.success_response.pharmacy_details_store_success'));
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function updatePharmacyAddress(UpdatePharmacyAddressRequest $request)
    {
        try {
            $validated = $request->validated();
            /** @var string|null $user_id */
            $user_id = $request->user_id;
            $user = User::with('roles')->find($user_id);
            if(!$user) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
            }
            if($user->roles[0]->name == "pharmacy") {
                return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
            }
            DB::beginTransaction();
            $pharmacy = Pharmacy::firstOrNew([
                'created_by' => $user_id,
            ]);
            $pharmacy->address = $request->address;
            $pharmacy->locality_id = $request->locality_id;
            $pharmacy->post_code = $request->post_code;
            $pharmacy->save();

            if($user->roles[0]->name == "pharmacy_admin") {
                $user->user_completion = Config::get('onboard_lists.for_pharmacy_list.3.id');
                $user->save();
            }
            DB::commit();
            return self::sentResponse(200, [], __('digimed_validation.success_response.pharmacy_address_store_success'));
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function verifyPassport(VerifyPassportRequest $request)
    {
        try {
            $validated = $request->validated();
            $user_id = $request->user_id;
            $user = User::find($request->user_id);
            $user_role = $user->type;
            $passport_number = $request->passport_number;
            //update case
            $updateCheck = User::where('id',$user_id)->where('passport_number', $passport_number)->count();
            if(empty($updateCheck)){
                /**
                * @var string $user_role
                * @var string $passport_number
                */
                $checkUser = User::where(function($q) use($user_role,$passport_number){
                    $q->where('type',$user_role);
                    $q->where('passport_number',$passport_number);
                })->count();
                if(!empty($checkUser)) {
                    return self::sentResponse(401, [], __('digimed_validation.error_response.passportno_in_use'));
                }
            }
            return self::sentResponse(200, [], __('digimed_validation.success_response.passportno_available'));
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }
    public function profileImage(ProfileImageRequest $request, S3Library $S3Library)
    {
        try {
            $validated = $request->validated();

            $user = User::find($request->user_id);
            if(!$user) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
            }
            DB::beginTransaction();
            /** @var string|null $data_profile_image */
            $data_profile_image = $request->profile_image;
            /** @var string|null $user_id */
            $user_id = $request->user_id;

            if (!empty($data_profile_image)) {
                /*if(!empty($user->profile_image)) {
                    if (Storage::exists('images/profile-images/' . $user->profile_image)) {
                        Storage::delete('images/profile-images/' . $user->profile_image);
                    }
                }*/

                if($S3Library->is_base64($data_profile_image)) {  //Base 64
                    $digimedFile = $S3Library->base64($data_profile_image, $user_id, ['image'], 'digimed/images/profile-images/');
                    if($digimedFile['code'] == 200) {
                        $user->profile_image = $digimedFile['data'];
                    }
                }

                /*if (preg_match('/data:image\/(.+);base64,(.*)/', $data_profile_image, $matchings)) {
                    $imageData = base64_decode($matchings[2]);
                    $extension = $matchings[1];
                    $file_name = date('YmdHis') . rand(100, 999) . '_' . $request->user_id . '.' . $extension;
                    $path = 'images/profile-images/' . $file_name;
                    Storage::put($path, $imageData);
                    $user->profile_image = $file_name;
                }*/
            }
            $user->biographies = $request->biographies;
            $user->save();
            DB::commit();
            $response_array = ["user_id" => $user->id,"file_path" => $user->profile_image,"biographies" => $user->biographies];
            return self::sentResponse(200, $response_array, __('digimed_validation.success_response.profile_image_stored_success'));
        } catch(Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function doctorDocuments(DoctorDocumentsRequest $request, S3Library $S3Library)
    {
        try {
            $validated = $request->validated();

            $user = User::with('roles')->find($request->user_id);
            if(!$user->hasRole(['doctor'])) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
            }

            DB::beginTransaction();

            $userdetails = UserDetails::firstOrNew(['user_id' => $request->user_id]);
            $userdetails->medical_council_regno = $request->reg_no;
            $userdetails->created_by = $request->user_id;
            $userdetails->save();
            $lastDetailID = $userdetails->id;
            $data_specilation = $request->specilation;
            /** @var string $data_specilation */

            if($data_specilation != "") {
                $queryDelete = new UserAreaSpecialisation();
                $querySpecilation = $queryDelete->where('user_detail_id', $lastDetailID);
                if($querySpecilation->count() > 0) {
                    $querySpecilation->update(['deleted_by' => $request->user_id]);
                    $querySpecilation->delete();
                }
                $areaSpecialisationExplode = explode(',', $data_specilation);
                for ($i=0; $i < count($areaSpecialisationExplode); $i++) {
                    $query = new UserAreaSpecialisation();
                    $query->user_detail_id = $lastDetailID;
                    $query->area_specialisation_id = $areaSpecialisationExplode[$i];
                    $query->created_by = $request->user_id;
                    $query->save();
                }
            }

            $data_clinic = $request->clinic;
            /** @var string $data_clinic */
            if($data_clinic != "") {
                $queryDelete = new UserClinic();
                $queryUserClinic = $queryDelete->where('user_detail_id', $lastDetailID);
                if($queryUserClinic->count() > 0) {
                    $queryUserClinic->update(['deleted_by' => $request->user_id]);
                    $queryUserClinic->delete();
                }

                $clinicExplode = explode(',', $data_clinic);
                for ($i=0; $i < count($clinicExplode); $i++) {
                    $queryUserClinic = new UserClinic();
                    $queryUserClinic->user_detail_id = $lastDetailID;
                    $queryUserClinic->clinic_id = $clinicExplode[$i];
                    $queryUserClinic->created_by = $request->user_id;
                    $queryUserClinic->save();
                }
            }

            $deleteArrFiles = $request->document_delete;
            /** @var string $deleteArrFiles */

            if(!empty($deleteArrFiles)) {   //Delete file before upload
                $decode = json_decode($deleteArrFiles);
                /** @var array $decode */
                if(count($decode) != 0) {
                    $queryDoc = DoctorDocument::where('user_id',$request->user_id)->first();
                    if($queryDoc) {
                        $result = $queryDoc->document;
                        $data_document_url_arr = json_decode($result);
                        $finalArr = [];
                        if (is_array($data_document_url_arr) || is_object($data_document_url_arr)) {
                            foreach ($data_document_url_arr as $key => $value) {
                                /** @var string $value */
                                $baseName = basename($value);

                                if (!in_array($baseName, $decode)) {
                                    array_push($finalArr, $baseName);
                                } else {
                                    if(Config::get('filesystems.default') == "s3") {
                                        Storage::disk('s3')->delete('digimed/images/documents/'.$request->user_id.'/'.$baseName);
                                    } else {
                                        Storage::delete('digimed/images/documents/'.$request->user_id.'/'.$baseName);
                                    }
                                }
                            }
                        }
                        $update = DoctorDocument::where('user_id', $request->user_id)->update(['document' => json_encode($finalArr)]);
                    }
                }
            }

            $file = $request->file('document');
            $document = DoctorDocument::where('user_id',$request->user_id)->first();
            if($document) {
                $documentNew = DoctorDocument::where('user_id',$request->user_id)->first();
                if($documentNew->document != null) {
                    $exsistRecord = json_decode($documentNew->document);
                } else {
                    $exsistRecord = [];
                }
            } else {
                $documentNew = new DoctorDocument();
                $exsistRecord = [];
            }

            $documentNew->user_id = $request->user_id;
            if ($request->hasFile('document')) {
                foreach($file as $key=>$val) {

                    /*$imageData=$file[$key]->getClientOriginalName();
                    $extension=$file[$key]->getClientOriginalExtension();

                    if(Storage::exists('images/documents/'.$request->user_id.'/'.$imageData)) {
                        $fCount = 0;
                        $condition = true;
                        do {
                            $renamedFile = pathinfo($imageData, PATHINFO_FILENAME).'_('.$fCount.').'.$extension;
                            if(Storage::exists('images/documents/'.$request->user_id.'/'.$renamedFile)) {
                                $fCount++;
                                $condition = true;
                            } else {
                                $condition = false;
                                $renamedFile = $renamedFile;
                            }
                        } while ($condition);

                    } else {
                        $renamedFile = $imageData;
                    }

                    if(preg_match("/\.(gif|jpeg|JPEG|jpg|JPG|png|PNG|pdf|docx|doc|DOCX|DOC)$/", $imageData)) {

                        $file_name = $renamedFile;
                        //date('YmdHis') . rand(100, 999) . '_' . $request->user_id . '.' . $extension;
                        $path = 'images/documents/'.$request->user_id.'/';
                        Storage::putFileAs($path, $file[$key], $file_name);
                        @var array $exsistRecord
                        array_push($exsistRecord, $file_name);
                    } else {
                        DB::rollback();
                        return self::sentResponse(200, [], __('digimed_validation.error_response.document_upload_faild_withtype'));
                    }*/

                    $digimedFile = $S3Library->fileUpload(true, 'jpeg|JPEG|jpg|JPG|png|PNG|pdf|docx|doc|DOCX|DOC', true, $file[$key], 'digimed/images/documents/'.$request->user_id.'/');
                    if($digimedFile['code'] == 500) {
                        DB::rollback();
                        return self::sentResponse(500, $digimedFile['data'], $digimedFile['msg']);
                    }

                    if($digimedFile['code'] == 200) {
                        $doctor_document = $digimedFile['data'];
                        /** @var array $exsistRecord */
                        array_push($exsistRecord, $doctor_document);
                    }
                }

                if(!empty($exsistRecord)) {
                    $documentVal = json_encode($exsistRecord);
                } else {
                    $documentVal = NULL;
                }
                $documentNew->document = $documentVal;
            }

            $user = User::find($request->user_id);
            $signatureVal = $user->signature;
            if ($request->hasFile('signature')) {
                $fileSignature = $request->file('signature');
                $digimedFile = $S3Library->fileUpload(true, 'jpeg|JPEG|jpg|JPG|png|PNG|pdf|docx|doc|DOCX|DOC', true, $fileSignature, 'digimed/images/signature/'.$request->user_id.'/');
                if($digimedFile['code'] == 500) {
                    DB::rollback();
                    return self::sentResponse(500, $digimedFile['data'], $digimedFile['msg']);
                }

                if($digimedFile['code'] == 200) {
                    $user->signature = $digimedFile['data'];
                    $user->save();
                    $signatureVal = $digimedFile['data'];
                }

                /*$fileName = $fileSignature->getClientOriginalName();
                $fileExtension = $fileSignature->getClientOriginalExtension();
                if(preg_match("/\.(jpeg|JPEG|jpg|JPG)$/", $fileName)) {
                    if (Storage::exists('images/signature/'.$request->user_id.'/'.$fileName)) {
                        $files = Storage::allFiles('images/signature/'.$request->user_id);
                        Storage::delete($files);
                    }
                    $path = 'images/signature/'.$request->user_id.'/';
                    Storage::putFileAs($path, $fileSignature, $fileName);
                    $user->signature = $fileName;
                    $user->save();
                    $signatureVal = $fileName;
                } else {
                    DB::rollback();
                    return self::sentResponse(500, [], __('digimed_validation.error_response.signature_upload_faild_withtype'));
                }*/
            }
            if (in_array($user->status, [0])) {
                $user->status = '1'; //Awaiting admin approval
                $user->save();
            }

            $documentNew->created_by = $request->user_id;
            $documentNew->save();
            $documentNew->refresh();

            DB::commit();

            $finalResultSet = [];
            $sendData = $documentNew->where('user_id', $user->id)->first();
            $decode = json_decode($sendData->document);
            /** @var array $decode */
            if(!empty(array_filter($decode))) {
                $data_document_url_arr = $decode;
                if (is_array($data_document_url_arr)) {
                    foreach($data_document_url_arr AS $sentVal) {
                        /** @var string $sentVal */
                        $finalResultSet[] = $sentVal;
                    }
                }
            }

            $response_json = ["user_id" => $user->id,"documents" => $finalResultSet,"signature" => $signatureVal];
            return self::sentResponse(200, $response_json, __('digimed_validation.success_response.document_stored_success'));

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

    public function consultationType(ConsultationTypeRequest $request)
    {
        try {
            $validated = $request->validated();

            $user = User::with('roles')->find($request->user_id);
            if(!$user->hasRole(['doctor'])) {
                return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
            }
            DB::beginTransaction();
            $user = User::where('id',$request->user_id)->first();
            $userDetails = UserDetails::where('user_id',$request->user_id)->first();

            $home_visit = 0;
            $on_demand = 0;
            $schedule_appointment = 0;

            if(!empty($request->home_visit)) $home_visit = $request->home_visit;
            if(!empty($request->on_demand)) $on_demand = $request->on_demand;
            if(!empty($request->schedule_appointment)) $schedule_appointment = $request->schedule_appointment;

            if($userDetails) {
                $userDetails->updated_by = $request->user_id;
            } else {
                $userDetails = New UserDetails();
                $userDetails->user_id = $request->user_id;
                $userDetails->created_by = $request->user_id;
                // $userDetails->language_id = 1;
            }

            $userDetails->home_visit = $home_visit;
            $userDetails->on_demand = $on_demand;
            $userDetails->schedule_appointment = $schedule_appointment;
            $userDetails->save();

            if (in_array($user->status, [0])) {
                /*$user->status = '1';*/ //Awaiting admin approval
                $user->save();
            }

            //Notify to admin for doctor registration approval
            // if($user->roles[0]->name == "doctor") {

            // }

            //User Completion -> Doctor Verification.
            // $user->user_completion = Config::get('onboard_lists.for_doctor_list.3.id');
            // $user->save();
            DB::commit();

            $response_json = ["user_id" => $user->id];
            return self::sentResponse(200, $response_json, __('digimed_validation.success_response.consultation_saved_success'));

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

         // Define the API URL
        $url = "https://kyc-api.surepass.io/api/v1/aadhaar-v2/generate-otp";



        // Define the request headers
        $headers = [
            'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY5MzIyMDg4NywianRpIjoiMmMzODIwMTctZGQyZC00ZGVmLWFiZTgtMjYyOTM2Y2QzYmZlIiwidHlwZSI6ImFjY2VzcyIsImlkZW50aXR5IjoiZGV2Lm1lZGF3YXRhckBzdXJlcGFzcy5pbyIsIm5iZiI6MTY5MzIyMDg4NywiZXhwIjoyMDA4NTgwODg3LCJ1c2VyX2NsYWltcyI6eyJzY29wZXMiOlsid2FsbGV0Il19fQ.ubwCDJ8JjATsMhdCvy2HLNCMhcjE6-z3gR0rwBAvoAc',
            'Content-Type: application/json',
        ];

        // Define the request data
        $aadhaar_number = '961560419605';
        $data = [
            'uid' => $aadhaar_number,
         ];

       // dd($data);

        // Initialize cURL session
        $ch = curl_init($url);

        // Set cURL options
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

        // Execute cURL request
        $response = curl_exec($ch);

        // Check for cURL errors
        if (curl_errno($ch)) {
            echo 'cURL Error: ' . curl_error($ch);
        } else {
            // Close cURL session
            curl_close($ch);

            // Process the response
            //var_dump($response);

            // dd($response);



             $response_arr=json_decode($response,true);
             print_r($response_arr); exit;
             if($response_arr=='SUCCESS'){
                 $status=1;
                 $ref_id=$response_arr;
                 $message='Aadhaar OTP send to your registered mobile no.';
                 $other_details='';

             }else{
                 $status=0;
                 $ref_id='';
                 $message=$response_arr;
                 $other_details='';
             }

            //




            // request()->session()->put('ref_id',$ref_id); // this use in below function aadhaar_no_verify_check_otp()

            return response()->json();
        }
    }
}