/**
  * Edit Filter Group Action
  * @param Request $request
  * @param $id
  * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
  * @author: Vini Dubey<*****@*****.**>
  */
 public function editFilterGroup(Request $request, $id)
 {
     $postdata = $request->all();
     $ObjProductFeatures = ProductFeatures::getInstance();
     $ObjProductCategory = ProductCategory::getInstance();
     $ObjProductFilterOption = ProductFilterOption::getInstance();
     $userId = Session::get('fs_admin')['id'];
     if ($request->isMethod('POST')) {
         $inputData = $request->all();
         $variantFilterInputData = $request->input('filter_variant');
         $filedNames = array_diff(array_keys($variantFilterInputData[0]), ['product_filter_option_id']);
         $rulesAddFilter = ['productfiltergroupname' => 'required_if:productfiltertype,G|regex:/(^[A-Za-z0-9 ]+$)+/|max:255|unique:product_filter_option,product_filter_option_name,' . $id . ',product_filter_option_id', 'filterdescription' => 'required_if:productfiltertype,G|max:255', 'productcategories' => 'required_if:productfiltertype,G'];
         $messagesAddFeature = ['productfiltergroupname.required_if' => 'Please enter a name', 'productfiltergroupname.regex' => 'Name can contain alphanumeric characters and spaces only', 'productfiltergroupname.max' => 'Name is too long to use. 255 characters max.', 'filterdescription.max' => 'Description should not exceed 255 characters', 'filterdescription.required_if' => 'Filter description is required', 'productcategories.required_if' => 'Please select atleast one category'];
         $newdata = [];
         foreach ($filedNames as $varinatKey => $fileVal) {
             foreach ($variantFilterInputData as $VKey => $filedName) {
                 $rulesAddFilter['filter_variant' . '.' . $VKey . '.' . $fileVal] = 'required_if:productfiltertype,V|unique:product_filter_option,product_filter_option_name';
                 $rulesAddFilter['filter_variant' . '.' . $VKey . '.' . $fileVal] = 'required_if:productfiltertype,V';
                 $messagesAddFeature['filter_variant' . '.' . $VKey . '.' . $fileVal . '.required_if'] = 'Please select filter variant';
                 $messagesAddFeature['filter_variant' . '.' . $VKey . '.' . $fileVal . '.required_if'] = 'Please select filter variant description';
             }
         }
         $validator = Validator::make($request->all(), $rulesAddFilter, $messagesAddFeature);
         if ($validator->fails()) {
             return redirect('/admin/edit-filtergroup/' . $id)->withErrors($validator)->withInput();
         } else {
             if ($inputData['productfiltertype'] == 'G') {
                 $data['product_filter_option_name'] = $inputData['productfiltergroupname'];
                 $data['product_filter_option_description'] = $inputData['filterdescription'];
                 $data['product_filter_type'] = $inputData['productfiltertype'];
                 $data['product_filter_variant_type'] = $inputData['filter_variant_type'];
                 $temp = array();
                 $cat = $postdata['productcategories'];
                 foreach ($cat as $catkey => $catval) {
                     $category[$catkey] = $catkey;
                 }
                 $where = ['rawQuery' => 'product_filter_option_id = ?', 'bindParams' => [$id]];
                 $FilterGroup = $ObjProductFilterOption->getFilterDetailsById($where);
                 $catdata = $FilterGroup[0]->product_filter_category_id;
                 $cata = explode(",", $catdata);
                 $categoryIds = implode(',', array_unique($category));
                 array_push($cata, $categoryIds);
                 $catmain = implode(",", array_unique(explode(",", implode(",", $cata))));
                 $data['product_filter_category_id'] = $catmain;
                 $data['added_by'] = $userId;
                 $result = $ObjProductFilterOption->updateFilterOption($where, $data);
             } else {
                 $temp = array();
                 foreach ($variantFilterInputData as $varianKey => $varianVal) {
                     $temp['product_filter_option_name'] = $varianVal['name'];
                     $temp['product_filter_option_description'] = $varianVal['description'];
                     $temp['product_filter_type'] = $inputData['productfiltertype'];
                     $temp['product_filter_group_id'] = $id;
                     $temp['added_by'] = $userId;
                     if (isset($varianVal['product_filter_option_id'])) {
                         $temps['product_filter_option_id'] = $varianVal['product_filter_option_id'];
                         $wheres = ['rawQuery' => 'product_filter_option_id =' . $varianVal['product_filter_option_id']];
                         $result = $ObjProductFilterOption->updateFilterOption($wheres, $temp);
                     } else {
                         $result = $ObjProductFilterOption->addProductfilterWhere($temp);
                     }
                 }
             }
         }
         if ($result) {
             $success = "Successfully Edited!";
             return Redirect::back()->with(['status' => 'success', 'msg' => $success]);
         } else {
             $success = "Nothing to update!";
             return Redirect::back()->with(['status' => 'info', 'msg' => $success]);
         }
     }
     $where = array('rawQuery' => 'category_status = ?', 'bindParams' => [1]);
     $allCategories = $ObjProductCategory->getAllCategoriesWhere($where);
     foreach ($allCategories as $key => $value) {
         $allCategories[$key]->display_name = $this->getCategoryDisplayName($value->category_id);
     }
     $whereId = ['rawQuery' => 'product_filter_option_id = ? OR product_filter_group_id = ?', 'bindParams' => [$id, $id]];
     $selectColumns = DB::raw('product_filter_option.*,
         GROUP_CONCAT(CASE product_filter_type WHEN "V" THEN product_filter_option_name END ) AS var_names,
         GROUP_CONCAT(CASE product_filter_type WHEN "V" THEN product_filter_option_description END ) AS var_description,
         GROUP_CONCAT(CASE product_filter_type WHEN "V" THEN product_filter_option_id END ) AS var_ids');
     $FilterGroup = $ObjProductFilterOption->getFilterOptionAndGroup($whereId, $selectColumns);
     if (isset($allCategories) && !empty($FilterGroup)) {
         foreach ($FilterGroup as $filterKey => $filterVal) {
             if ($filterVal->product_filter_type == 'G') {
                 $catfilterName = array_filter(array_values(array_unique(explode(',', $filterVal->product_filter_category_id))));
                 if (!empty($catfilterName)) {
                     $where = ['rawQuery' => 'category_id IN (' . implode(',', $catfilterName) . ')'];
                     $selectColumns = ['product_categories.*'];
                     $category = $ObjProductCategory->getCategoryNameById($where, $selectColumns);
                     foreach ($category as $key => $val) {
                         $filtecat[$key] = $val->category_id;
                     }
                     $whereFeature = array('rawQuery' => 'status = ? AND parent_id=? AND feature_id = ?', 'bindParams' => [1, 0, $filterVal->product_filter_feature_id]);
                     $allFeatures = $ObjProductFeatures->getAllFeaturesWhere($whereFeature);
                     $dataForView = json_decode($allFeatures, true);
                     $errMsg = null;
                     if ($dataForView['code'] != 200) {
                         $errMsg = $dataForView['message'];
                     }
                 }
             }
         }
         $FilterGroup[0]->filterCategories = $allCategories;
         $FilterGroup[0]->selectedCategories = $filtecat;
         $FilterGroup[0]->filterFeatures = $dataForView['data'][0];
         return view('Admin/Views/filter/edit-filtergroup', ['editfiltergroup' => $FilterGroup]);
     }
 }
 public function editFilterGroup(Request $request, $id)
 {
     $postdata = $request->all();
     $ObjProductFeatures = ProductFeatures::getInstance();
     $ObjProductCategory = ProductCategory::getInstance();
     $ObjProductFilterOption = ProductFilterOption::getInstance();
     if ($request->isMethod('GET')) {
         $where = array('rawQuery' => 'category_status = ?', 'bindParams' => [1]);
         $allCategories = $ObjProductCategory->getAllCategoriesWhere($where);
         foreach ($allCategories as $key => $value) {
             $allCategories[$key]->display_name = $this->getCategoryDisplayName($value->category_id);
         }
         $whereId = array('rawQuery' => 'product_filter_option_id=?', 'bindParams' => [$id]);
         $FilterGroup = $ObjProductFilterOption->getFilterDetailsById($whereId);
         $catfilterName = array_values(array_unique(explode(',', $FilterGroup[0]->product_filter_category_id)));
         $category = $ObjProductCategory->getCategoryById($catfilterName);
         foreach ($category as $key => $val) {
             $filtecat[$key] = $val->category_id;
         }
         $whereFeature = array('rawQuery' => 'status = ?', 'bindParams' => [1], 'rawQuery' => 'parent_id=?', 'bindParams' => [0]);
         $allFeatures = $ObjProductFeatures->getAllFeaturesWhere($whereFeature);
         return view('Admin/Views/filter/edit-filtergroup', ['editfiltergroup' => $FilterGroup[0], 'selectedcategory' => $filtecat, 'categories' => $allCategories, 'features' => $allFeatures]);
     } elseif ($request->isMethod('POST')) {
         $data['product_filter_option_name'] = $postdata['productfiltergroupname'];
         $data['product_filter_option_description'] = $postdata['filterdescription'];
         $data['product_filter_category_id'] = $postdata['productcategories'];
         // $data['status'] = $postdata['productfiltergroupnamestatus'];
         // need to work //
         //            $checkforproduct = $postdata['filtercheckproduct'];
         //
         //            if ($checkforproduct == "on") {
         //                $data['display_on_product'] = 1;
         //            } else {
         //                $data['display_on_product'] = 0;
         //            }
         //            $checkforproduct = '';
         //            $checkforcatalog = $postdata['filtercheckcatalog'];
         //            if ($checkforcatalog == "on") {
         //                $data['display_on_catalog'] = 1;
         //            } else {
         //                $data['display_on_catalog'] = 0;
         //            }
         //            $checkforcatalog = '';
         // end //
         $temp = array();
         $cat = $postdata['productcategories'];
         foreach ($cat as $catkey => $catval) {
             $category[$catkey] = $catkey;
         }
         //            $FilterGroup = $ObjProductCategory->getCategoryInfoById($category);
         $where = ['rawQuery' => 'product_filter_option_id = ?', 'bindParams' => [$id]];
         $FilterGroup = $ObjProductFilterOption->getFilterDetailsById($where);
         $catdata = $FilterGroup[0]->product_filter_category_id;
         $cata = explode(",", $catdata);
         $categoryIds = implode(',', $category);
         array_push($cata, $categoryIds);
         $catmain = implode(",", $cata);
         $data['product_filter_category_id'] = $catmain;
         $result = $ObjProductFilterOption->updateFilterOption($where, $data);
     }
     if ($result) {
         $success = "Successfully Edited!";
         return Redirect::back()->with('message', $success);
     } else {
         $success = "Error!";
         return Redirect::back()->with('message', $success);
     }
 }
 public function editProduct(Request $request, $productId)
 {
     $temp = ["cacheid" => "testcacheid1", "testsdata" => [["lessonid" => "1", "drills" => [["drillid" => "1", "result_ids" => "1,2,3"], ["drillid" => "2", "result_ids" => "4"]]], ["lessonid" => "2", "drills" => [["drillid" => "1", "result_ids" => "1,2,3"], ["drillid" => "2", "result_ids" => "4"]]]]];
     dd(json_encode($temp, true));
     die;
     //GET from product            //GET from productmeta
     $objModelProducts = Products::getInstance();
     $whereForProduct = ['rawQuery' => 'products.product_id = ?', 'bindParams' => [$productId]];
     $productData = json_decode($objModelProducts->getProductWhere($whereForProduct), true);
     if (!empty($productData['data'])) {
         $objModelCategory = ProductCategory::getInstance();
         $objModelFeatures = ProductFeatures::getInstance();
         $objModelProductMeta = ProductMeta::getInstance();
         $objModelProductImage = ProductImage::getInstance();
         $objModelProductOption = ProductOption::getInstance();
         $objModelProductOptionVariant = ProductOptionVariant::getInstance();
         $objModelProductOptionVariantRelation = ProductOptionVariantRelation::getInstance();
         $objModelProductFeatureVariantRelation = ProductFeatureVariantRelation::getInstance();
         $objModelProductOptVarCombination = ProductOptionVariantsCombination::getInstance();
         $objModelProductFeature = ProductFeatures::getInstance();
         $userId = Session::get('fs_admin')['id'];
         $whereForCat = ['rawQuery' => 'category_status =?', 'bindParams' => [1]];
         $allCategories = $objModelCategory->getAllCategoriesWhere($whereForCat);
         $whereForFeatureGroup = ['rawQuery' => 'group_flag =? and status = ?', 'bindParams' => [1, 1]];
         $allFeatureGroups = $objModelFeatures->getAllFeaturesWhere($whereForFeatureGroup);
         //GET from product_feature_variant_relation
         $catId = (int) $productData['data']['category_id'];
         $catFlag = true;
         $parentCategory = array();
         $count = 1;
         $bindParamsForFeature = array();
         $queryForFeature = "";
         $queryForFeatureGroup = "";
         while ($catFlag) {
             if ($count == 1) {
                 $queryForFeatureGroup = '(product_features.group_flag = 1) and (product_features.for_categories LIKE ? OR product_features.for_categories LIKE ? OR product_features.for_categories LIKE ? OR product_features.for_categories LIKE ?';
                 $queryForFeature = '(group_flag = 0 and parent_id = 0) and (for_categories LIKE ? OR for_categories LIKE ? OR for_categories LIKE ? OR for_categories LIKE ?';
             } else {
                 $count++;
                 $catId = $parentCategory['category_id'];
                 $queryForFeatureGroup .= 'OR product_features.for_categories LIKE ? OR product_features.for_categories LIKE ? OR product_features.for_categories LIKE ? OR product_features.for_categories LIKE ?';
                 $queryForFeature .= 'OR for_categories LIKE ? OR for_categories LIKE ? OR for_categories LIKE ? OR for_categories LIKE ?';
             }
             array_push($bindParamsForFeature, "%,{$catId}");
             array_push($bindParamsForFeature, "%,{$catId},%");
             array_push($bindParamsForFeature, "{$catId},%");
             array_push($bindParamsForFeature, "{$catId}");
             $parentCategory = array();
             $whereForCat = ['rawQuery' => 'parent_category_id = ?', "bindParams" => [$catId]];
             $parentCategory = $objModelCategory->getCategoryDetailsWhere($whereForCat);
             if (!$parentCategory) {
                 $catFlag = false;
             }
         }
         $queryForFeature .= ")";
         $queryForFeatureGroup .= ")";
         $whereForFeature = ['rawQuery' => $queryForFeature, 'bindParams' => $bindParamsForFeature];
         $featureDetails = json_decode($objModelProductFeature->getAllFeaturesWithVariantsWhere($whereForFeature), true);
         //            $featureDetails = json_decode($objModelProductFeature->getAllFeaturesWithFVRelationWhere($whereForFeature), true);
         $whereForFeatureGroup = ['rawQuery' => $queryForFeatureGroup, 'bindParams' => $bindParamsForFeature];
         $featureGroups = json_decode($objModelProductFeature->getAllFGsWithFsWhere($whereForFeatureGroup), true);
         foreach ($featureGroups['data'] as $keyFG => $valueFG) {
             $whereForFs = ['rawQuery' => "product_features.parent_id IN (?)", "bindParams" => [$valueFG['feature_ids']]];
             $featureGroups['data'][$keyFG]['featureDetails'] = json_decode($objModelProductFeature->getAllFeaturesWithVariantsWhere($whereForFs), true)['data'];
         }
         $whereForFVRelation = ['rawQuery' => "product_id = ?", 'bindParams' => [$productId]];
         $fvRelations = $objModelProductFeatureVariantRelation->getAllFeatureVariantRelationsWhere($whereForFVRelation);
         //            dd($fvRelations);
         $response['code'] = $featureDetails['code'];
         $response['message'] = $featureDetails['message'];
         $response['data']['featureDetails'] = $featureDetails['data'];
         $response['data']['featureGroupDetails'] = $featureGroups['data'];
         //GET from options
         $whereForOptions = ['rawQuery' => 'status = 1'];
         $allOptions = $objModelProductOption->getAllOptionsWhere($whereForOptions);
         //GET from option_variants
         //            $objModelProductOptionVariant->getVariants
         //GET from option_variant_relation
         $whereForOptVar = ['rawQuery' => "1"];
         //product_id = ?", 'bindParams' => [$productId]];
         $whereForJoin = ['column' => 'product_id', 'condition' => '=', 'value' => "{$productId}"];
         $dataOptVarWithRelations = json_decode($objModelProductOptionVariant->getOptionVarWithRelationsWhere($whereForOptVar, ['*'], $whereForJoin), true);
         //            dd(json_decode($dataOptVarWithRelations, true));//$objModelProductOptionVariantRelation
         //GET from option_variants_combination
         $whereForOptVarCombinations = ['rawQuery' => "product_id = ?", 'bindParams' => [$productId]];
         $dataOptVarCombs = json_decode($objModelProductOptVarCombination->getAllCombinationsWhere($whereForOptVarCombinations), true);
         //            dd(json_decode($dataOptVarCombs, true));//$objModelProductOptionVariantRelation
         //GET from product_images
         $whereForImages = ['rawQuery' => 'for_product_id = ? and for_combination_id = ?', 'bindParams' => [$productId, 0]];
         $dataDefaultImages = json_decode($objModelProductImage->getAllImagesWhere($whereForImages), true);
         //            dd($dataImages);
         if ($request->isMethod('post')) {
             dd($request);
             //            $inputData = $request->input('product_data');//Excludes image
             $inputData = $request->all()['product_data'];
             //Includes image
             //            print_a($inputData['options']);
             //            print_a($_FILES);
             $returnData = ['code' => 400, "message" => "Nothing to update.", "data" => null];
             if (isset($inputData['updateFormName'])) {
                 $updateFormName = $inputData['updateFormName'];
                 $errors = array();
                 switch ($updateFormName) {
                     case "general":
                         $rules = ['product_name' => 'required', 'price' => 'required', 'in_stock' => 'required', 'comment' => 'max:100'];
                         $messages = array();
                         $validator = Validator::make($inputData, $rules, $messages);
                         if ($validator->fails()) {
                             return Redirect::back()->with(["code" => 400, "status" => 'error', 'message' => 'Please correct the following errors.'])->withErrors($validator)->withInput();
                         } else {
                             $productData = array();
                             $productData['product_name'] = trim($inputData['product_name']);
                             $productData['for_shop_id'] = $inputData['shop_id'];
                             if (array_key_exists('product_type', $inputData)) {
                                 $productData['product_type'] = 1;
                             }
                             $productData['min_qty'] = $inputData['minimum_order_quantity'];
                             $productData['max_qty'] = $inputData['maximum_order_quantity'];
                             $productData['category_id'] = $inputData['category_id'];
                             $productData['for_gender'] = $inputData['for_gender'];
                             $productData['price_total'] = $inputData['price'];
                             $productData['list_price'] = $inputData['list_price'];
                             $productData['in_stock'] = $inputData['in_stock'];
                             $productData['added_date'] = time();
                             $productData['added_by'] = $userId;
                             $productData['status_set_by'] = $userId;
                             $returnData = $objModelProducts->updateProductsWhere($productData);
                             //                                $returnData['code'] = 200;
                             //                                $returnData['message'] = "General details saved successfully";
                             //                                $returnData['data'] = null;
                         }
                         //--------------------------PRODUCT-METADATA----------------------------//
                         $productMetaData['product_id'] = $productId;
                         $productMetaData['full_description'] = trim($inputData['full_description']);
                         $productMetaData['short_description'] = trim($inputData['short_description']);
                         $productMetaData['weight'] = $inputData['shipping_properties']['weight'];
                         $productMetaData['shipping_freight'] = $inputData['shipping_properties']['shipping_freight'];
                         $shippingParams = array();
                         $shippingParams['min_items'] = $inputData['shipping_properties']['min_items'];
                         $shippingParams['max_items'] = $inputData['shipping_properties']['min_items'];
                         if (array_key_exists('box_length', $inputData['shipping_properties'])) {
                             $shippingParams['box_length'] = $inputData['shipping_properties']['box_length'];
                         }
                         if (array_key_exists('box_width', $inputData['shipping_properties'])) {
                             $shippingParams['box_width'] = $inputData['shipping_properties']['box_width'];
                         }
                         if (array_key_exists('box_height', $inputData['shipping_properties'])) {
                             $shippingParams['box_height'] = $inputData['shipping_properties']['box_height'];
                         }
                         $productMetaData['shipping_params'] = json_encode($shippingParams);
                         $productMetaData['quantity_discount'] = json_encode($inputData['quantity_discount']);
                         $productMetaData['product_tabs'] = json_encode($inputData['product_tabs']);
                         $insertedProductMetaId = $objModelProductMeta->addProductMetaData($productMetaData);
                         if (!$insertedProductMetaId) {
                             $errors[] = 'Sorry, some of the product data were not added, please update the same on the edit section.';
                         }
                         //--------------------------END PRODUCT-METADATA----------------------------//
                         //------------------------PRODUCT FEATURES START HERE---------------------//
                         if (array_key_exists('features', $inputData)) {
                             $productDataFeatures = $inputData['features'];
                             $fvrDataToInsert = array();
                             foreach ($productDataFeatures as $keyPDF => $valuePDF) {
                                 if (array_key_exists("single", $productDataFeatures[$keyPDF])) {
                                     //                            $fvrDataToInsert[] = ['product_id' => $insertedProductId, 'feature_id' => $keyPDF, 'variant_ids' => 0, 'display_status' => $productDataFeatures[$keyPDF]['status']];
                                     $objModelProductFeatureVariantRelation->addFeatureVariantRelation(['product_id' => $insertedProductId, 'feature_id' => $keyPDF, 'variant_ids' => 0, 'display_status' => $productDataFeatures[$keyPDF]['status']]);
                                 } else {
                                     if (array_key_exists("muliple", $productDataFeatures[$keyPDF])) {
                                         //                            $fvrDataToInsert[] = ['product_id' => $insertedProductId, 'feature_id' => $keyPDF, 'variant_ids' => implode(",", array_keys($valuePDF['multiple'])), 'display_status' => $valuePDF['status']];
                                         $objModelProductFeatureVariantRelation->addFeatureVariantRelation(['product_id' => $insertedProductId, 'feature_id' => $keyPDF, 'variant_ids' => implode(",", array_keys($valuePDF['multiple'])), 'display_status' => $valuePDF['status']]);
                                     } else {
                                         if (array_key_exists("select", $productDataFeatures[$keyPDF])) {
                                             //                            $fvrDataToInsert[] = ['product_id' => $insertedProductId, 'feature_id' => $keyPDF, 'variant_ids' => $valuePDF['select'], 'display_status' => $valuePDF['status']];
                                             $objModelProductFeatureVariantRelation->addFeatureVariantRelation(['product_id' => $insertedProductId, 'feature_id' => $keyPDF, 'variant_ids' => "" . $valuePDF['select'], 'display_status' => $valuePDF['status']]);
                                         }
                                     }
                                 }
                             }
                             //                    $objModelProductFeatureVariantRelation->addFeatureVariantRelation($fvrDataToInsert);
                         }
                         //------------------------PRODUCT FEATURES END HERE---------------------//
                         break;
                         //TODO update main image here
                     //TODO update main image here
                     case "images":
                         $rules = ['mainimage' => 'image|mimes:jpeg,bmp,png|max:1000'];
                         $messages['mainimage.image'] = 'Only jpg, jpeg, gif images allowed for upload.';
                         $validator = Validator::make($inputData, $rules, $messages);
                         if ($validator->fails()) {
                             return Redirect::back()->with(["code" => 400, "status" => 'error', 'message' => 'Please correct the following errors.'])->withErrors($validator)->withInput();
                         } else {
                             //TODO update otherimages here
                             //----------------------------PRODUCT-IMAGES------------------------------//
                             $productImages = $_FILES['product_data'];
                             $imageData = array();
                             if ($productImages['error']['mainimage'] == 0) {
                                 $mainImageURL = uploadImageToStoragePath($productImages['tmp_name']['mainimage'], 'product_' . $insertedProductId, 'product_' . $insertedProductId . '_0_' . time() . '.jpg', 724, 1024);
                                 if ($mainImageURL) {
                                     $mainImageData['for_product_id'] = $insertedProductId;
                                     $mainImageData['image_type'] = 0;
                                     $mainImageData['image_upload_type'] = 0;
                                     $mainImageData['image_url'] = $mainImageURL;
                                     $imageData[] = $mainImageData;
                                 }
                             } else {
                                 $errors[] = 'Sorry, something went wrong. Main image could not be uploaded, You can upload it on edit section.';
                             }
                             if (array_key_exists('otherimages', $productImages['name'])) {
                                 foreach ($productImages['tmp_name']['otherimages'] as $otherImageKey => $otherImage) {
                                     if ($otherImage != '') {
                                         $otherImageURL = uploadImageToStoragePath($otherImage, 'product_' . $insertedProductId, 'product_' . $insertedProductId . '_' . ($otherImageKey + 1) . '_' . time() . '.jpg', 724, 1024);
                                         if ($otherImageURL) {
                                             $otherImageData['for_product_id'] = $insertedProductId;
                                             $otherImageData['image_type'] = 1;
                                             $otherImageData['image_upload_type'] = 0;
                                             $otherImageData['image_url'] = $otherImageURL;
                                             $imageData[] = $otherImageData;
                                         }
                                     }
                                 }
                             }
                             if (!empty($imageData)) {
                                 $objModelProductImage->addNewImage($imageData);
                             }
                             //--------------------------END PRODUCT-IMAGES----------------------------//
                             $returnData['code'] = 200;
                             $returnData['message'] = "Images updated successfully";
                             $returnData['data'] = null;
                         }
                         break;
                     case "options":
                         $rules = ['mainimage' => 'image|mimes:jpeg,bmp,png|max:1000'];
                         $messages['mainimage.image'] = 'Only jpg, jpeg, gif images allowed for upload.';
                         $validator = Validator::make($inputData, $rules, $messages);
                         if ($validator->fails()) {
                             return Redirect::back()->with(["code" => 400, "status" => 'error', 'message' => 'Please correct the following errors.'])->withErrors($validator)->withInput();
                         } else {
                             //TODO options code here
                             if (array_key_exists('options', $inputData)) {
                                 $finalOptionVariantRelationData = array();
                                 $varDataForCombinations = array();
                                 foreach ($inputData['options'] as $key => $optionValue) {
                                     $optionVariantRelationData['product_id'] = $insertedProductId;
                                     $optionVariantRelationData['option_id'] = $optionValue['option_id'];
                                     $optionVariantRelationData['status'] = $optionValue['status'];
                                     $tempOptionVariantData = array();
                                     $variantIds = array();
                                     //-------------------------OLD OPTION VARIANT START-----------------------//
                                     /*
                                     if (array_key_exists('variantData', $optionValue)) {
                                         foreach ($optionValue['variantData'] as $variantKey => $variantValue) {
                                             $temp = array();
                                             if ($variantValue['variant_id'] == 0) {
                                                 $variantData['option_id'] = $optionValue['option_id'];
                                                 $variantData['variant_name'] = $variantValue['variant_name'];
                                                 $variantData['added_by'] = $userId;
                                                 $variantData['status'] = $variantValue['status'];
                                                 $variantData['created_at'] = NULL;
                                     
                                                 $insertedVariantId = $objModelProductOptionVariant->addNewVariantAndGetID($variantData);
                                                 if ($insertedVariantId > 0) {
                                                     array_push($variantIds, $insertedVariantId);
                                                     $temp['VID'] = $insertedVariantId;
                                                     $temp['VN'] = $variantValue['variant_name'];
                                                     $temp['PM'] = $variantValue['price_modifier'];
                                                     $temp['PMT'] = $variantValue['price_modifier_type'];
                                                     $temp['WM'] = $variantValue['weight_modifier'];
                                                     $temp['WMT'] = $variantValue['weight_modifier_type'];
                                                     $temp['STTS'] = $variantValue['status'];
                                                 }
                                             } else {
                                                 array_push($variantIds, $variantValue['variant_id']);
                                                 $temp['VID'] = $variantValue['variant_id'];
                                                 $temp['VN'] = $variantValue['variant_name'];
                                                 $temp['PM'] = $variantValue['price_modifier'];
                                                 $temp['PMT'] = $variantValue['price_modifier_type'];
                                                 $temp['WM'] = $variantValue['weight_modifier'];
                                                 $temp['WMT'] = $variantValue['weight_modifier_type'];
                                                 $temp['STTS'] = $variantValue['status'];
                                             }
                                             $tempOptionVariantData[] = $temp;
                                         }
                                         if (!empty($variantIds) && !empty($tempOptionVariantData)) {
                                             $optionVariantRelationData['variant_ids'] = implode(',', $variantIds);
                                             $optionVariantRelationData['variant_data'] = json_encode($tempOptionVariantData);
                                         }
                                     }
                                     */
                                     //-------------------------OLD OPTION VARIANT END-----------------------//
                                     //-------------------------NEW OPTION VARIANT START---------------------//
                                     if (array_key_exists('variantData', $optionValue)) {
                                         foreach ($optionValue['variantData'] as $variantKey => $variantValue) {
                                             $temp = array();
                                             array_push($variantIds, $variantValue['variant_id']);
                                             $temp['VID'] = $variantValue['variant_id'];
                                             $temp['VN'] = $variantValue['variant_name'];
                                             $temp['PM'] = $variantValue['price_modifier'];
                                             $temp['PMT'] = $variantValue['price_modifier_type'];
                                             $temp['WM'] = $variantValue['weight_modifier'];
                                             $temp['WMT'] = $variantValue['weight_modifier_type'];
                                             $temp['STTS'] = $variantValue['status'];
                                             $tempOptionVariantData[] = $temp;
                                         }
                                     }
                                     if (array_key_exists('variantDataNew', $optionValue)) {
                                         foreach ($optionValue['variantDataNew'] as $variantKey => $variantValue) {
                                             $temp = array();
                                             $variantData['option_id'] = $optionValue['option_id'];
                                             $variantData['variant_name'] = $variantValue['variant_name'];
                                             $variantData['added_by'] = $userId;
                                             $variantData['status'] = $variantValue['status'];
                                             $variantData['created_at'] = NULL;
                                             $insertedVariantId = $objModelProductOptionVariant->addNewVariantAndGetID($variantData);
                                             if ($insertedVariantId > 0) {
                                                 $varDataForCombinations[$variantValue['variant_id']] = $insertedVariantId;
                                                 array_push($variantIds, $insertedVariantId);
                                                 $temp['VID'] = $insertedVariantId;
                                                 $temp['VN'] = $variantValue['variant_name'];
                                                 $temp['PM'] = $variantValue['price_modifier'];
                                                 $temp['PMT'] = $variantValue['price_modifier_type'];
                                                 $temp['WM'] = $variantValue['weight_modifier'];
                                                 $temp['WMT'] = $variantValue['weight_modifier_type'];
                                                 $temp['STTS'] = $variantValue['status'];
                                             }
                                             $tempOptionVariantData[] = $temp;
                                         }
                                     }
                                     if (!empty($variantIds) && !empty($tempOptionVariantData)) {
                                         $optionVariantRelationData['variant_ids'] = implode(',', $variantIds);
                                         $optionVariantRelationData['variant_data'] = json_encode($tempOptionVariantData);
                                     }
                                     //-------------------------NEW OPTION VARIANT END---------------------//
                                     $finalOptionVariantRelationData[] = $optionVariantRelationData;
                                 }
                                 if (!empty($finalOptionVariantRelationData)) {
                                     $objModelProductOptionVariantRelation->addNewOptionVariantRelation($finalOptionVariantRelationData);
                                 }
                                 //------------------------PRODUCT OPTION COMBINATIONS START HERE---------------------//
                                 foreach ($inputData['opt_combination'] as $keyCombination => $valueCombination) {
                                     $flags = explode("_", $valueCombination['newflag']);
                                     $combinationVarIds = explode("_", $keyCombination);
                                     $flagKeys = array_keys($flags, "1");
                                     foreach ($flagKeys as $keyFK => $valueFK) {
                                         $combinationVarIds[$keyFK] = $varDataForCombinations[$combinationVarIds[[$keyFK]]];
                                     }
                                     //TODO ADD BARCODE, shippig info and image data for the combination here
                                     $dataCombinations['product_id'] = $insertedProductId;
                                     $dataCombinations['variant_ids'] = implode("_", $combinationVarIds);
                                     $dataCombinations['quantity'] = $valueCombination['quantity'];
                                     $dataCombinations['exception_flag'] = 0;
                                     if (isset($valueCombination['excludeflag']) && $valueCombination['excludeflag'] == 'on') {
                                         $dataCombinations['exception_flag'] = 1;
                                     }
                                     $objModelProductOptVarCombination->addNewOptionVariantsCombination($dataCombinations);
                                 }
                                 //------------------------PRODUCT OPTION COMBINATIONS END HERE---------------------//
                             }
                             $returnData['code'] = 200;
                             $returnData['message'] = "Options saved successfully";
                             $returnData['data'] = null;
                         }
                         break;
                         /* case "features":
                            $returnData['code'] = 200;
                            $returnData['message'] = "Features saved successfully";
                            $returnData['data'] = null;
                            break; */
                     /* case "features":
                        $returnData['code'] = 200;
                        $returnData['message'] = "Features saved successfully";
                        $returnData['data'] = null;
                        break; */
                     case "filters":
                         $rules = ['mainimage' => 'image|mimes:jpeg,bmp,png|max:1000'];
                         $messages['mainimage.image'] = 'Only jpg, jpeg, gif images allowed for upload.';
                         $validator = Validator::make($inputData, $rules, $messages);
                         if ($validator->fails()) {
                             return Redirect::back()->with(["code" => 400, "status" => 'error', 'message' => 'Please correct the following errors.'])->withErrors($validator)->withInput();
                         } else {
                             $returnData['code'] = 200;
                             $returnData['message'] = "Filters saved successfully";
                             $returnData['data'] = null;
                         }
                         break;
                     case "tabs":
                         $rules = ['mainimage' => 'image|mimes:jpeg,bmp,png|max:1000'];
                         $messages['mainimage.image'] = 'Only jpg, jpeg, gif images allowed for upload.';
                         $validator = Validator::make($inputData, $rules, $messages);
                         if ($validator->fails()) {
                             return Redirect::back()->with(["code" => 400, "status" => 'error', 'message' => 'Please correct the following errors.'])->withErrors($validator)->withInput();
                         } else {
                             $returnData['code'] = 200;
                             $returnData['message'] = "Tab details saved successfully";
                             $returnData['data'] = null;
                         }
                         break;
                     default:
                         break;
                 }
             }
         }
         foreach ($allCategories as $key => $value) {
             $allCategories[$key]->display_name = $this->getCategoryDisplayName($value->category_id);
         }
         return view('Admin/Views/product/editProduct', ['code' => '', 'allCategories' => $allCategories, 'allOptions' => $allOptions, 'featureGroups' => json_decode($allFeatureGroups, true), 'productData' => $productData['data'], 'dataOptVarWithRelations' => $dataOptVarWithRelations, 'dataOptVarCombs' => $dataOptVarCombs, 'dataDefaultImages' => $dataDefaultImages]);
     } else {
         return view('Admin/Views/product/editProduct', ['code' => '400', 'message' => 'No such product exists.', 'productData' => array()]);
     }
 }
 public function editFeature(Request $request, $featureId)
 {
     $objModelFeatures = ProductFeatures::getInstance();
     $objModelCategory = ProductCategory::getInstance();
     $objModelFeatureVariants = ProductFeatureVariants::getInstance();
     $whereForFeatureGroup = ['rawQuery' => 'group_flag =? and status = ?', 'bindParams' => [1, 1]];
     $allFeatureGroups = $objModelFeatures->getAllFeaturesWhere($whereForFeatureGroup);
     $whereForFeature = ['rawQuery' => 'feature_id = ? and group_flag=?', 'bindParams' => [$featureId, 0]];
     $featureDetails = $objModelFeatures->getFeatureWhere($whereForFeature);
     $whereForCat = ['rawQuery' => 'category_status =?', 'bindParams' => [1]];
     $allCategories = $objModelCategory->getAllCategoriesWhere($whereForCat);
     $whereForFV = ['rawQuery' => 'feature_id = ?', 'bindParams' => [$featureId]];
     $fvData = $objModelFeatureVariants->getAllFeatureVariantsWhere($whereForFV);
     if ($request->isMethod('post')) {
         //            echo "<pre>"; print_r($request->input()); die;
         $dataUpdateFeature = array();
         $dataUpdateFeature['parent_id'] = (string) json_decode($featureDetails, true)['data']['parent_id'];
         if ($request->input('parent_id') != null) {
             $dataUpdateFeature['parent_id'] = $request->input('parent_id');
         }
         $rulesEditdFeature = ['feature_name' => 'required|regex:/(^[A-Za-z0-9 ]+$)+/|max:255|unique:product_features,feature_name,' . $featureId . ',feature_id,parent_id,' . $dataUpdateFeature['parent_id'] . ',group_flag,0', 'full_description' => 'max:255', 'feature_type' => 'required', 'for_categories' => 'required'];
         $messagesEditFeature = ['feature_name.required' => 'Please enter a name', 'feature_name.alpha_num' => 'Please enter a valid name', 'full_description.max' => 'Description should not exceed 255 characters', 'feature_type.required' => 'Please select a feature type', 'for_categories.required' => 'Please select atleast one category'];
         $featureVariants = $request->input('feature_variant')['name'];
         $featureVariantsDesc = $request->input('feature_variant')['description'];
         $featureVariantIds = $request->input('feature_variant')['variant_id'];
         //            echo '<pre>'; print_r($featureVariantIds); die;
         foreach ($featureVariants as $keyFV => $valueFV) {
             //NEED MORE VALIDATION HERE
             $rulesEditdFeature['feature_variant.name.' . $keyFV] = 'regex:/(^[A-Za-z0-9 ]+$)+/|max:255|unique:product_feature_variants,variant_name,' . (isset($featureVariantIds[$keyFV]) ? $featureVariantIds[$keyFV] : 'NULL') . ',variant_id,feature_id,' . $featureId;
             $rulesEditdFeature['feature_variant.description.' . $keyFV] = 'regex:/(^[A-Za-z0-9 ]+$)+/|max:255';
             $messagesEditFeature['feature_variant.name.' . $keyFV . '.regex'] = 'Name can contain alphanumeric characters and spaces only';
             $messagesEditFeature['feature_variant.name.' . $keyFV . '.max'] = 'Name is too long to use. 255 characters max.';
             $messagesEditFeature['feature_variant.name.' . $keyFV . '.unique'] = 'Variant name already in use.';
             $messagesEditFeature['feature_variant.description.' . $keyFV . '.regex'] = 'Invalid description.';
         }
         //            $this->validate($request, $rulesEditdFeature, $messagesEditFeature);
         $validator = Validator::make($request->all(), $rulesEditdFeature, $messagesEditFeature);
         if ($validator->fails()) {
             return Redirect::back()->with(["code" => '400', 'message' => 'Please correct the following errors.'])->withErrors($validator)->withInput();
         } else {
             $dataUpdateFeature['feature_name'] = $request->input('feature_name');
             $dataUpdateFeature['full_description'] = $request->input('full_description');
             $dataUpdateFeature['feature_type'] = $request->input('feature_type');
             $selectedCategories = $request->input('for_categories');
             $dataUpdateFeature['for_categories'] = implode(',', array_keys($selectedCategories));
             $dataUpdateFeature['display_on_product'] = 0;
             if ($request->input('display_on_product') != null) {
                 $dataUpdateFeature['display_on_product'] = 1;
             }
             $dataUpdateFeature['display_on_catalog'] = 0;
             if ($request->input('display_on_catalog') != null) {
                 $dataUpdateFeature['display_on_catalog'] = 1;
             }
             $dataUpdateFeature['group_flag'] = 0;
             $whereForFeatureUpdate = ['rawQuery' => 'feature_id = ?', 'bindParams' => [$featureId]];
             $updatedFeature = json_decode($objModelFeatures->updateFeatureWhere($dataUpdateFeature, $whereForFeatureUpdate), true);
             //CODE TO INSERT VARIANTS HERE
             $whereForVariantId = ['rawQuery' => 'feature_id =?', 'bindParams' => [$featureId]];
             $selectedVariantColumn = array(DB::raw('GROUP_CONCAT(variant_id) AS variant_ids'));
             $oldVariantIds = explode(',', json_decode($objModelFeatureVariants->getFeatureVariantWhere($whereForVariantId, $selectedVariantColumn), true)['data']['variant_ids']);
             $inputVariantIds = array();
             $updateVariantResultFlag = false;
             $newVariantResultFlag = false;
             $deletedVariantResultFlag = false;
             $variantIdsToDelete = $oldVariantIds;
             if ($dataUpdateFeature['feature_type'] != 0) {
                 foreach ($featureVariants as $keyFV => $valueFV) {
                     if ($valueFV != '') {
                         if (isset($featureVariantIds[$keyFV]) && in_array($featureVariantIds[$keyFV], $oldVariantIds)) {
                             //UPDATE VARIANT DETAILS
                             $inputVariantIds[] = $featureVariantIds[$keyFV];
                             $updateVariantData = '';
                             $updateVariantData['variant_name'] = $valueFV;
                             $updateVariantData['description'] = $featureVariantsDesc[$keyFV];
                             $whereForUpdateVariant = ['rawQuery' => 'variant_id =?', 'bindParams' => [$featureVariantIds[$keyFV]]];
                             $updateVariantResult = $objModelFeatureVariants->updateFeatureVariantWhere($updateVariantData, $whereForUpdateVariant);
                             if ($updateVariantResult) {
                                 $updateVariantResultFlag = true;
                             }
                         } else {
                             //ADD NEW VARIANT DETAILS
                             $newVariantData['feature_id'] = $featureId;
                             $newVariantData['variant_name'] = $valueFV;
                             //                            $newVariantData['added_by'] = $userId;
                             $newVariantData['description'] = $featureVariantsDesc[$keyFV];
                             $newInsertedVariantId = $objModelFeatureVariants->addFeatureVariant($newVariantData);
                             if ($newInsertedVariantId) {
                                 $newVariantResultFlag = true;
                             }
                         }
                     }
                 }
                 $variantIdsToDelete = array_diff($oldVariantIds, $inputVariantIds);
             }
             if (!empty($variantIdsToDelete)) {
                 $whereForDeleteVariant = ['rawQuery' => 'variant_id IN (?)', 'bindParams' => [implode(',', $variantIdsToDelete)]];
                 $deletedVariantResult = $objModelFeatureVariants->deleteFeatureVariantWhere($whereForDeleteVariant);
                 if ($deletedVariantResult) {
                     $deletedVariantResultFlag = true;
                 }
             }
             if (isset($updatedFeature) && $updatedFeature['code'] == 200 || isset($updateVariantResultFlag) && $updateVariantResultFlag || isset($newVariantResultFlag) && $newVariantResultFlag || isset($deletedVariantResultFlag) && $deletedVariantResultFlag) {
                 //ALL DETAILS UPDATED
                 return Redirect::back()->with(['code' => '200', 'message' => 'Changes saved successfully.']);
             } else {
                 //NOTHING TO UPDATE
                 return Redirect::back()->with(['code' => '200', 'message' => 'Nothing to update.']);
             }
         }
     }
     return view('Admin/Views/features/editFeature', ['code' => '', 'featureGroups' => json_decode($allFeatureGroups, true), 'allCategories' => $allCategories, 'featureDetails' => json_decode($featureDetails, true), 'fvData' => json_decode($fvData, true)]);
     //, ['successMsg' => $successMsg, 'errMsg' => $errMsg]
 }