<?php

namespace App\Http\Controllers\API\v2\Employee\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\RoleUser;
use App\Models\Role;
use App\Models\Company;
use App\Models\UserProfile;
use App\Models\UserDeviceToken;
use App\Models\EmployeeSetting;
use App\Models\CompanyEmployee;
use App\Models\CompanyLocation;
use App\Models\CompanyEmployeeLocation;
use Validator;
use DB, Hash, Mail;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Illuminate\Support\Str;
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as Image;
use Exception;
use App\Traits\ApiResponseTrait;
use App\Traits\CommonTrait;
use App\Traits\ApiEmployeeTrait;
use App\Services\DefaultServices;

class AuthController extends Controller
{
    use ApiResponseTrait, CommonTrait, ApiEmployeeTrait;

    protected $defaultServices;

    public function __construct(DefaultServices $defaultServices)
    {
        $this->defaultServices = $defaultServices;
    }

    public function login($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';

        try
        {
            $messages = [
                'user_email.required' => 'Please enter email',
                'user_email.email' => 'Incorrect email format',
                'user_password.required' => 'Please enter password',
                'user_password.min' => 'Password must be at least 6 characters',
                // 'user_password.regex' => 'Password must contains number and alphabets',
                'device_type.required' => 'Please enter device type',
            ];

            $validator = Validator::make($inputs, [
                'user_email' => 'required|email',
                "device_type" => 'required|in:ios,ioS,iOS,Android,android',
                'user_password' =>  [
                                        'required', 'string', //'min:6',
                                        //'regex:/[a-z]/',    // must contain at least one lowercase letter
                                        //'regex:/[A-Z]/',    // must contain at least one uppercase letter
                                        //'regex:/[0-9]/',    // must contain at least one digit
                                        //'regex:/[@$!%*#?&]/', // must contain a special character
                                    ],                
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $extraParam);
                exit(0);
            }

            $userDetails = User::with('userRoles')
                        ->whereHas('userRoles', function ($query) use($userType) {
                            $query->where([
                                ['roles.is_active', '=', '1'],
                            ]);
                        })
                        ->where('email', $inputs['user_email'])
                        ->first();

            if(empty(objectToArray($userDetails))) {
                return $this->sendEmployeeResponse($status_code, $success, 'Email doesn\'t exist', 200, $messageArr, $extraParam);
                exit(0);
            }

            if(objectToArray($userDetails)) {
                if($userDetails->userRoles->first()->slug != $userType) {
                    return $this->sendEmployeeResponse($status_code, $success, 'You are not Employee', 200, $messageArr, $extraParam);
                    exit(0);
                }
            }

            if (!Hash::check($inputs['user_password'], $userDetails->password)) {
                return $this->sendEmployeeResponse($status_code, $success, 'Email or password is wrong', 200, $messageArr, $extraParam);
                exit(0);
            }

            if($userDetails->is_active != 1)
            {
                return $this->sendEmployeeResponse($status_code, $success, 'You are in inactive mode, please contact to admin', 200, $messageArr, $extraParam);
                exit(0);
            }

            // use it as default code - start
            $employeeDataArr = $this->checkEmployeeValidation($userDetails);

            if($employeeDataArr['status'] != 1) {
                return $this->sendEmployeeResponse($status_code, $success, $employeeDataArr['message'], 200, $messageArr, $extraParam);
                exit(0);
            }
            // use it as default code - end

            if(empty($userDetails->email_verified_at) || is_null($userDetails->email_verified_at)) {
                $userDetails->email_verified_at = date("Y-m-d H:i:s");
                $userDetails->save();
            }

            $tokenDetails = $userDetails->createToken('authToken')->accessToken;
            $this->device_token($inputs, $userType, $userDetails->id, 1);

            $user_image_url ='';

            if($userDetails->userProfile->image) {
                $rootFolderPath = url('/storage/images/user/api');
                $user_image_url = $rootFolderPath.'/'.$userDetails->userProfile->image;
            }

            $status_code = 1;
            $success['user_id'] = $userDetails->id??''; 
            $success['user_name'] = $userDetails->name??''; 
            $success['user_email'] = $userDetails->email??'';
            $success['access_token'] = $tokenDetails??'';
            $success['user_img']    = $user_image_url??'';
            $success['company_name'] = $userDetails->getEmployeeCompany->first()->company_name ??'';
            $success['gender']      = $userDetails->userProfile->gender??'';
            $success['about_me']      = $userDetails->userProfile->about_me??'';
            $success['postal_code']   = $userDetails->userProfile->postal_code??'';
            $success['age_range']      = $userDetails->userProfile->age??'';
            $success['isPushEnabled']  = false;

            //$this->defaultController->setUserTimezone($userDetails->id, $inputs);

            return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam);

        } catch (Exception $e) {
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function logout($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';

        try 
        {
            $messages = [                
                'device_type.required' => 'Please enter device type'               
            ];

            $validator = Validator::make($inputs, [
                "device_type" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $extraParam);
                exit(0);
            }

            $status_code = 1;
            $tokenDetails = Auth::user()->token();
            Auth::user()->token()->revoke();
            Auth::user()->token()->delete();
            
            $this->device_token($inputs, $userType, $tokenDetails->user_id, 0);

            return $this->sendEmployeeResponse($status_code, $success, "Logout Successfully", 200, $messageArr, $extraParam);

        } catch (Exception $e) {         
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function editProfile($flag, Request $request)
    {
        
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';
        $inputs['user_image'] = $request->file('user_image');
        

        try 
        {
            $messages = [                
                'postal_code.required' => 'Please enter your postal code',
                'user_image.mimes'     => 'Please enter a image type of jpeg/jpg/png'           
            ];

            $validator = Validator::make($inputs,[
                "postal_code" => 'required',
                'user_image' => 'nullable|mimes:jpeg,png,jpg'
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $extraParam);
                exit(0);
            }

            $userDetails = Auth::user();
            //$extraParam['user_id'] = $userDetails->id;


            if(empty(objectToArray($userDetails))) {
                return $this->sendEmployeeResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $extraParam);
                exit(0);
            }

            // use it as default code - start
            $employeeDataArr = $this->checkEmployeeValidation();

            if($employeeDataArr['status'] != 1) {
                return $this->sendEmployeeResponse($status_code, $success, $employeeDataArr['message'], 200, $messageArr, $extraParam);
                exit(0);
            }
            // use it as default code - end

            $userProfile = [];
            $userProfile['is_active'] = 1;
            
            $userDetails->userProfile->about_me = $inputs['about_me'] ?? NULL;
            $userDetails->userProfile->age = $inputs['age'] ?? NULL;
            $userDetails->userProfile->gender = $inputs['gender'] ?? NULL;
            $userDetails->userProfile->postal_code = $inputs['postal_code'] ?? NULL;
           

            if(isset($inputs['time_zone']) && $inputs['time_zone']) {
                $userDetails->userProfile->time_zone = $inputs['time_zone'];
            }
            

            // store image
            if($request->file('user_image')) {
                $rootFolderPath = public_path('/storage/images/user');

                if($userDetails->userProfile->image){
                    $this->defaultServices->unlinkImg($rootFolderPath, $userDetails->userProfile->image);
                }

                $user_image = $request->file('user_image');
                $userDetails->userProfile->image = $this->defaultServices->imgUpload($rootFolderPath, $user_image);  
                
            }

            $userDetails->userProfile->save();

            $status_code = 1;            
            $this->device_token($inputs, $userType, $userDetails->id, 1);

            $user_image_url ='';

            if($userDetails->userProfile->image) {
                $rootFolderPath = url('/storage/images/user/api');
                $user_image_url = $rootFolderPath.'/'.$userDetails->userProfile->image;
            }
            
            $success['user_id'] = $userDetails->id??''; 
            $success['user_name'] = $userDetails->name??''; 
            $success['user_email'] = $userDetails->email??'';
            $success['access_token'] = $tokenDetails??'';
            $success['user_img']    = $user_image_url??'';
            $success['company_name'] = $userDetails->getEmployeeCompany->first()->company_name ??'';
            $success['gender']      = $userDetails->userProfile->gender??'';
            $success['about_me']      = $userDetails->userProfile->about_me??'';
            $success['postal_code']   = $userDetails->userProfile->postal_code??'';
            $success['age_range']      = $userDetails->userProfile->age??'';
            $success['isPushEnabled']  = false;
            //$success['access_token'] = $request->bearerToken();

            return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam);

        } catch (Exception $e) {         
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function forgetPassword($flag, Request $request){
        //dd("Hello");
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';
        

        try 
        {
            $messages = [                
                'email_id.required' => 'Please enter your email id'         
            ];

            $validator = Validator::make($inputs,[
                "email_id" => 'required'
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $extraParam);
                exit(0);
            }

            $userDetails = User::where('email',$inputs['email_id'])->first();

            if(empty(objectToArray($userDetails))) {
                return $this->sendEmployeeResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $extraParam);
                exit(0);
            }


            $link = url('/'.'employee-reset-password').'/'.encript_decript_data($userDetails->id, 'encript', 2).'/'.time();
            
            $to_email = $userDetails->email;
            $to_name  = $userDetails->name;
            $subject = 'Reset Password';

            $mail_data = array(
                'verification_link' => $link,
                'to_email'          => $to_email
            );
            $status_code = 1;
            $send_verification_mail = send_verfication_mail($mail_data, $to_email, $to_name, $subject);
            $success['message'] = "Please Check your email to get reset password link";

           return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam);

        } catch (Exception $e) {         
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function getProfile($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';
       
        try 
        {
            $userDetails = Auth::user();
            //$extraParam['user_id'] = $userDetails->id;

            // use it as default code - start
            $employeeDataArr = $this->checkEmployeeValidation();

            if($employeeDataArr['status'] != 1) {
                return $this->sendEmployeeResponse($status_code, $success, $employeeDataArr['message'], 200, $messageArr, $extraParam);
                exit(0);
            }
            // use it as default code - end

            $status_code = 1; 
            $user_image_url ='';

            if($userDetails->userProfile->image) {
                $rootFolderPath = url('/storage/images/user/api');
                $user_image_url = $rootFolderPath.'/'.$userDetails->userProfile->image;
            }
            $success['user_id']     = $userDetails->id??''; 
            $success['user_name']    = $userDetails->name??''; 
            $success['user_email']   = $userDetails->email??'';
            $success['access_token'] = $tokenDetails??'';
            $success['user_img']    = $user_image_url??'';
            $success['company_name'] = $userDetails->getEmployeeCompany->first()->company_name ??'';
            $success['gender']      = $userDetails->userProfile->gender??'';
            $success['about_me']      = $userDetails->userProfile->about_me??'';
            $success['postal_code']   = $userDetails->userProfile->postal_code??'';
            $success['age_range']      = $userDetails->userProfile->age??'';
            $success['isPushEnabled']  = false;
            //$success['access_token'] = $request->bearerToken();

            return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam);

        } catch (Exception $e) {         
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function deactivateAccount($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';

        try
        {
            $userDetails = Auth::user();
            $userDetails->is_active = 0;
            $userDetails->save();

            $status_code = 1;
            Auth::user()->token()->revoke();
            Auth::user()->token()->delete();
            
            $this->device_token($inputs, $userType, $userDetails->id, 0);

            return $this->sendEmployeeResponse($status_code, $success, 'Acount deactivated successfully', 200, $messageArr, $extraParam);

        } catch (Exception $e) {
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function employeeSetting($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';

        try
        {
            $messages = [
                'isPushEnabled.required' => 'Please select push',
            ];

            $validator = Validator::make($inputs, [
                "isPushEnabled" => "required|in:0,1,true,false,'true','false'",
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $extraParam);
                exit(0);
            }

            // use it as default code - start
            $employeeDataArr = $this->checkEmployeeValidation();

            if($employeeDataArr['status'] != 1) {
                return $this->sendEmployeeResponse($status_code, $success, $employeeDataArr['message'], 200, $messageArr, $extraParam);
                exit(0);
            }
            // use it as default code - end                   
            if(in_array($request->isPushEnabled, ['true',"true"] ) ){              
                $request->isPushEnabled = 1;
            }
            else
            {               
                $request->isPushEnabled = 0;
            }

            $userDetails = Auth::user();

            $settingArr['user_id'] = $userDetails->id;

            $setting = EmployeeSetting::firstOrNew($settingArr);
            $setting->is_push = $request->isPushEnabled;           
            $setting->save();

            $status_code = 1;
            $success['isPushEnabled'] = boolval($setting->is_push);

            return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam);
        } catch (Exception $e) {
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function changePassword($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';

        try 
        {
            // use it as default code - start
            $employeeDataArr = $this->checkEmployeeValidation();

            if($employeeDataArr['status'] != 1) {
                return $this->sendEmployeeResponse($status_code, $success, $employeeDataArr['message'], 200, $messageArr, $extraParam);
                exit(0);
            }
            // use it as default code - end

            $messages = [
                'current_password.required' => 'Please enter current password',
                'new_password.required' => 'Please enter new password',
                'new_password.min' => 'Minimum six characters required',
                // 'new_password.regex' => 'Your Password must contain at least one lowercase letter, at least one uppercase letter and at least one digit',
            ];

            $validator = Validator::make($inputs,[
                "current_password" => 'required',
                'new_password' =>  [
                                'required', 'string', 'min:6',
                                // 'regex:/[a-z]/',    // must contain at least one lowercase letter
                                // 'regex:/[A-Z]/',    // must contain at least one uppercase letter
                                // 'regex:/[0-9]/',    // must contain at least one digit
                                //'regex:/[@$!%*#?&]/', // must contain a special character
                            ]
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $extraParam);
                exit(0);
            }

            $userDetails = Auth::user();

            if(!Hash::check(trim($inputs['current_password']), $userDetails->password)) {
                return $this->sendEmployeeResponse($status_code, $success, 'Incorrect current password', 200, $messageArr, $extraParam);
            }

            $status_code = 1;
            $userDetails->password = Hash::make($inputs['new_password']);
            $userDetails->save();

            return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam);

        } catch (Exception $e) {
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    // old codes **********************************
    public function resendLink($flag, Request $request)
    {
        $status_code = 0;
        $success = [];                    
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'event-organizer';

        try 
        {
            $messages = [
                'user_email.required' => 'Please enter email',
                'user_email.email' => 'Incorrect email format',
                'device_type.required' => 'Please enter device type'               
            ];

            $validator = Validator::make($inputs,[
                'user_email' => 'required|email',
                "device_type" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr);
                exit(0);
            }

            $user = User::with('userRoles')->whereHas('userRoles', function ($query) {
                        $query->where([                            
                            ['roles.is_active', '=', '1'],                            
                        ]);
                    })
                    ->where('users.email', $inputs['user_email'])
                    ->first();

            if(empty(objectToArray($user))) {
                return $this->sendEmployeeResponse($status_code, $success, 'Email doesn\'t exist', 200, $messageArr);
                exit(0);
            }

            if($user){
                $status_code = 1;
                
                $to = $user->email;
                $mail_body = new \stdClass();
                $mail_body->subject = "Event Organizer Registration";
                $mail_body->name = $user->name;
                $mail_body->email = $user->email;
                $mail_body->link = url('/emailverify/eo/app/'.strtolower($inputs['device_type']).'/'.encript_decript_data( $user->id, 'encript', 5 )."/".strtotime(Carbon::now()->addMinutes(60)));

                $email_content = Mail::to($to)->send(new ApiUserEmailVerification($mail_body));
            }

            return $this->sendEmployeeResponse($status_code, $success, 'Email verification link is sent to your registered email id. Please click on the link to verify your email.', 200, $messageArr);

        } catch (Exception $e) { 
            $messageArr = [];           
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr);
        }
    }

    public function updateTimezone($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'event-organizer';

        try 
        {
            $tokenDetails = Auth::user()->token();
            $additionalArr['user_id'] = $user_id = $tokenDetails->user_id;

            $messages = [                
                'timeZone.required' => 'Please provide timezone',
                'device_type.required' => 'Please enter device type'               
            ];

            $validator = Validator::make($inputs,[
                'timeZone' => 'required',
                "device_type" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $additionalArr);
                exit(0);
            }

            $this->defaultController->setUserTimezone($user_id, $inputs);
            $status_code = 1;
                
            return $this->sendEmployeeResponse($status_code, $success, 'Success', 200, $messageArr, $additionalArr);

        } catch (Exception $e) {         
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function registration($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';

        try
        {
            $messages = [
                'user_name.required' => 'Please enter user name',
                'user_email.required' => 'Please enter email',
                'user_email.email' => 'Incorrect email format',
                'user_contact.required' => 'Please enter contact number',
                // 'user_address.required' => 'Please enter address',
                // 'company_id.required' => 'Please select company',
                'user_password.required' => 'Please enter password',
                // 'device_token.required' => 'Please enter device token',
                'user_password.min' => 'Password must be at least 6 characters',
                'device_type.required' => 'Please enter device type',
            ];

            $validator = Validator::make($inputs, [
                'user_name' => 'required',
                'user_contact' => 'required',
                // 'user_address' => 'required',
                // 'company_id' => 'required',
                'user_email' => 'required|email',
                "device_type" => 'required|in:ios,ioS,iOS,Android,android',
                // "device_token" => 'required',
                'user_password' =>  ['required', 'string', //'min:6',
                                    ],                
            ], $messages);

            $userexist = User::where('email', trim($request->user_email))->first();
            $messageArray = 'email already exist';
            if($userexist){
                return $this->sendEmployeeResponse($status_code, $success, 'email already exist', 200, $messageArray, $extraParam);
                exit(0);
            }

            if($validator->fails()) {
                return $this->sendEmployeeResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $extraParam);
                exit(0);
            }

            $employeeArr['name']       = trim($request->user_name) ?: NULL;
            $employeeArr['email']      = trim($request->user_email) ?: NULL;
            $employeeArr['password']   = Hash::make($request->user_password);
            
            $employeeDetails = User::create($employeeArr);

            $company_id = 2;

            // company admin role
            RoleUser::create(['user_id' => $employeeDetails->id, 'role_id' => 4]);

            CompanyEmployee::create(['user_id' => $employeeDetails->id, 'company_id' => $company_id]);

            $employeeProfileArr['user_id'] = $employeeDetails->id;
            UserProfile::create($employeeProfileArr);

            $messageArray = 'Company location not found';
            $companyLacation = CompanyLocation::where('company_id', $company_id)->where('is_delete', 0)->first();
            // dd($companyLacation);

            if($companyLacation){
                $employee_location['company_id'] = $company_id;
                $employee_location['user_id'] = $employeeDetails->id;
                $employee_location['location_id'] = $companyLacation->id;
                $employee_location['active_location'] = $companyLacation->is_active;
                $employee_location['created_at'] = date('Y-m-d H:i:s');
                $employee_location['updated_at'] = date('Y-m-d H:i:s');
               // dd($employee_location);

                $employee_location_insert = CompanyEmployeeLocation::insert($employee_location);
            }else{
                return $this->sendEmployeeResponse($status_code, $success, 'Company location not found', 200, $messageArray, $extraParam);
                exit(0);
            }

            $userDetails = User::with('userRoles')
                        ->whereHas('userRoles', function ($query) use($userType) {
                            $query->where([
                                ['roles.is_active', '=', '1'],
                            ]);
                        })
                        ->where('email', $employeeDetails->email)
                        ->first();

            $tokenDetails = $userDetails->createToken('authToken')->accessToken;
            // $this->device_token($inputs, $userType, $userDetails->id, 1);

            $user_details['user_id'] = $employeeDetails->id;
            $user_details['device_type'] = $request->device_type;
            $user_details['device_token'] = $request->device_token;
            $user_details['user_role'] = $userType;
            $user_details['login_status'] = 0;
            $user_details['is_active'] = 1;
            $user_details['is_delete'] = 0;

            UserDeviceToken::create($user_details);

            $to_email = $employeeDetails->email;
            $to_name  = $employeeDetails->name;
            $subject = 'User Credentials';

            $mail_data = array(
                'email_address'   => $employeeDetails->email,
                'password'        => $request->user_password
            );

            Mail::send('emails.userCredentialEmail', $mail_data, function($message) use($to_name, $to_email, $subject) {
                $message->to($to_email, $to_name??'Complete project')->subject($subject);
                //$message->from(env('MAIL_FROM_ADDRESS', ''), env('MAIL_FROM_NAME', '4e'));
                $message->from('no-reply@completeproject.ca', 'Complete project');
               // $message->from('no-reply@completeproject.ca', '4e Company Admin');
                //$message->from('no-reply@completeproject.ca', 'Foure WebAdmin');
            });

            $status_code = 1;
            $isValidSession = 1;
            $success['user_id'] = $userDetails->id??''; 
            $success['user_name'] = $userDetails->name??''; 
            $success['user_email'] = $userDetails->email??'';
            $success['access_token'] = $tokenDetails??'';
            $success['user_img']    = $user_image_url??'';
            $success['company_name'] = $userDetails->getEmployeeCompany->first()->company_name ??'';
            $success['gender']      = $userDetails->userProfile->gender??'';
            $success['age_range']      = $userDetails->userProfile->age??'';
            $success['about_me']      = $userDetails->userProfile->about_me??'';
            $success['postal_code']   = $userDetails->userProfile->postal_code??'';
            $success['isPushEnabled']  = true;

            return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam, $isValidSession);

        } catch (Exception $e) {
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

    public function getCompany($flag, Request $request)
    {
        $status_code = 0;
        $success = [];
        $inputs = getTrimmedValue($request->all());
        $extraParam = [];
        $messageArr['input'] = $inputs;
        $userType = 'employee';

        try
        {
            $companyDetails = Company::select('companies.id as company_id', 'company_name')->leftJoin('company_locations', 'company_locations.company_id', '=', 'companies.id')->where('companies.is_active', 1)->where('companies.is_delete', 0)->where('company_locations.is_delete', 0)->where('company_locations.is_active', 1)->groupBy('company_locations.company_id')->get();

            if(count($companyDetails)==0){
                $messageArray = 'Company not found';
                return $this->sendEmployeeResponse($status_code, $success, 'Company not found', 200, $messageArray, $extraParam);
                exit(0);
            } 

            $status_code = 1;
            $isValidSession = 1;
            $success = $companyDetails;

            return $this->sendEmployeeResponse($status_code, $success, 'success', 200, $messageArr, $extraParam, $isValidSession);

        } catch (Exception $e) {
            return $this->sendEmployeeResponse(0, [], $e->getMessage(), 200, $messageArr??[]);
        }
    }

}
