<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models;
use App\Models\User;
use App\Models\Language;
use Auth;
use App\Services\UserService;
use DB;
use App\Http\Requests\AdminFamilyMemberEditRequest;
use Session;
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as Image;
use Illuminate\Support\Facades\Hash;
use Validator;
use App\Models\Role;
use App\Models\UserProfile;
use Exception;
use App\Services\DefaultServices;
use App\Models\School;
use App\Http\Requests\AdminFamilyMemberAddRequest;
use App\Models\RoleUser;
use App\Models\AssociateSchoolUser;
use Mail;
use App\Mail\FamilyMemberRegistration;
use App\Http\Requests\AdminAdminEditRequest;
use App\Http\Requests\AdminEventOrganizerEditRequest;
use App\Http\Requests\AdminRestaurantOwnerEditRequest;
use App\Http\Requests\AdminSponsorEditRequest;

class AdminUserController extends Controller
{

    protected $userService;
    protected $request;
    protected $defaultServices;    

    public function __construct(UserService $userService, Request $request, DefaultServices $defaultServices)
    {
        $this->userService = $userService;
        $this->request     = $request;
        $this->defaultServices = $defaultServices;        
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show all admins
     */

    public function allAdmins()
    {
        if($this->request->ajax()) {

            $is_active  = $this->request->is_active;
            $filters    = [];

            if($is_active != '') { 
                $filters['is_active']  = $is_active;  
            }
            
            $allData = User::with('userRoles')->whereHas('userRoles', function ($query) {
                        $query->where([
                            ['slug', '=', 'admin'],
                            ['roles.is_active', '=', '1'],                            
                        ]);
                    })
                    ->where($filters);                          

            return datatables($allData)->make(true);
        }

        return view('admin.users.admin-list');
    }

    public function allEventOrganizers()
    {
        if($this->request->ajax()) {

            $is_active  = $this->request->is_active;
            $filters    = [];

            if($is_active != '') { 
                $filters['is_active']  = $is_active;  
            }
            
            $allData = User::with('userRoles')->whereHas('userRoles', function ($query) {
                        $query->where([
                            ['slug', '=', 'event-organizer'],
                            ['roles.is_active', '=', '1'],                            
                        ]);
                    })
                    ->where($filters);                             

            return datatables($allData)->make(true);
        }

        return view('admin.users.event-organizer-list');
    }

    public function allRestaurantOwners()
    {
        if($this->request->ajax()) {

            $is_active  = $this->request->is_active;
            $filters    = [];

            if($is_active != '') { 
                $filters['is_active']  = $is_active;  
            }
            
            $allData = User::with('userRoles')->whereHas('userRoles', function ($query) {
                        $query->where([
                            ['slug', '=', 'restaurant-owner'],
                            ['roles.is_active', '=', '1'],                            
                        ]);
                    })
                    ->where($filters);                             

            return datatables($allData)->make(true);
        }

        return view('admin.users.restaurant-owner-list');
    }    

    public function allFamilyMembers()
    {
        if($this->request->ajax()) {

            $is_active  = $this->request->is_active;
            $filters    = [];

            if($is_active != '') { 
                $filters['is_active']  = $is_active;  
            }
            
            $allData = User::with([
                            'userAssociateSchool.getSchool',
                            'userRoles'
                        ])->whereHas('userRoles', function ($query) {
                            $query->where([
                                ['slug', '=', 'family-member'],
                                ['roles.is_active', '=', '1'],                            
                            ]);
                        })
                        ->where($filters);            

            return datatables($allData)->make(true);
        }

        return view('admin.users.family-member-list');
    }

    public function allSponsors()
    {
        if($this->request->ajax()) {

            $is_active  = $this->request->is_active;
            $filters    = [];

            if($is_active != '') { 
                $filters['is_active']  = $is_active;  
            }
            
            $allData = User::with('userRoles')->whereHas('userRoles', function ($query) {
                        $query->where([
                            ['slug', '=', 'sponsor'],
                            ['roles.is_active', '=', '1'],                            
                        ]);
                    })
                    ->where($filters);                             

            return datatables($allData)->make(true);
        }

        return view('admin.users.sponsor-list');
    }

    public function allRoles()
    {
        if($this->request->ajax()) {            
            $allData = Role::all();                             

            return datatables($allData)->make(true);
        }

        return view('admin.users.role-list');
    }    

    public function changeStatus(Request $request)
    {
        $user_id     = trim($this->request->id);
        $user_status = trim($this->request->is_active)=='active'?"1":"0";
        
        $data['id']        = $user_id;
        $data['is_active'] = $user_status;

        $this->userService->editUser($data, ['id' => $user_id]);
    }

    public function editAdminUser($id)
    {
        $userType = "admin";
        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-edit')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function editEventOrganizerUser($id)
    {
        $userType = "event-organizer";
        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-edit')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function editRestaurantOwnerUser($id)
    {
        $userType = "restaurant-owner";
        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-edit')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function editFamilyMemberUser($id)
    {
        $userType = "family-member";
        $schoolData = School::where(['is_active' => 1])->get()->groupBy('zip'); 
        $schoolData = objectToArray($schoolData);

        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-edit')->with(['recordDetails' => $allData, 'userType' => $userType, 'schoolData' => $schoolData]);
    }

    public function editSponsorUser($id)
    {
        $userType = "sponsor";
        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-edit')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }


    public function updateAdminUser(AdminAdminEditRequest $req)
    {
        $user_id = trim($this->request->id);
        $userType = trim($this->request->userType);    
        
        try {
            $req->validated();
            if ($req->isMethod('post')) {

                $phone = trim($req->phone);
                $country_code = trim($req->country_code);

                $req->request->remove('phone'); 
                $req->request->remove('country_code');

                $phone = preg_replace('/\s+/', '', $phone); // remove all spaces
                $phone = preg_replace('/[-]/', '', $phone); 
                $phone = $country_code.$phone;

                $req->request->add(['phone' => $phone]);
                $req->request->add(['country_code'  => $country_code]);

                $messages = array(
                    'phone.unique' => 'Phone number already exist',                    
                );
                
                $validator = Validator::make($req->all(), [                
                    'phone' => 'unique:users,phone,'.$user_id.',id',                
                ], $messages);

                if($validator->fails()) {
                    return redirect()->back()->withErrors($validator);
                    exit(0);
                }

                $req->request->add(['name' => trim($req->name)]);

                User::where('id', $user_id)
                        ->update([
                            'name' => trim($req->name),
                            'email' => trim($req->email),
                            'country_code' => trim($req->phone)?trim($req->country_code):'',
                            'phone' => (trim($req->phone)!=trim($req->country_code))?trim($req->phone):NULL
                    ]);

                $where = [];                        

                // store profile image
                if($this->request->profile_image)
                {
                    $rootFolderPath = public_path('/storage/images/users/'.$userType);

                    $userProfile = UserProfile::where([                                      
                            'user_id' => $user_id,                    
                        ])
                        ->first();

                    if(objectToArray($userProfile)){
                        
                        $this->defaultServices->unlinkImg($rootFolderPath, $userProfile->profile_image);
                    } 

                    $profile_image = $this->request->file('profile_image');                    
                    $where['profile_image'] = $this->defaultServices->imgUpload($rootFolderPath, $profile_image);
                }

                $where['address']   = trim($req->address);
                $where['zip_code']  = trim($req->zip_code);
                $where['is_active'] = 1;

                $status = UserProfile::updateOrCreate(
                    ['user_id' => $user_id],
                    $where
                );               
                
                if ($status) {                    
                    $req->session()->flash('success-message', 'User updated successfully');
                } else {                    
                    $req->session()->flash('error-message', 'Operation failed! Try again');
                }
            }
            return redirect()->back();
        } catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]); 
        }
    }

    public function updateEventOrganizerUser(AdminEventOrganizerEditRequest $req)
    {
        $user_id = trim($this->request->id);
        $userType = trim($this->request->userType);    
        
        try {
            $req->validated();
            if ($req->isMethod('post')) {

                $phone = trim($req->phone);
                $country_code = trim($req->country_code);

                $req->request->remove('phone'); 
                $req->request->remove('country_code');

                $phone = preg_replace('/\s+/', '', $phone); // remove all spaces
                $phone = preg_replace('/[-]/', '', $phone); 
                $phone = $country_code.$phone;

                $req->request->add(['phone' => $phone]);
                $req->request->add(['country_code'  => $country_code]);

                $messages = array(
                    'phone.unique' => 'Phone number already exist',                    
                );
                
                $validator = Validator::make($req->all(), [                
                    'phone' => 'unique:users,phone,'.$user_id.',id',                
                ], $messages);

                if($validator->fails()) {
                    return redirect()->back()->withErrors($validator);
                    exit(0);
                }

                $req->request->add(['name' => trim($req->name)]);

                User::where('id', $user_id)
                        ->update([
                            'name' => trim($req->name),
                            'email' => trim($req->email),
                            'country_code' => trim($req->phone)?trim($req->country_code):'',
                            'phone' => (trim($req->phone)!=trim($req->country_code))?trim($req->phone):NULL
                    ]);

                $where = [];                        

                // store profile image
                if($this->request->profile_image)
                {
                    $rootFolderPath = public_path('/storage/images/users/'.$userType);

                    $userProfile = UserProfile::where([                                      
                            'user_id' => $user_id,                    
                        ])
                        ->first();

                    if(objectToArray($userProfile)){
                        
                        $this->defaultServices->unlinkImg($rootFolderPath, $userProfile->profile_image);
                    } 

                    $profile_image = $this->request->file('profile_image');                    
                    $where['profile_image'] = $this->defaultServices->imgUpload($rootFolderPath, $profile_image);
                }

                $where['address']   = trim($req->address);
                $where['zip_code']  = trim($req->zip_code);
                $where['is_active'] = 1;

                $status = UserProfile::updateOrCreate(
                    ['user_id' => $user_id],
                    $where
                );               
                
                if ($status) {                    
                    $req->session()->flash('success-message', 'User updated successfully');
                } else {                    
                    $req->session()->flash('error-message', 'Operation failed! Try again');
                }
            }
            return redirect()->back();
        } catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]); 
        }
    }

    public function updateRestaurantOwnerUser(AdminRestaurantOwnerEditRequest $req)
    {
        $user_id = trim($this->request->id);
        $userType = trim($this->request->userType);    
        
        try {
            $req->validated();
            if ($req->isMethod('post')) {

                $phone = trim($req->phone);
                $country_code = trim($req->country_code);

                $req->request->remove('phone'); 
                $req->request->remove('country_code');

                $phone = preg_replace('/\s+/', '', $phone); // remove all spaces
                $phone = preg_replace('/[-]/', '', $phone); 
                $phone = $country_code.$phone;

                $req->request->add(['phone' => $phone]);
                $req->request->add(['country_code'  => $country_code]);

                $messages = array(
                    'phone.unique' => 'Phone number already exist',                    
                );
                
                $validator = Validator::make($req->all(), [                
                    'phone' => 'unique:users,phone,'.$user_id.',id',                
                ], $messages);

                if($validator->fails()) {
                    return redirect()->back()->withErrors($validator);
                    exit(0);
                }

                $req->request->add(['name' => trim($req->name)]);

                User::where('id', $user_id)
                        ->update([
                            'name' => trim($req->name),
                            'email' => trim($req->email),
                            'country_code' => trim($req->phone)?trim($req->country_code):'',
                            'phone' => (trim($req->phone)!=trim($req->country_code))?trim($req->phone):NULL
                    ]);

                $where = [];                        

                // store profile image
                if($this->request->profile_image)
                {
                    $rootFolderPath = public_path('/storage/images/users/'.$userType);

                    $userProfile = UserProfile::where([                                      
                            'user_id' => $user_id,                    
                        ])
                        ->first();

                    if(objectToArray($userProfile)){
                        
                        $this->defaultServices->unlinkImg($rootFolderPath, $userProfile->profile_image);
                    } 

                    $profile_image = $this->request->file('profile_image');                    
                    $where['profile_image'] = $this->defaultServices->imgUpload($rootFolderPath, $profile_image);
                }

                $where['address']   = trim($req->address);
                $where['zip_code']  = trim($req->zip_code);
                $where['is_active'] = 1;

                $status = UserProfile::updateOrCreate(
                    ['user_id' => $user_id],
                    $where
                );               
                
                if ($status) {                    
                    $req->session()->flash('success-message', 'User updated successfully');
                } else {                    
                    $req->session()->flash('error-message', 'Operation failed! Try again');
                }
            }
            return redirect()->back();
        } catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]); 
        }
    }

    public function updateFamilyMemberUser(AdminFamilyMemberEditRequest $req)
    {
        $user_id = trim($this->request->id);
        $userType = trim($this->request->userType);    
        
        try {
            $req->validated();
            if ($req->isMethod('post')) {

                $phone = trim($req->phone);
                $country_code = trim($req->country_code);

                $req->request->remove('phone'); 
                $req->request->remove('country_code');

                $phone = preg_replace('/\s+/', '', $phone); // remove all spaces
                $phone = preg_replace('/[-]/', '', $phone); 
                $phone = $country_code.$phone;

                $req->request->add(['phone' => $phone]);
                $req->request->add(['country_code'  => $country_code]);

                $messages = array(
                    'phone.unique' => 'Phone number already exist',                    
                );
                
                $validator = Validator::make($req->all(), [                
                    'phone' => 'unique:users,phone,'.$user_id.',id',                
                ], $messages);

                if($validator->fails()) {
                    return redirect()->back()->withErrors($validator);
                    exit(0);
                }

                $req->request->add(['name' => trim($req->name)]);

                User::where('id', $user_id)
                        ->update([
                            'name' => trim($req->name),
                            'email' => trim($req->email),
                            'country_code' => trim($req->phone)?trim($req->country_code):'',
                            'phone' => (trim($req->phone)!=trim($req->country_code))?trim($req->phone):NULL
                    ]);

                $where = [];                        

                // store profile image
                if($this->request->profile_image)
                {
                    $rootFolderPath = public_path('/storage/images/users/'.$userType);

                    $userProfile = UserProfile::where([                                      
                            'user_id' => $user_id,                    
                        ])
                        ->first();

                    if(objectToArray($userProfile)){
                        
                        $this->defaultServices->unlinkImg($rootFolderPath, $userProfile->profile_image);
                    } 

                    $profile_image = $this->request->file('profile_image');                    
                    $where['profile_image'] = $this->defaultServices->imgUpload($rootFolderPath, $profile_image);
                }

                $where['address']   = trim($req->address);
                $where['zip_code']  = trim($req->zip_code);
                $where['is_active'] = 1;

                $status = UserProfile::updateOrCreate(
                    ['user_id' => $user_id],
                    $where
                );

                if(trim($req->school)){
                    $school_user['user_id']   = $user_id;
                    $school_user['school_id'] = trim($req->school);
                    $school_user['is_active'] = 1;

                    $status = AssociateSchoolUser::updateOrCreate(
                        ['user_id' => $user_id],
                        $school_user
                    );
                }                
                
                if ($status) {                    
                    $req->session()->flash('success-message', 'User updated successfully');
                } else {                    
                    $req->session()->flash('error-message', 'Operation failed! Try again');
                }
            }
            return redirect()->back();
        } catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]); 
        }
    }

    public function updateSponsorUser(AdminSponsorEditRequest $req)
    {
        $user_id = trim($this->request->id);
        $userType = trim($this->request->userType);    
        
        try {
            $req->validated();
            if ($req->isMethod('post')) {

                $phone = trim($req->phone);
                $country_code = trim($req->country_code);

                $req->request->remove('phone'); 
                $req->request->remove('country_code');

                $phone = preg_replace('/\s+/', '', $phone); // remove all spaces
                $phone = preg_replace('/[-]/', '', $phone); 
                $phone = $country_code.$phone;

                $req->request->add(['phone' => $phone]);
                $req->request->add(['country_code'  => $country_code]);

                $messages = array(
                    'phone.unique' => 'Phone number already exist',                    
                );
                
                $validator = Validator::make($req->all(), [                
                    'phone' => 'unique:users,phone,'.$user_id.',id',                
                ], $messages);

                if($validator->fails()) {
                    return redirect()->back()->withErrors($validator);
                    exit(0);
                }

                $req->request->add(['name' => trim($req->name)]);

                User::where('id', $user_id)
                        ->update([
                            'name' => trim($req->name),
                            'email' => trim($req->email),
                            'country_code' => trim($req->phone)?trim($req->country_code):'',
                            'phone' => (trim($req->phone)!=trim($req->country_code))?trim($req->phone):NULL
                    ]);

                $where = [];                        

                // store profile image
                if($this->request->profile_image)
                {
                    $rootFolderPath = public_path('/storage/images/users/'.$userType);

                    $userProfile = UserProfile::where([                                      
                            'user_id' => $user_id,                    
                        ])
                        ->first();

                    if(objectToArray($userProfile)){
                        
                        $this->defaultServices->unlinkImg($rootFolderPath, $userProfile->profile_image);
                    } 

                    $profile_image = $this->request->file('profile_image');                    
                    $where['profile_image'] = $this->defaultServices->imgUpload($rootFolderPath, $profile_image);
                }

                $where['address']   = trim($req->address);
                $where['zip_code']  = trim($req->zip_code);
                $where['is_active'] = 1;

                $status = UserProfile::updateOrCreate(
                    ['user_id' => $user_id],
                    $where
                );               
                
                if ($status) {                    
                    $req->session()->flash('success-message', 'User updated successfully');
                } else {                    
                    $req->session()->flash('error-message', 'Operation failed! Try again');
                }
            }
            return redirect()->back();
        } catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]); 
        }
    }

    public function showAdminUser($id)
    {
        $userType = "admin";

        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-show')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function showEventOrganizerUser($id)
    {
        $userType = "event-organizer";

        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-show')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function showRestaurantOwnerUser($id)
    {
        $userType = "restaurant-owner";

        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-show')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }
    
    public function showFamilyMemberUser($id)
    {
        $userType = "family-member";

        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-show')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function showSponsorUser($id)
    {
        $userType = "sponsor";

        $allData = User::with([
                    'userRoles',
                    'userAssociateSchool.getSchool',
                    'userProfile' => function($query) {
                        $query->where([                    
                            ['is_active', '=', '1'],
                        ]);
                    }])
                    ->where([                    
                        ['id', '=', $id],
                    ])                    
                    ->first()->toArray();
        
        return view('admin.users.'.$userType.'-show')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function add($userType)
    {
        $allData = School::where(['is_active' => 1])->get()->groupBy('zip');
        $allData = objectToArray($allData);

        return view('admin.users.add')->with(['recordDetails' => $allData, 'userType' => $userType]);
    }

    public function save($userType, AdminFamilyMemberAddRequest $req)
    {
        $status = 0;

        try {
            $req->validated();
            if ($req->isMethod('post')) {

                $phone = trim($req->phone);
                $country_code = trim($req->country_code);

                $req->request->remove('phone'); 
                $req->request->remove('country_code');

                $phone = preg_replace('/\s+/', '', $phone); // remove all spaces
                $phone = preg_replace('/[-]/', '', $phone); 
                $phone = $country_code.$phone;

                $req->request->add(['phone' => $phone]);
                $req->request->add(['country_code'  => $country_code]);

                $messages = array(
                    'phone.unique' => 'Phone number already exist',                    
                );
                
                $validator = Validator::make($req->all(), [                
                    'phone' => 'unique:users',                
                ], $messages);

                if($validator->fails()) {
                    return redirect()->back()->withErrors($validator);
                    exit(0);
                }

                $req->request->add(['name' => trim($req->name)]);

                $password = generate_password();

                $user_data['name'] = trim($req->name);
                $user_data['email'] = trim($req->email);
                $user_data['country_code'] = trim($req->country_code);
                $user_data['phone'] = (trim($req->phone)!=trim($req->country_code))?trim($req->phone):NULL;
                $user_data['password'] = bcrypt($password);
                $user_data['name'] = trim($req->name);
                $user_data['is_active'] = 1;

                $user = User::create($user_data);
                $user = objectToArray($user);
                $status = 1;

                $user_profile_data = [];

                if(trim($req->address)) {
                    $user_profile_data['address'] = trim($req->address);
                }

                if(trim($req->zip_code)) {
                    $user_profile_data['zip_code'] = trim($req->zip_code);
                }

                // store profile image
                if($this->request->profile_image) {
                    $rootFolderPath = public_path('/storage/images/users/'.$userType);
                    $profile_image = $this->request->file('profile_image');                    
                    $user_profile_data['profile_image'] = $this->defaultServices->imgUpload($rootFolderPath, $profile_image);
                }

                if($user_profile_data) {
                    $user_profile_data['user_id'] = $user['id'];
                    $user_profile_data['is_active'] = 1;

                    UserProfile::create($user_profile_data);
                }

                if($user){
                    $role_user['user_id'] = $user['id']; 
                    $role = Role::select('id')->where(['slug' => $userType])->first();                   
                    $role_user['role_id'] = $role->id??'';

                    RoleUser::create($role_user);

                    $school_user['user_id'] = $user['id'];
                    $school_user['school_id'] = trim($req->school);

                    AssociateSchoolUser::create($school_user);
                }

                if($user){
                    $to = $user['email'];

                    $mail_body = new \stdClass();
                    $mail_body->subject = "Registration";
                    $mail_body->name = $user['name'];
                    $mail_body->email = $user['email'];
                    $mail_body->password = $password;

                    $email_content = Mail::to($to)->send(new FamilyMemberRegistration($mail_body));
                }

                if ($status) {                    
                    $req->session()->flash('success-message', 'User updated successfully');
                } else {                    
                    $req->session()->flash('error-message', 'Operation failed! Try again');
                }

                return redirect()->back();
            }
        } catch (Exception $ex) {
            return redirect()->back()->withErrors(['error-messsage' => [$ex->getMessage()]]); 
        }
    }

    public function deleteUser(Request $request)
    {
        $user_id = trim($this->request->id);        
        $data['is_delete'] = 1;
        $data['is_active'] = 0;

        $this->userService->editUser($data, ['id' => $user_id]);

        echo 1;
    }

    public function addProvider()
    {
        $languages = Language::all();
        return view('admin.users.addProvider')->with(['languages' => $languages]);
    }

    public function saveProvider(AdminUserAddProviderRequest $req)
    {
        try {
            $req->validated();
            if ($req->isMethod('post')) {

                $data['first_name'] = trim($req->firstname);
                $data['last_name']  = trim($req->lastname);
                $data['name']       = $data['first_name'].' '.$data['last_name'];
                $data['email']      = trim($req->email);                
                $data['phone']      = trim($req->phone);
                $data['role_id']    = 3;
                $data['password']   = Hash::make('provider12345678');
                $data['email_verified_at'] = date("Y-m-d H:i:s");
                $data['phone_verified_at'] = date("Y-m-d H:i:s");

                $id = $this->userService->saveUser($data);

                $userProfileDetails = $this->userService->getSingleUser($id);

                unset($data);

                $data['user_id']     = $id;                
                $data['language_id'] = $req->language;                
                                
                $status = $this->userService->addUserProfile($data);               
                
                if ($status) {
                    $req->session()->flash('success-message', 'Service Provider added successfully');
                } else {
                    $req->session()->flash('error-message', 'Operation failed! Try again');
                }
            }
            return redirect('admin/users-list/provider');
        } catch (Exception $ex) {
            Session::flash('error-messsage', $ex->getMessage());
        }finally {
            return redirect('admin/users-list/provider');
        }
    }
}
