/**
  *  This service is use to handle profile it has 4 methods changegeneralinfo, changeshippinginfo, changepassword and changeavtar
  * @param changegeneralinfo : method, user_id, firstname, lastname, contact_no, api_token, secondary_email
  * @return $updategeneralinfo
  * @param changeshippinginfo : method, user_id,  mytoken, city, state, zipcode, api_token, address_line_1, address_line_2
  * @return $updateshippinginfo
  * @param changepassword : method, user_id, oldPassword, newPassword, reNewPassword, api_token
  * @return $Updatepassword
  * @param changeavtar : method, user_id, api_token, input_file_preview
  * @return $url
  */
 public function profileAjaxHandler(Request $request)
 {
     $response = new stdClass();
     if ($request->isMethod("POST")) {
         $postData = $request->all();
         $API_TOKEN = env('API_TOKEN');
         $method = "";
         if (isset($postData['method'])) {
             $method = $postData['method'];
         }
         $objuser = new User();
         $objusermetamodel = new Usersmeta();
         switch ($method) {
             case "changegeneralinfo":
                 $userId = "";
                 if (isset($postData['user_id'])) {
                     $userId = $postData['user_id'];
                 }
                 $firstname = "";
                 if (isset($postData['firstname'])) {
                     $firstname = $postData['firstname'];
                 }
                 $lastname = "";
                 if (isset($postData['lastname'])) {
                     $lastname = $postData['lastname'];
                 }
                 $contact_no = "";
                 if (isset($postData['contact_no'])) {
                     $contact_no = $postData['contact_no'];
                 }
                 $email = "";
                 if (isset($postData['email'])) {
                     $email = $postData['email'];
                 }
                 $username = "";
                 if (isset($postData['username'])) {
                     $username = $postData['username'];
                 }
                 $authFlag = false;
                 if (isset($postData['api_token'])) {
                     $apitoken = $postData['api_token'];
                     if ($apitoken == $API_TOKEN) {
                         $authFlag = true;
                     } else {
                         if ($userId != '') {
                             $whereForUpdate = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                             $Userscredentials = $objuser->getUsercredsWhere($whereForUpdate);
                             if ($apitoken == $Userscredentials->login_token) {
                                 $authFlag = true;
                             }
                         }
                     }
                 }
                 if ($authFlag) {
                     $rules = array('firstname' => 'required|regex:/^[A-Za-z\\s]+$/|max:255', 'lastname' => 'required|regex:/^[A-Za-z\\s]+$/|max:255', 'username' => 'required|regex:/^[A-Za-z0-9._\\s]+$/|max:255', 'email' => 'required|email|max:255', 'user_id' => 'required');
                     $messages = ['firstname.regex' => 'The :attribute cannot contain special characters.', 'lastname.regex' => 'The :attribute cannot contain special characters.', 'username.regex' => 'The :attribute cannot contain special characters.'];
                     $validator = Validator::make($request->all(), $rules, $messages);
                     if ($validator->fails()) {
                         $response->code = 100;
                         $response->message = $validator->messages();
                         $response->data = null;
                         echo json_encode($response, true);
                     } else {
                         $whereForUpdate = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                         $currentUserDetails = $objuser->getUsercredsWhere($whereForUpdate);
                         $uniqueflag = false;
                         if ($currentUserDetails->username == $username && $currentUserDetails->username == $email) {
                             $uniqueflag = true;
                         } else {
                             if ($currentUserDetails->username != $username && $currentUserDetails->username == $email) {
                                 $uniqueflag = true;
                             } else {
                                 if ($currentUserDetails->username == $username && $currentUserDetails->username != $email) {
                                     $uniqueflag = true;
                                 } else {
                                     $rules = array('username' => 'unique:users', 'email' => 'unique:users');
                                     $validator = Validator::make($request->all(), $rules);
                                     if ($validator->fails()) {
                                         $response->code = 100;
                                         $response->message = $validator->messages();
                                         $response->data = null;
                                         echo json_encode($response, true);
                                     } else {
                                         $uniqueflag = true;
                                     }
                                 }
                             }
                         }
                         if ($uniqueflag) {
                             $whereForId = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                             $data = array('name' => $firstname, 'last_name' => $lastname, 'username' => $username, 'email' => $email);
                             $updategeneralinfo = $objuser->UpdateUserDetailsbyId($whereForId, $data);
                             $whereForUserId = ['rawQuery' => 'user_id =?', 'bindParams' => [$userId]];
                             $Isuseravailable = $objusermetamodel->getUsermetaWhere($whereForUserId);
                             if ($Isuseravailable) {
                                 $dataupdate = array('phone' => "{$contact_no}");
                                 $UpdateUsermeta = $objusermetamodel->UpdateUsermetawhere($whereForUserId, $dataupdate);
                             } else {
                                 $dataadd = array('user_id' => $userId, 'phone' => $contact_no);
                                 $Addusermeta = $objusermetamodel->addUsermeta($dataadd);
                             }
                             if ($updategeneralinfo) {
                                 $response->code = 200;
                                 $response->message = "Update Successful";
                                 $response->data = $updategeneralinfo;
                                 echo json_encode($response, true);
                             } else {
                                 $response->code = 400;
                                 $response->message = "Something went wrong";
                                 $response->data = 1;
                                 echo json_encode($response, true);
                             }
                         }
                     }
                 } else {
                     $response->code = 401;
                     $response->message = "Access Denied";
                     $response->data = null;
                     echo json_encode($response, true);
                 }
                 break;
             case "changeshippinginfo":
                 $userId = "";
                 if (isset($postData['user_id'])) {
                     $userId = $postData['user_id'];
                 }
                 $City = "";
                 if (isset($postData['city'])) {
                     $City = $postData['city'];
                 }
                 $State = "";
                 if (isset($postData['state'])) {
                     $State = $postData['state'];
                 }
                 $Zip_code = "";
                 if (isset($postData['zipcode'])) {
                     $Zip_code = $postData['zipcode'];
                 }
                 //                    $country = "";
                 //                    if (isset($postData['country'])) {
                 //                        $country = $postData['country'];
                 //                    }
                 $Address1 = "";
                 if (isset($postData['address_line_1'])) {
                     $Address1 = $postData['address_line_1'];
                 }
                 $Address2 = "";
                 if (isset($postData['address_line_2'])) {
                     $Address2 = $postData['address_line_2'];
                 }
                 $authFlag = false;
                 if (isset($postData['api_token'])) {
                     $apitoken = $postData['api_token'];
                     if ($apitoken == $API_TOKEN) {
                         $authFlag = true;
                     } else {
                         if ($userId != '') {
                             $whereForUpdate = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                             $Userscredentials = $objuser->getUsercredsWhere($whereForUpdate);
                             if ($apitoken == $Userscredentials->login_token) {
                                 $authFlag = true;
                             }
                         }
                     }
                 }
                 if ($authFlag) {
                     $rules = array('city' => 'required', 'state' => 'required', 'zipcode' => 'required', 'address_line_1' => 'required');
                     $validator = Validator::make($request->all(), $rules);
                     if ($validator->fails()) {
                         $response->code = 100;
                         $response->message = $validator->messages();
                         $response->data = null;
                         echo json_encode($response);
                     } else {
                         $whereForUserId = ['rawQuery' => 'user_id =?', 'bindParams' => [$userId]];
                         $Isuseravailable = $objusermetamodel->getUsermetaWhere($whereForUserId);
                         if ($Isuseravailable) {
                             $data = array('city' => $City, 'state' => $State, 'zipcode' => $Zip_code, 'addressline1' => $Address1, 'addressline2' => $Address2);
                             $updateshippinginfo = $objusermetamodel->UpdateUsermetawhere($whereForUserId, $data);
                         } else {
                             $dataadd = array('user_id' => $userId, 'city' => $City, 'state' => $State, 'zipcode' => $Zip_code, 'addressline1' => $Address1, 'addressline2' => $Address2);
                             $Addusermeta = $objusermetamodel->addUsermeta($dataadd);
                         }
                         if ($updateshippinginfo || $Addusermeta) {
                             $response->code = 200;
                             $response->message = "Update Successful";
                             $response->data = 1;
                             echo json_encode($response, true);
                         } else {
                             $response->code = 400;
                             $response->message = "Something went Wrong";
                             $response->data = null;
                             echo json_encode($response, true);
                         }
                     }
                 } else {
                     $response->code = 401;
                     $response->message = "Access Denied";
                     $response->data = null;
                     echo json_encode($response, true);
                 }
                 break;
             case "changepassword":
                 $userId = "";
                 if (isset($postData['user_id'])) {
                     $userId = $postData['user_id'];
                 }
                 $oldpassword = "";
                 if (isset($postData['oldPassword'])) {
                     $oldpassword = $postData['oldPassword'];
                 }
                 $newpassword = "";
                 if (isset($postData['newPassword'])) {
                     $newpassword = $postData['newPassword'];
                 }
                 $renewpassword = "";
                 if (isset($postData['reNewPassword'])) {
                     $renewpassword = $postData['reNewPassword'];
                 }
                 $authFlag = false;
                 if (isset($postData['api_token'])) {
                     $apitoken = $postData['api_token'];
                     if ($apitoken == $API_TOKEN) {
                         $authFlag = true;
                     } else {
                         if ($userId != '') {
                             $whereForUpdate = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                             $Userscredentials = $objuser->getUsercredsWhere($whereForUpdate);
                             if ($apitoken == $Userscredentials->login_token) {
                                 $authFlag = true;
                             }
                         }
                     }
                 }
                 if ($authFlag) {
                     $rules = array('oldPassword' => 'required', 'newPassword' => 'required', 'reNewPassword' => 'required', 'user_id' => 'required');
                     $validator = Validator::make($request->all(), $rules);
                     if ($validator->fails()) {
                         $response->code = 100;
                         $response->message = $validator->messages();
                         $response->data = null;
                         echo json_encode($response);
                     } else {
                         if ($newpassword != $oldpassword) {
                             if ($newpassword == $renewpassword) {
                                 $where = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                                 $currentUserDetails = $objuser->getUsercredsWhere($where);
                                 if (Hash::check($oldpassword, $currentUserDetails->password)) {
                                     $newpassword = Hash::make($newpassword);
                                     $data = array('password' => $newpassword);
                                     $Updatepassword = $objuser->UpdateUserDetailsbyId($where, $data);
                                     $response->code = 200;
                                     $response->message = "Password Changed Successfully";
                                     $response->data = 1;
                                     echo json_encode($response, true);
                                 } else {
                                     $response->code = 400;
                                     $response->message = "Invalid Password";
                                     $response->data = null;
                                     echo json_encode($response, true);
                                 }
                             } else {
                                 $response->code = 400;
                                 $response->message = "Both New password should be same";
                                 $response->data = null;
                                 echo json_encode($response, true);
                             }
                         } else {
                             $response->code = 400;
                             $response->message = "New and old password should not be same";
                             $response->data = null;
                             echo json_encode($response, true);
                         }
                     }
                 } else {
                     $response->code = 401;
                     $response->message = "Access Denied";
                     $response->data = null;
                     echo json_encode($response, true);
                 }
                 break;
             case "changeavtar":
                 //This method is directly called from Ajax call of profile-setting.blade.php page
                 $userId = "";
                 if (isset($postData['user_id'])) {
                     $userId = $postData['user_id'];
                 }
                 $authFlag = false;
                 if (isset($postData['api_token'])) {
                     $apitoken = $postData['api_token'];
                     if ($apitoken == $API_TOKEN) {
                         $authFlag = true;
                     } else {
                         if ($userId != '') {
                             $whereForUpdate = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                             $Userscredentials = $objuser->getUsercredsWhere($whereForUpdate);
                             if ($apitoken == $Userscredentials->login_token) {
                                 $authFlag = true;
                             }
                         }
                     }
                 }
                 if ($authFlag) {
                     if ($userId != '') {
                         if (Input::hasFile('file')) {
                             $validator = Validator::make($request->all(), ['file' => 'image']);
                             if ($validator->fails()) {
                                 $response->code = 100;
                                 $response->message = $validator->messages();
                                 $response->data = null;
                                 echo json_encode($response);
                             } else {
                                 $destinationPath = $_SERVER['DOCUMENT_ROOT'] . '/../../web/public/assets/uploads/useravatar/';
                                 $filename = $userId . '_' . time() . ".jpg";
                                 File::makeDirectory($destinationPath, 0777, true, true);
                                 $filePath = $destinationPath . $filename;
                                 $quality = $this->imageQuality(Input::file('file'));
                                 Image::make(Input::file('file'))->resize(1024, 1024, function ($constraint) {
                                     $constraint->aspectRatio();
                                 })->save($filePath, $quality);
                                 $filepathupdate = '/assets/uploads/useravatar/' . $filename;
                                 $updateData['profilepic'] = $filepathupdate;
                                 $where = ['rawQuery' => 'id =?', 'bindParams' => [$userId]];
                                 $UserData = $objuser->getUsercredsWhere($where);
                                 $updatedResult = $objuser->UpdateUserDetailsbyId($where, $updateData);
                                 if ($updatedResult) {
                                     if ($UserData->profilepic != '') {
                                         File::delete(public_path() . '/../../web/public' . $UserData->profilepic);
                                     }
                                     $response->code = 200;
                                     $response->message = "Successfully updated profile image.";
                                     $response->data = $filepathupdate;
                                     echo json_encode($response);
                                 } else {
                                     $response->code = 400;
                                     $response->message = "Something went wrong, please try again.";
                                     $response->data = null;
                                     echo json_encode($response);
                                 }
                             }
                         } else {
                             $response->code = 400;
                             $response->message = "Give correct input and Input Image files should be(jpg,gif,png,jpeg)only";
                             $response->data = null;
                             echo json_encode($response, true);
                         }
                     } else {
                         $response->code = 400;
                         $response->message = "You need to login to change Avtar.";
                         $response->data = null;
                         echo json_encode($response, true);
                     }
                 } else {
                     $response->code = 401;
                     $response->message = "Access Denied";
                     $response->data = null;
                     echo json_encode($response, true);
                 }
                 break;
             default:
                 break;
         }
     } else {
         $response->code = 401;
         $response->message = "Invalid request";
         $response->data = null;
         echo json_encode($response, true);
     }
 }
 /**
  * @param api_token , first_name, last_name, username, email
  */
 public function signup(Request $request)
 {
     $response = new stdClass();
     if ($request->isMethod("POST")) {
         $API_TOKEN = env('API_TOKEN');
         $postData = $request->all();
         $apitoken = "";
         if (isset($postData['api_token'])) {
             $apitoken = $postData['api_token'];
         }
         if ($apitoken == $API_TOKEN) {
             $rules = array('first_name' => 'required|regex:/^[A-Za-z\\s]+$/|max:255', 'last_name' => 'required|regex:/^[A-Za-z\\s]+$/|max:255', 'username' => 'required|regex:/^[A-Za-z0-9._\\s]+$/|max:255|unique:users', 'email' => 'required|email|max:255|unique:users');
             $messages = ['first_name.regex' => 'The :attribute cannot contain special characters.', 'last_name.regex' => 'The :attribute cannot contain special characters.', 'username.regex' => 'The :attribute cannot contain special characters.'];
             $validator = Validator::make($request->all(), $rules, $messages);
             if ($validator->fails()) {
                 $response->code = 100;
                 $response->message = $validator->messages();
                 echo json_encode($response);
             } else {
                 $password = "";
                 $characters = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9'));
                 $max = count($characters) - 1;
                 for ($i = 0; $i < 8; $i++) {
                     $rand = mt_rand(0, $max);
                     $password .= $characters[$rand];
                 }
                 $supplier = User::create(['name' => $postData['first_name'], 'last_name' => $postData['last_name'], 'email' => $postData['email'], 'password' => Hash::make($password), 'role' => '1', 'status' => '1', 'username' => $postData['username']]);
                 $objUsersMetaModel = new Usersmeta();
                 if ($postData['optradio'] != '' && $postData['contact_no'] != '' && $postData['date_of_birth'] != '') {
                     $whereForUpdate = ['rawQuery' => 'gender = ? and phone = ? and date_of_birth = ?', 'bindParams' => [$postData['optradio'], $postData['contact_no'], $postData['date_of_birth']]];
                     $exists = $objUsersMetaModel->UpdateUsermetawhere($whereForUpdate);
                 }
                 if ($supplier) {
                     $objMailTemplate = new MailTemplate();
                     $temp_name = "signup_success_mail";
                     $mailTempContent = $objMailTemplate->getTemplateByName($temp_name);
                     $key = env('MANDRILL_KEY');
                     $mandrill = new Mandrill($key);
                     $async = false;
                     $ip_pool = 'Main Pool';
                     $message = array('html' => $mailTempContent->temp_content, 'subject' => "Registration Successful", 'from_email' => "*****@*****.**", 'to' => array(array('email' => $postData['email'], 'type' => 'to')), 'merge_vars' => array(array("rcpt" => $postData['email'], 'vars' => array(array("name" => "firstname", "content" => $postData['first_name']), array("name" => "password", "content" => $password)))));
                     $mailrespons = $mandrill->messages->send($message, $async, $ip_pool);
                     if ($mailrespons[0]['status'] == "sent") {
                         $response->code = 200;
                         $response->message = "Signup successful. Please check your email for Password";
                         $response->data = null;
                         echo json_encode($response);
                     } else {
                         $objuser = new User();
                         $whereForUpdate = ['rawQuery' => 'id =?', 'bindParams' => [$supplier->id]];
                         $deleteUser = $objuser->deleteUserDetails($whereForUpdate);
                         //If mail sending fails then delete user details
                         $response->code = 400;
                         $response->message = "some Error occured try again";
                         echo json_encode($response);
                     }
                 } else {
                     $response->code = 400;
                     $response->message = "some Error occured try again";
                     @($response->data = null);
                     echo json_encode($response);
                 }
             }
         } else {
             $response->code = 401;
             $response->message = "Request Not allowed";
             $response->data = null;
             echo json_encode($response);
         }
     }
 }