public function login()
 {
     try {
         $passwordMatch = false;
         $userDeviceUpdated = false;
         $access_token = '';
         $input = Request::all();
         $user = User::where('email', $input['email'])->first();
         if ($user) {
             if (crypt($input['password'], $user->password) == $user->password) {
                 $passwordMatch = true;
             }
         }
         if ($passwordMatch) {
             $userDevice = UserDevice::where('device_id', $input['device_id'])->first();
             $access_token = Uuid::uuid1()->toString();
             if ($userDevice) {
                 $userDeviceUpdated = $userDevice->update(['device_id' => $input['device_id'], 'rest_access_token' => $access_token, 'rest_access_token_expires' => Carbon::now()->addDays(360), 'rest_notification_id' => $input['notification_id'], 'os_type' => $input['os_type'], 'os_version' => $input['os_version'], 'hardware' => $input['hardware'], 'rest_app_version' => $input['app_version'], 'user_id' => $user->id]);
             } else {
                 $userDeviceUpdated = UserDevice::create(['device_id' => $input['device_id'], 'rest_access_token' => $access_token, 'rest_access_token_expires' => Carbon::now()->addDays(360), 'rest_notification_id' => $input['notification_id'], 'os_type' => $input['os_type'], 'os_version' => $input['os_version'], 'hardware' => $input['hardware'], 'rest_app_version' => $input['app_version'], 'user_id' => $user->id]);
             }
         }
         if ($userDeviceUpdated) {
             $vendorLocationContact = VendorLocationContact::where('user_id', $user->id)->first();
             $vendorLocation = VendorLocation::where('id', $vendorLocationContact->vendor_location_id)->first();
             $vendor = Vendor::where('id', $vendorLocation->vendor_id)->first();
             return response()->json(['id' => $user->id, 'access_token' => $access_token, 'full_name' => $user->full_name, 'email' => $user->email, 'phone_number' => $user->phone_number, 'role' => $user->role->name, 'vendor_name' => $vendor->name], 200);
         } else {
             return response()->json(['action' => 'Check if the email address and password match', 'message' => 'There is an email password mismatch. Please check and try again'], 227);
         }
     } catch (\Exception $e) {
         return response()->json(['message' => 'An application error occured.', 'error' => $e->getMessage()], 500);
     }
 }
 /**
  * Display a listing of the resource.
  *
  * @return Response
  */
 public function index($statuses, $accessToken)
 {
     try {
         $reservationIdArr = array();
         $reservationArr = array();
         $userDevice = UserDevice::where('rest_access_token', $accessToken)->first();
         $conciergeLocations = VendorLocationContact::where('user_id', $userDevice->user_id)->get();
         $reservationIntAttrArr = ReservationAttributesInteger::statusIn($statuses)->get();
         foreach ($reservationIntAttrArr as $reservationIntAttr) {
             $reservationDetail = ReservationDetail::locationIn($conciergeLocations, $reservationIntAttr->reservation_id)->first();
             if ($reservationDetail) {
                 array_push($reservationIdArr, $reservationIntAttr->reservation_id);
                 if (array_key_exists((string) $reservationIntAttr->reservation_id, $reservationArr)) {
                     $reservation = $reservationArr[(string) $reservationIntAttr->reservation_id];
                 } else {
                     $reservation = array();
                 }
                 $key = 'reservation_id';
                 $value = (string) $reservationIntAttr->reservation_id;
                 $reservation[$key] = $value;
                 $reservationArr[(string) $reservationIntAttr->reservation_id] = $reservation;
             }
         }
         if (sizeof($reservationIdArr) > 0) {
             //Int type
             $reservationIntAttrArr = ReservationAttributesInteger::reservationIdIn($reservationIdArr)->get();
             foreach ($reservationIntAttrArr as $reservationIntAttr) {
                 if (array_key_exists((string) $reservationIntAttr->reservation_id, $reservationArr)) {
                     $reservation = $reservationArr[(string) $reservationIntAttr->reservation_id];
                 } else {
                     $reservation = array();
                 }
                 $key = $reservationIntAttr->attribute->alias;
                 $value = $reservationIntAttr->attribute_value;
                 $reservation[$key] = $value;
                 //Check log for same attribute
                 $reservationStatusLog = ReservationStatusLog::where(['reservation_id' => $reservationIntAttr->reservation_id, 'new_reservation_status_id' => ReservationController::$edited_status_id])->orderBy('created_at', 'DESC')->first();
                 if ($reservationStatusLog != null) {
                     $reservationIntAttrLogArr = ReservationAttributesIntegerLog::where(['reservation_attribute_id' => $reservationIntAttr->attribute->id, 'reservation_status_log_id' => $reservationStatusLog->id])->get();
                     foreach ($reservationIntAttrLogArr as $reservationIntAttrLog) {
                         $key = "old_" . $reservationIntAttrLog->attribute->alias;
                         $value = $reservationIntAttrLog->old_attribute_value;
                         $reservation[$key] = $value;
                     }
                 }
                 $reservationArr[(string) $reservationIntAttr->reservation_id] = $reservation;
             }
             //Float type
             $reservationFloatAttrArr = ReservationAttributesFloat::reservationIdIn($reservationIdArr)->get();
             foreach ($reservationFloatAttrArr as $reservationFloatAttr) {
                 if (array_key_exists((string) $reservationFloatAttr->reservation_id, $reservationArr)) {
                     $reservation = $reservationArr[(string) $reservationFloatAttr->reservation_id];
                 } else {
                     $reservation = array();
                 }
                 $key = $reservationFloatAttr->attribute->alias;
                 $value = $reservationFloatAttr->attribute_value;
                 $reservation[$key] = $value;
                 $reservationArr[(string) $reservationFloatAttr->reservation_id] = $reservation;
             }
             //Date type
             $reservationDateAttrArr = ReservationAttributesDate::reservationIdIn($reservationIdArr)->get();
             foreach ($reservationDateAttrArr as $reservationDateAttr) {
                 if (array_key_exists((string) $reservationDateAttr->reservation_id, $reservationArr)) {
                     $reservation = $reservationArr[(string) $reservationDateAttr->reservation_id];
                 } else {
                     $reservation = array();
                 }
                 $key = $reservationDateAttr->attribute->alias;
                 $value = $reservationDateAttr->attribute_value;
                 $reservation[$key] = $value;
                 //Check log for same attribute
                 $reservationStatusLog = ReservationStatusLog::where(['reservation_id' => $reservationDateAttr->reservation_id, 'new_reservation_status_id' => ReservationController::$edited_status_id])->orderBy('created_at', 'DESC')->first();
                 if ($reservationStatusLog != null) {
                     $reservationDateAttrLogArr = ReservationAttributesDateLog::where(['reservation_attribute_id' => $reservationDateAttr->attribute->id, 'reservation_status_log_id' => $reservationStatusLog->id])->get();
                     foreach ($reservationDateAttrLogArr as $reservationDateAttrLog) {
                         $key = "old_" . $reservationDateAttrLog->attribute->alias;
                         $value = $reservationDateAttrLog->old_attribute_value;
                         $reservation[$key] = $value;
                     }
                 }
                 $reservationArr[(string) $reservationDateAttr->reservation_id] = $reservation;
             }
             //Text type
             $reservationTextAttrArr = ReservationAttributesText::reservationIdIn($reservationIdArr)->get();
             foreach ($reservationTextAttrArr as $reservationTextAttr) {
                 if (array_key_exists((string) $reservationTextAttr->reservation_id, $reservationArr)) {
                     $reservation = $reservationArr[(string) $reservationTextAttr->reservation_id];
                 } else {
                     $reservation = array();
                 }
                 $key = $reservationTextAttr->attribute->alias;
                 $value = $reservationTextAttr->attribute_value;
                 $reservation[$key] = $value;
                 $reservationStatusLog = ReservationStatusLog::where(['reservation_id' => $reservationTextAttr->reservation_id, 'new_reservation_status_id' => ReservationController::$edited_status_id])->orderBy('created_at', 'DESC')->first();
                 if ($reservationStatusLog != null) {
                     $reservationTextAttrLogArr = ReservationAttributesTextLog::where(['reservation_attribute_id' => $reservationTextAttr->attribute->id, 'reservation_status_log_id' => $reservationStatusLog->id])->get();
                     foreach ($reservationTextAttrLogArr as $reservationTextAttrLog) {
                         $key = "old_" . $reservationTextAttrLog->attribute->alias;
                         $value = $reservationTextAttrLog->old_attribute_value;
                         $reservation[$key] = $value;
                     }
                 }
                 $reservationArr[(string) $reservationTextAttr->reservation_id] = $reservation;
             }
             //Boolean type
             $reservationBoolAttrArr = ReservationAttributesBoolean::reservationIdIn($reservationIdArr)->get();
             foreach ($reservationBoolAttrArr as $reservationBoolAttr) {
                 if (array_key_exists((string) $reservationBoolAttr->reservation_id, $reservationArr)) {
                     $reservation = $reservationArr[(string) $reservationBoolAttr->reservation_id];
                 } else {
                     $reservation = array();
                 }
                 $key = $reservationBoolAttr->attribute->alias;
                 $value = $reservationBoolAttr->attribute_value;
                 if ($value == 1) {
                     $reservation[$key] = true;
                 } else {
                     $reservation[$key] = false;
                 }
                 $reservationArr[(string) $reservationBoolAttr->reservation_id] = $reservation;
             }
             //VarChar type
             $reservationVarcharAttrArr = ReservationAttributesVarchar::reservationIdIn($reservationIdArr)->get();
             foreach ($reservationVarcharAttrArr as $reservationVarcharAttr) {
                 if (array_key_exists((string) $reservationVarcharAttr->reservation_id, $reservationArr)) {
                     $reservation = $reservationArr[(string) $reservationVarcharAttr->reservation_id];
                 } else {
                     $reservation = array();
                 }
                 $key = $reservationVarcharAttr->attribute->alias;
                 $value = $reservationVarcharAttr->attribute_value;
                 $reservation[$key] = $value;
                 $reservationArr[(string) $reservationVarcharAttr->reservation_id] = $reservation;
             }
             //Get Customer
             foreach ($reservationIdArr as $reservationId) {
                 $reservationDetail = ReservationDetail::where('id', $reservationId)->first();
                 if ($reservationDetail) {
                     $reservation = $reservationArr[(string) $reservationId];
                     $reservation['reservation_type'] = $reservationDetail->reservation_type;
                     $customer = array();
                     $customer['id'] = $reservationDetail->user->id;
                     if ($reservationDetail->user->is_vip == 1) {
                         $customer['is_vip'] = true;
                     } else {
                         $customer['is_vip'] = false;
                     }
                     $customer['full_name'] = $reservationDetail->user->full_name;
                     $customer['email'] = $reservationDetail->user->email;
                     $customer['phone_number'] = $reservationDetail->user->phone_number;
                     $customer['points_earned'] = $reservationDetail->user->points_earned;
                     $customer['rating'] = UserRating::where('user_id', $reservationDetail->user->id)->avg('rating');
                     if ($customer['rating'] == null) {
                         $customer['rating'] = 0.0;
                     }
                     $customerPreferences = UserAttributesVarChar::where(['user_id' => $reservationDetail->user->id, 'user_attribute_id' => ReservationController::$cust_pref_attr_id])->first();
                     if ($customerPreferences) {
                         $customer['customer_preferences'] = $customerPreferences->attribute_value;
                     }
                     $reservation['customer'] = $customer;
                     $reservationArr[(string) $reservationId] = $reservation;
                 }
             }
             //Get Location
             foreach ($reservationIdArr as $reservationId) {
                 $reservationDetail = ReservationDetail::where('id', $reservationId)->first();
                 if ($reservationDetail) {
                     $reservation = $reservationArr[(string) $reservationId];
                     $location = array();
                     $vendorLocation = VendorLocation::where('id', $reservationDetail->vendor_location_id)->first();
                     $location['location_id'] = $vendorLocation->location_id;
                     $location['location'] = Location::where('id', $vendorLocation->location_id)->first()->name;
                     $reservation['location'] = $location;
                     $reservationArr[(string) $reservationId] = $reservation;
                 }
             }
             //Get Product
             foreach ($reservationIdArr as $reservationId) {
                 $reservationDetail = ReservationDetail::where('id', $reservationId)->first();
                 if ($reservationDetail && $reservationDetail->reservation_type == 'experience') {
                     $reservation = $reservationArr[(string) $reservationId];
                     $product = array();
                     $product['product_id'] = $reservationDetail->product_id;
                     $product['product'] = Product::where('id', $reservationDetail->product_id)->first()->name;
                     $addonsArr = Product::where('product_parent_id', $reservationDetail->product_id)->get();
                     if (sizeof($addonsArr) > 0) {
                         $statusStrArr = explode('~', $statuses);
                         $statusIntArr = [];
                         foreach ($statusStrArr as $statusStr) {
                             array_push($statusIntArr, (int) $statusStr);
                         }
                         $productAddonArr = array();
                         foreach ($addonsArr as $addon) {
                             $addons = array();
                             $addons['addon_id'] = $addon->id;
                             $addons['addon_name'] = $addon->name;
                             $reservationAddonDetail = ReservationAddonsVariantsDetail::whereIn('reservation_status_id', $statusIntArr)->where(['reservation_id' => $reservationId, 'options_id' => $addon->id])->first();
                             if ($reservationAddonDetail != null) {
                                 $addons['no_of_persons'] = $reservationAddonDetail->no_of_persons;
                             }
                             array_push($productAddonArr, $addons);
                         }
                         $product['addons'] = $productAddonArr;
                     }
                     $reservation['product'] = $product;
                     $reservationArr[(string) $reservationId] = $reservation;
                 }
             }
             return response()->json(array_values($reservationArr), 200);
         } else {
             return response()->json(['message' => 'No reservations found.'], 204);
         }
     } catch (\Exception $e) {
         return response()->json(['message' => 'An application error occured.', 'error' => $e->getMessage()], 500);
     }
 }