Current File : /home/tradevaly/ladybagcollection.com/project/app/Http/Controllers/Api/Vendor/ProductController.php
<?php

namespace App\Http\Controllers\Api\Vendor;

use App\{
    Models\Product,
    Models\Gallery,
    Models\Category,
    Models\Currency,
    Models\Attribute,
    Models\Subcategory,
    Models\Childcategory,
    Models\AttributeOption,
    Http\Controllers\Controller,
    Http\Resources\ProductlistResource,
    Http\Resources\ProductDetailsResource
};

use Illuminate\{
    Http\Request,
    Validation\Rule,
    Support\Facades\Input
};

use DB;
use Auth;
use Image;
use Session;
use Validator;
use Datatables;


class ProductController extends Controller
{

    // Display All Type Of Products 

    public function index(Request $request) {
        try{
        $input = $request->all();
        $user = auth()->user();

        if(!empty($input)){
  
        $type              = isset($input['type']) ? $input['type'] : '';
        $typeCheck         = !empty($type) && in_array($type, ['Physical','Digital','License']);
        $highlight         = isset($input['highlight']) ? $input['highlight'] : '';
        $highlightCheck    = !empty($highlight) && in_array($highlight, ['featured','best','top','big','is_discount','hot','latest','trending','sale']);
        $productType       = isset($input['product_type']) ? $input['product_type'] : '';
        $productTypeCheck  = !empty($productType) && in_array($productType, ['normal','affiliate']);
        $catalog           = isset($input['catalog']) ? $input['catalog'] : '';
        $catalogCheck      = !empty($catalog) && $catalog == 'true';
        $limit             = isset($input['limit']) ? (int)$input['limit'] : 0;
  
        $prods = Product::whereUserId($user->id);
  
        if($typeCheck){
          $prods = $prods->whereType($type);
        }
  
        if($productTypeCheck){
          $prods = $prods->whereProductType($productType);
        }
  
        if($highlightCheck){
          if($highlight == 'featured'){
            $prods = $prods->whereFeatured(1);
          }else if($highlight == 'best'){
            $prods = $prods->whereBest(1);
          }else if($highlight == 'top'){
            $prods = $prods->whereTop(1);
          }else if($highlight == 'big'){
            $prods = $prods->whereBig(1);
          }else if($highlight == 'is_discount'){
            $prods = $prods->whereIsDiscount(1);
          }else if($highlight == 'hot'){
            $prods = $prods->whereHot(1);
          }else if($highlight == 'latest'){
            $prods = $prods->whereLatest(1);
          }else if($highlight == 'trending'){
            $prods = $prods->whereTrending(1);
          }else{
            $prods = $prods->whereSale(1);
          }        
        }
  
        if($limit == 0){
          $prods = $prods->get();
        }else{
          $prods = $prods->take($limit)->get();
        }

        if($catalogCheck){
            return response()->json(['status' => true, 'data' => ProductlistResource::collection($prods), 'error' => []]);
        }else{
            $datas =  Product::where('product_type','normal')->where('status','=',1)->where('is_catalog','=',1)->orderBy('id','desc')->get();
            return response()->json(['status' => true, 'data' => ProductlistResource::collection($datas), 'error' => []]);
        }

        }else{
  
          $prods = Product::whereUserId($user->id)->get();
          return response()->json(['status' => true, 'data' => ProductlistResource::collection($prods), 'error' => []]);
  
        }
      }
      catch(\Exception $e){
        return response()->json(['status' => true, 'data' => [], 'error' => ['message' => $e->getMessage()]]);
      }
      }
      
      

  
    // Display All Type Of Products Ends
      
    //*** GET Request
    public function status($id1,$id2)
    {
      try{
        $user = auth()->user();
        $data = Product::findOrFail($id1);
        if($data->user_id == $user->id){
            $data->status = $id2;
            $data->update();
            return response()->json(['status' => true, 'data' => ['message' => 'Status Updated Successfully.'], 'error' => []]);
        }else{
            return response()->json(['status' => false, 'data' => [], 'error' => ["message" => 'This item is not your.']]);
        }
      }
      catch(\Exception $e){
        return response()->json(['status' => true, 'data' => [], 'error' => ['message' => $e->getMessage()]]);
      }
    }
    


    //*** GET Request
    public function formInput(Request $request)
    {
  
        if($request->type == 'Physical')
        {
            $input = '[{
                
                "type" : "Physical",
                 "data":[
                 {
                   "label": "Product Name",
    				"type": "text",
    				"key": "name"
                },
                 {
                   "label": "Product Sku",
    				"type": "text",
    				"key": "sku"
                },
                 {
                   "label": "Allow Product Condition",
    				"type": "checkbox",
    				"key": "product_condition_check"
                },
                {
                   "label": "Product Condition",
    				"type": "selectbox",
    				"key": "product_condition"
                },
                 {
                   "label": "Category",
    				"type": "selectbox",
    				"key": "category_id"
                },
                 {
                   "label": "Sub Category",
    				"type": "selectbox",
    				"key": "subcategory_id"
                },
                 {
                   "label": "Child Category",
    				"type": "selectbox",
    				"key": "childcategory_id"
                },
                 
                 {
                   "label": "Current Featured Image",
    				"type": "file",
    				"key": "photo"
                },
                 {
                   "label": "Allow Estimated Shipping Time",
    				"type": "checkbox",
    				"key": "shipping_time_check"
                },
                 {
                   "label": "Product Estimated Shipping Time",
    				"type": "text",
    				"key": "ship"
                },
                 {
                   "label": "Allow Product Sizes",
    				"type": "checkbox",
    				"key": "size_check"
                },
                 {
                   "label": "Size Name",
    				"type": "text",
    				"key": "size[]"
                },
                 {
                   "label": "Size Qty",
    				"type": "text",
    				"key": "size_qty[]"
                },
                 {
                   "label": "Size Price",
    				"type": "text",
    				"key": "size_price[]"
                },
                 {
                   "label": "Allow Product Colors",
    				"type": "checkbox",
    				"key": "color_check"
                },
                 {
                   "label": "Product Colors",
    				"type": "text",
    				"key": "color[]"
                },
                 {
                   "label": "Allow Product Whole Sell",
    				"type": "checkbox",
    				"key": "whole_check"
                },
                 {
                   "label": "Enter Quantity",
    				"type": "text",
    				"key": "whole_sell_qty[]"
                },
                 {
                   "label": "Enter Discount Percentage",
    				"type": "text",
    				"key": "whole_sell_discount[]"
                },
                 {
                   "label": "Product Current Price",
    				"type": "text",
    				"key": "price"
                },
                 {
                   "label": "Product Previous Price",
    				"type": "text",
    				"key": "previous_price"
                },
                 {
                   "label": "Product Stock",
    				"type": "text",
    				"key": "stock"
                },
                 {
                   "label": "Allow Product Measurement",
    				"type": "selectbox",
    				"key": "measure_check"
                },
                 {
                   "label": "Product Measurement",
    				"type": "selectbox",
    				"key": "measure"
                },
                 {
                   "label": "Product Description",
    				"type": "textarea",
    				"key": "details"
                },
                 {
                   "label": "Product Buy/Return Policy",
    				"type": "textarea",
    				"key": "policy"
                },
                 {
                   "label": "Youtube Video URL",
    				"type": "text",
    				"key": "youtube"
                },
                 {
                   "label": "Allow Product SEO",
    				"type": "checkbox",
    				"key": "seo_check"
                },
                 {
                   "label": "Meta Tags",
    				"type": "text",
    				"key": "meta_tag[]"
                },
                 {
                   "label": "Meta Description",
    				"type": "textarea",
    				"key": "meta_description[]"
                },
                 {
                   "label": "Feature Keyword",
    				"type": "text",
    				"key": "features[]"
                },
                 {
                   "label": "Feature Color",
    				"type": "text",
    				"key": "colors[]"
                },
                 {
                   "label": "Tags ",
    				"type": "text",
    				"key": "tags[]"
                },
                 {
                   "label": "",
    				"type": "hidden",
    				"key": "type"
                }
                ]
             
                
            }]';  
            
            $response = json_decode($input,true);
            return response()->json(['status' => true, 'data' => $response, 'error' => []]);
        }
        elseif($request->type == 'Digital'){
            
            
             $input = '[{
                
                "type" : "Digital",
                 "data":[
                {
                   "label": "Product Name",
    				"type": "text",
    				"key": "name"
                },
                 {
                   "label": "Product Sku",
    				"type": "text",
    				"key": "sku"
                },
                {
                   "label": "Category",
    				"type": "selectbox",
    				"key": "category_id"
                },
                 {
                   "label": "Sub Category",
    				"type": "selectbox",
    				"key": "subcategory_id"
                },
                 {
                   "label": "Child Category",
    				"type": "selectbox",
    				"key": "childcategory_id"
                },
                 {
                   "label": "Select Upload Type",
    				"type": "selectbox",
    				"key": "type_check"
                },
                 {
                   "label": "Select File",
    				"type": "file",
    				"key": "file"
                },
                 {
                   "label": "Link",
    				"type": "text",
    				"key": "link"
                },
                 
                 {
                   "label": "Current Featured Image",
    				"type": "file",
    				"key": "photo"
                },
                
                 {
                   "label": "Product Current Price",
    				"type": "text",
    				"key": "price"
                },
                 {
                   "label": "Product Previous Price",
    				"type": "text",
    				"key": "previous_price"
                },
                 
                 {
                   "label": "Product Description",
    				"type": "textarea",
    				"key": "details"
                },
                 {
                   "label": "Product Buy/Return Policy",
    				"type": "textarea",
    				"key": "policy"
                },
                 {
                   "label": "Youtube Video URL",
    				"type": "text",
    				"key": "youtube"
                },
                 {
                   "label": "Allow Product SEO",
    				"type": "checkbox",
    				"key": "seo_check"
                },
                 {
                   "label": "Meta Tags",
    				"type": "text",
    				"key": "meta_tag[]"
                },
               
                 {
                   "label": "Meta Description",
    				"type": "textarea",
    				"key": "meta_description[]"
                },
                 {
                   "label": "Feature Keyword",
    				"type": "text",
    				"key": "features[]"
                },
                 {
                   "label": "Feature Color",
    				"type": "text",
    				"key": "colors[]"
                },
                 {
                   "label": "Tags ",
    				"type": "text",
    				"key": "tags[]"
                },
                 {
                   "label": "",
    				"type": "hidden",
    				"key": "type"
                }
                ]
             
                
            }]';  
            
            $response = json_decode($input,true);
            return response()->json(['status' => true, 'data' => $response, 'error' => []]);
            
        
            
        }
        
        elseif($request->type == 'License'){
      
      
        $input = '[{
                
                "type" : "License",
                 "data":[
                {
                   "label": "Product Name",
    				"type": "text",
    				"key": "name"
                },
                 {
                   "label": "Product Sku",
    				"type": "text",
    				"key": "sku"
                },
                 {
                   "label": "Category",
    				"type": "selectbox",
    				"key": "category_id"
                },
                 {
                   "label": "Sub Category",
    				"type": "selectbox",
    				"key": "subcategory_id"
                },
                 {
                   "label": "Child Category",
    				"type": "selectbox",
    				"key": "childcategory_id"
                },
                 {
                   "label": "Select Upload Type",
    				"type": "selectbox",
    				"key": "type_check"
                },
                 {
                   "label": "Select File",
    				"type": "file",
    				"key": "file"
                },
                 {
                   "label": "Link",
    				"type": "text",
    				"key": "link"
                },
                 
                 {
                   "label": "Current Featured Image",
    				"type": "file",
    				"key": "photo"
                },
               
                 
                {
                   "label": "Product Current Price",
    				"type": "text",
    				"key": "price"
                },
                 {
                   "label": "Product Previous Price",
    				"type": "text",
    				"key": "previous_price"
                },
                 {
                   "label": "Product License Key",
    				"type": "text",
    				"key": "license[]"
                },
                 {
                   "label": "Product License Quantity",
    				"type": "text",
    				"key": "license_qty[]"
                },
                 
                 {
                   "label": "Product Description",
    				"type": "textarea",
    				"key": "details"
                },
                 {
                   "label": "Product Buy/Return Policy",
    				"type": "textarea",
    				"key": "policy"
                },
                 {
                   "label": "Youtube Video URL",
    				"type": "text",
    				"key": "youtube"
                },
                 {
                   "label": "Allow Product SEO",
    				"type": "checkbox",
    				"key": "seo_check"
                },
                 {
                   "label": "Meta Tags",
    				"type": "text",
    				"key": "meta_tag[]"
                },
               
                 {
                   "label": "Meta Description",
    				"type": "textarea",
    				"key": "meta_description[]"
                },
                 {
                   "label": "Feature Keyword",
    				"type": "text",
    				"key": "features[]"
                },
                 {
                   "label": "Feature Color",
    				"type": "text",
    				"key": "colors[]"
                },
                 {
                   "label": "Tags",
    				"type": "text",
    				"key": "tags[]"
                },
                 {
                   "label": "Product Platform",
    				"type": "text",
    				"key": "platform"
                },
                 {
                   "label": "Product Region",
    				"type": "text",
    				"key": "region"
                },
                 {
                   "label": "License Type",
    				"type": "text",
    				"key": "license_type"
                },
                 {
                   "label": "",
    				"type": "hidden",
    				"key": "type"
                }
                ]
             
                
            }]';  
            
            $response = json_decode($input,true);
            return response()->json(['status' => true, 'data' => $response, 'error' => []]);
            
                  
        }elseif($request->type == 'Affiliate'){
            
                   $input = '[{
                
                "type" : "Affiliate",
                 "data":[
                {
                   "label": "Product Name",
    				"type": "text",
    				"key": "name"
                },
                 {
                   "label": "Product Sku",
    				"type": "text",
    				"key": "sku"
                },
                 {
                   "label": "Product Affiliate Link",
    				"type": "text",
    				"key": "affiliate_link"
                },
                 {
                   "label": "Allow Product Condition",
    				"type": "checkbox",
    				"key": "product_condition_check"
                },
                 {
                   "label": "Allow Product Condition",
    				"type": "selectbox",
    				"key": "product_condition_check"
                },
                 {
                   "label": "Category",
    				"type": "selectbox",
    				"key": "category_id"
                },
                 {
                   "label": "Sub Category",
    				"type": "selectbox",
    				"key": "subcategory_id"
                },
                 {
                   "label": "Child Category",
    				"type": "selectbox",
    				"key": "childcategory_id"
                },

                 {
                   "label": "Feature Image Source",
    				"type": "selectbox",
    				"key": "image_source"
                },
                 
                {
                   "label": "Current Featured Image",
    				"type": "text",
    				"key": "photo"
                },
                {
                   "label": "Feature Image Link",
    				"type": "text",
    				"key": "photolink"
                },
                {
                   "label": "Allow Estimated Shipping Time",
    				"type": "checkbox",
    				"key": "shipping_time_check"
                },
                 {
                   "label": "Product Estimated Shipping Time",
    				"type": "text",
    				"key": "ship"
                },
                 {
                   "label": "Allow Product Sizes",
    				"type": "checkbox",
    				"key": "size_check"
                },
                 {
                   "label": "Size Name",
    				"type": "text",
    				"key": "size[]"
                },
                 {
                   "label": "Size Qty",
    				"type": "text",
    				"key": "size_qty[]"
                },
                 {
                   "label": "Size Price",
    				"type": "text",
    				"key": "size_price[]"
                },
                 {
                   "label": "Allow Product Colors",
    				"type": "checkbox",
    				"key": "color_check"
                },
                 {
                   "label": "Product Colors",
    				"type": "text",
    				"key": "color[]"
                },
                {
                   "label": "Product Current Price",
    				"type": "text",
    				"key": "price"
                },
                 {
                   "label": "Product Previous Price",
    				"type": "text",
    				"key": "previous_price"
                },
                 {
                   "label": "Product Stock",
    				"type": "text",
    				"key": "stock"
                },
                 
                 {
                   "label": "Product Description",
    				"type": "textarea",
    				"key": "details"
                },
                 {
                   "label": "Product Buy/Return Policy",
    				"type": "textarea",
    				"key": "policy"
                },
                 {
                   "label": "Youtube Video URL",
    				"type": "text",
    				"key": "youtube"
                },
                 {
                   "label": "Allow Product SEO",
    				"type": "checkbox",
    				"key": "seo_check"
                },
                 {
                   "label": "Meta Tags",
    				"type": "text",
    				"key": "meta_tag[]"
                },
               
                 {
                   "label": "Meta Description",
    				"type": "textarea",
    				"key": "meta_description[]"
                },
                 {
                   "label": "Feature Keyword",
    				"type": "text",
    				"key": "features[]"
                },
                 {
                   "label": "Feature Color",
    				"type": "text",
    				"key": "colors[]"
                },
                 {
                   "label": "Tags",
    				"type": "text",
    				"key": "tags[]"
                },
        
                 {
                   "label": "",
    				"type": "hidden",
    				"key": "type"
                }
                ]
             
                
            }]';  
            
            $response = json_decode($input,true);
            return response()->json(['status' => true, 'data' => $response, 'error' => []]);
            
            
            
        }

        
        $response = json_decode($input,true);
        
        return response()->json(['status' => true, 'data' => $response, 'error' => []]);
        
    }


    //*** POST Request
    public function store(Request $request)
    {
        
       
        try{
        $user = auth()->user();
        if(count($user->subscribes) == 0){
          return response()->json(['status' => false, 'data' => [], 'error' => ["message" => 'Please purchase a subscription plan.']]);
        }
        $package = $user->subscribes()->orderBy('id','desc')->first();
        $prods = $user->products()->orderBy('id','desc')->get()->count();

        if($prods < $package->allowed_products || $package->allowed_products == 0)
        {

        //--- Validation Section
        $rules = [
               'name'         => 'required',
               'price'        => 'required',
               'file'         => 'mimes:zip',
            //   'photo'        => 'mimes:jpeg,jpg,png,svg',
               'type'         => [
                                'required',
                                Rule::in(['Physical', 'Digital', 'License']),
                                 ],
               'product_type' => [
                                'required',
                                Rule::in(['normal', 'affiliate']),
                                 ],
                ];

        $validator = Validator::make(Input::all(), $rules);

        if ($validator->fails()) {
          return response()->json(['status' => false, 'data' => [], 'error' => $validator->errors()]);
        }
        //--- Validation Section Ends

        //--- Logic Section
            $data = new Product;
            $sign = Currency::where('is_default','=',1)->first();
            $input = $request->all();
            // Check File
            if ($file = $request->file('file'))
            {
                $name = time().str_replace(' ', '', $file->getClientOriginalName());
                $file->move('assets/files',$name);
                $input['file'] = $name;
            }

            if ($file = $request->file('photo')) 
            {      
               $name = time().str_replace(' ', '', $file->getClientOriginalName());
               $file->move('assets/images/products',$name);           
               $input['photo'] = $name;
            } 
            
              // Check Size

                if(empty($request->size_check ))
                {
                    $input['size'] = null;
                    $input['size_qty'] = null;
                    $input['size_price'] = null;
                }
                else{
                        if(in_array(null, $request->size) || in_array(null, $request->size_qty) || in_array(null, $request->size_price))
                        {
                            $input['size'] = null;
                            $input['size_qty'] = null;
                            $input['size_price'] = null;
                        }
                        else
                        {
                            $input['size'] = implode(',', $request->size);
                            $input['size_qty'] = implode(',', $request->size_qty);
                            $input['size_price'] = implode(',', $request->size_price);
                        }
                }

       

                // Check Color

                if(empty($request->color_check ))
                {
                    $input['color'] = null;
                }
                else{
                    if (!empty($request->color))
                     {
                        $input['color'] = implode(',', $request->color);
                     }
                    if (empty($request->color))
                     {
                        $input['color'] = null;
                     }
                }

            // Check Physical
            if($request->type == "Physical")
            {

                    //--- Validation Section
                    $rules = ['sku'      => 'min:8|unique:products'];

                    $validator = Validator::make(Input::all(), $rules);

                    if ($validator->fails()) {
                      return response()->json(['status' => false, 'data' => [], 'error' => $validator->errors()]);
                    }
                    //--- Validation Section Ends


            // Check Condition
            if ($request->product_condition_check == ""){
                $input['product_condition'] = 0;
            }

            // Check Shipping Time
            if ($request->shipping_time_check == ""){
                $input['ship'] = null;
            }

            
            
    

            // Check Whole Sale
            if(empty($request->whole_check ))
            {
                $input['whole_sell_qty'] = null;
                $input['whole_sell_discount'] = null;
            }
            else{
                if(in_array(null, $request->whole_sell_qty) || in_array(null, $request->whole_sell_discount))
                {
                    $input['whole_sell_qty'] = null;
                    $input['whole_sell_discount'] = null;
                }
                else
                {
                    $input['whole_sell_qty'] = implode(',', $request->whole_sell_qty);
                    $input['whole_sell_discount'] = implode(',', $request->whole_sell_discount);
                }
            }

           
            // Check Measurement
            if ($request->mesasure_check == "")
             {
                $input['measure'] = null;
             }

            }
  
            // Check Seo
        if (empty($request->seo_check))
         {
            $input['meta_tag'] = null;
            $input['meta_description'] = null;
         }
         else {
        if (!empty($request->meta_tag))
         {
            $input['meta_tag'] = implode(',', $request->meta_tag);
         }
         }

             // Check License

            if($request->type == "License")
            {

                if(in_array(null, $request->license) || in_array(null, $request->license_qty))
                {
                    $input['license'] = null;
                    $input['license_qty'] = null;
                }
                else
                {
                    $input['license'] = implode(',,', $request->license);
                    $input['license_qty'] = implode(',', $request->license_qty);
                }

            }

            // Check Features
            if($request->features){
                if(in_array(null, $request->features) || in_array(null, $request->colors))
                {
                    $input['features'] = null;
                    $input['colors'] = null;
                }
                else
                {
                    $input['features'] = implode(',', str_replace(',',' ',$request->features));
                    $input['colors'] = implode(',', str_replace(',',' ',$request->colors));
                }
            }
 

            //tags
            if (!empty($request->tags))
             {
                $input['tags'] = implode(',', $request->tags);
             }

            // Conert Price According to Currency
            if($request->price){
             $input['price'] = ($input['price'] / $sign->value);
            }
            if($request->previous_price){
             $input['previous_price'] = ($input['previous_price'] / $sign->value);
            }
            
           

            $input['user_id'] = $user->id;

           // store filtering attributes for physical product
           $attrArr = [];
           if (!empty($request->category_id)) {
             $catAttrs = Attribute::where('attributable_id', $request->category_id)->where('attributable_type', 'App\Models\Category')->get();
             if (!empty($catAttrs)) {
               foreach ($catAttrs as $key => $catAttr) {
                 $in_name = $catAttr->input_name;
                 if ($request->has("$in_name")) {
                   $attrArr["$in_name"]["values"] = $request["$in_name"];
                   $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                   if ($catAttr->details_status) {
                     $attrArr["$in_name"]["details_status"] = 1;
                   } else {
                     $attrArr["$in_name"]["details_status"] = 0;
                   }
                 }
               }
             }
           }

           if (!empty($request->subcategory_id)) {
             $subAttrs = Attribute::where('attributable_id', $request->subcategory_id)->where('attributable_type', 'App\Models\Subcategory')->get();
             if (!empty($subAttrs)) {
               foreach ($subAttrs as $key => $subAttr) {
                 $in_name = $subAttr->input_name;
                 if ($request->has("$in_name")) {
                   $attrArr["$in_name"]["values"] = $request["$in_name"];
                   $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                   if ($subAttr->details_status) {
                     $attrArr["$in_name"]["details_status"] = 1;
                   } else {
                     $attrArr["$in_name"]["details_status"] = 0;
                   }
                 }
               }
             }
           }
           
           if (!empty($request->childcategory_id)) {
             $childAttrs = Attribute::where('attributable_id', $request->childcategory_id)->where('attributable_type', 'App\Models\Childcategory')->get();
             if (!empty($childAttrs)) {
               foreach ($childAttrs as $key => $childAttr) {
                 $in_name = $childAttr->input_name;
                 if ($request->has("$in_name")) {
                   $attrArr["$in_name"]["values"] = $request["$in_name"];
                   $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                   if ($childAttr->details_status) {
                     $attrArr["$in_name"]["details_status"] = 1;
                   } else {
                     $attrArr["$in_name"]["details_status"] = 0;
                   }
                 }
               }
             }
           }

           if (empty($attrArr)) {
             $input['attributes'] = NULL;
           } else {
             $jsonAttr = json_encode($attrArr);
             $input['attributes'] = $jsonAttr;
           }


            // Save Data
         
                $data->fill($input)->save();


            // Set SLug

                $prod = Product::find($data->id);
                if($prod->type != 'Physical'){
                    $prod->slug = str_slug($data->name,'-').'-'.strtolower(str_random(3).$data->id.str_random(3));
                }
                else {
                    $prod->slug = str_slug($data->name,'-').'-'.strtolower($data->sku);
                }
                // Set Photo
                $resizedImage = Image::make(public_path().'/assets/images/products/'.$prod->photo)->resize(800, null, function ($c) {
                    $c->aspectRatio();
                });
                $photo = time().str_random(8).'.jpg';
                $resizedImage->save(public_path().'/assets/images/products/'.$photo);

                // Set Thumbnail
                $background = Image::canvas(300, 300);
                $resizedImage = Image::make(public_path().'/assets/images/products/'.$prod->photo)->resize(300, 300, function ($c) {
                    $c->aspectRatio();
                    $c->upsize();
                });
                // insert resized image centered into background
                $background->insert($resizedImage, 'center');
                // save or do whatever you like
                $thumbnail = time().str_random(8).'.jpg';
                $background->save(public_path().'/assets/images/thumbnails/'.$thumbnail);

                $prod->thumbnail  = $thumbnail;
                $prod->photo  = $photo;
                $prod->update();

            //logic Section Ends

            //--- Redirect Section
            return response()->json(['status' => true, 'data' => new ProductDetailsResource($prod), 'error' => []]);
            //--- Redirect Section Ends
        }
        else
        {
            //--- Redirect Section
            return response()->json(['status' => false, 'data' => [], 'error' => ["message" => 'You Can\'t Add More Product.']]);
            //--- Redirect Section Ends
        }
      }
      catch(\Exception $e){
        return response()->json(['status' => true, 'data' => [], 'error' => ['message' => $e->getMessage()]]);
      }
    }



    //*** POST Request
    public function update(Request $request, $id)
    {
      try{
       $user = auth()->user();

        //--- Validation Section
        $rules = [
               'photo'      => 'mimes:jpeg,jpg,png,svg',
               'file'       => 'mimes:zip'
                ];

        $validator = Validator::make(Input::all(), $rules);

        if ($validator->fails()) {
          return response()->json(['status' => false, 'data' => [], 'error' => $validator->errors()]);
        }
        //--- Validation Section Ends

        //-- Logic Section

        $data = Product::findOrFail($id);

        $user = auth()->user();
        if($data->user_id != $user->id){
            return response()->json(['status' => false, 'data' => [], 'error' => ["message" => 'This item is not your.']]);
        }

        $sign = Currency::where('is_default','=',1)->first();
        $input = $request->all();
        if ($file = $request->file('photo')) 
        {              
            $name = time().str_replace(' ', '', $file->getClientOriginalName());
            $file->move('assets/images/products',$name);
            if($data->photo != null)
            {
                if (file_exists(public_path().'/assets/images/products/'.$data->photo)) {
                    unlink(public_path().'/assets/images/products/'.$data->photo);
                }
            }            
        $input['photo'] = $name;
        } 
            //Check Types
            if($request->type_check == 1)
            {
                $input['link'] = null;
            }
            else
            {
                if($data->file!=null){
                        if (file_exists(public_path().'/assets/files/'.$data->file)) {
                        unlink(public_path().'/assets/files/'.$data->file);
                    }
                }
                $input['file'] = null;
            }
            
            
            // Check Size

                        if(empty($request->size_check ))
                        {
                            $input['size'] = null;
                            $input['size_qty'] = null;
                            $input['size_price'] = null;
                        }
                        else{
                                if(in_array(null, $request->size) || in_array(null, $request->size_qty) || in_array(null, $request->size_price))
                                {
                                    $input['size'] = null;
                                    $input['size_qty'] = null;
                                    $input['size_price'] = null;
                                }
                                else
                                {
                                    $input['size'] = implode(',', $request->size);
                                    $input['size_qty'] = implode(',', $request->size_qty);
                                    $input['size_price'] = implode(',', $request->size_price);
                                }
                        }


                        // Check Color

                        if(empty($request->color_check ))
                        {
                            $input['color'] = null;
                        }
                        else{
                            if (!empty($request->color))
                             {
                                $input['color'] = implode(',', $request->color);
                             }
                            if (empty($request->color))
                             {
                                $input['color'] = null;
                             }
                        }

            // Check Physical
            if($data->type == "Physical")
            {

                    //--- Validation Section
                    $rules = ['sku' => 'min:8|unique:products,sku,'.$id];

                    $validator = Validator::make(Input::all(), $rules);

                    if ($validator->fails()) {
                      return response()->json(['status' => false, 'data' => [], 'error' => $validator->errors()]);
                    }
                    //--- Validation Section Ends

                        // Check Condition
                        if ($request->product_condition_check == ""){
                            $input['product_condition'] = 0;
                        }

                        // Check Shipping Time
                        if ($request->shipping_time_check == ""){
                            $input['ship'] = null;
                        }

                        
            // Check Whole Sale

            if(empty($request->whole_check ))
            {
                $input['whole_sell_qty'] = null;
                $input['whole_sell_discount'] = null;
            }
            else{
                if(in_array(null, $request->whole_sell_qty) || in_array(null, $request->whole_sell_discount))
                {
                $input['whole_sell_qty'] = null;
                $input['whole_sell_discount'] = null;
                }
                else
                {
                    $input['whole_sell_qty'] = implode(',', $request->whole_sell_qty);
                    $input['whole_sell_discount'] = implode(',', $request->whole_sell_discount);
                }
            }

                        // Check Color

                        if(empty($request->color_check ))
                        {
                            $input['color'] = null;
                        }
                        else{
                            if (!empty($request->color))
                             {
                                $input['color'] = implode(',', $request->color);
                             }
                            if (empty($request->color))
                             {
                                $input['color'] = null;
                             }
                        }

                        // Check Measure
                    if ($request->measure_check == "")
                     {
                        $input['measure'] = null;
                     }
            }

        // Check Seo

        if (empty($request->seo_check))
         {
            $input['meta_tag'] = null;
            $input['meta_description'] = null;
         }
         else {
        if (!empty($request->meta_tag))
         {
            $input['meta_tag'] = implode(',', $request->meta_tag);
         }
         }

        // Check License

        if($data->type == "License")
        {

          if(!in_array(null, $request->license) && !in_array(null, $request->license_qty))
          {
              $input['license'] = implode(',,', $request->license);
              $input['license_qty'] = implode(',', $request->license_qty);
          }
          else
          {
              if(in_array(null, $request->license) || in_array(null, $request->license_qty))
              {
                  $input['license'] = null;
                  $input['license_qty'] = null;
              }
              else
              {
                  $license = explode(',,', $prod->license);
                  $license_qty = explode(',', $prod->license_qty);
                  $input['license'] = implode(',,', $license);
                  $input['license_qty'] = implode(',', $license_qty);
              }
          }

        }
            // Check Features

            if($request->features){

              if(!in_array(null, $request->features) && !in_array(null, $request->colors))
              {
                      $input['features'] = implode(',', str_replace(',',' ',$request->features));
                      $input['colors'] = implode(',', str_replace(',',' ',$request->colors));
              }
              else
              {
                  if(in_array(null, $request->features) || in_array(null, $request->colors))
                  {
                      $input['features'] = null;
                      $input['colors'] = null;
                  }
                  else
                  {
                      $features = explode(',', $data->features);
                      $colors = explode(',', $data->colors);
                      $input['features'] = implode(',', $features);
                      $input['colors'] = implode(',', $colors);
                  }
              }
           }
        //Product Tags
        if (!empty($request->tags))
         {
            $input['tags'] = implode(',', $request->tags);
         }
        if (empty($request->tags))
         {
            $input['tags'] = null;
         }

         if($request->price){
          $input['price'] = ($input['price'] / $sign->value);
         }

         if($request->previous_price){
          $input['previous_price'] = ($input['previous_price'] / $sign->value);
         }

         $input['user_id'] = $user->id;

         // store filtering attributes for physical product
         $attrArr = [];
         if (!empty($request->category_id)) {
           $catAttrs = Attribute::where('attributable_id', $request->category_id)->where('attributable_type', 'App\Models\Category')->get();
           if (!empty($catAttrs)) {
             foreach ($catAttrs as $key => $catAttr) {
               $in_name = $catAttr->input_name;
               if ($request->has("$in_name")) {
                 $attrArr["$in_name"]["values"] = $request["$in_name"];
                 $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                 if ($catAttr->details_status) {
                   $attrArr["$in_name"]["details_status"] = 1;
                 } else {
                   $attrArr["$in_name"]["details_status"] = 0;
                 }
               }
             }
           }
         }

         if (!empty($request->subcategory_id)) {
           $subAttrs = Attribute::where('attributable_id', $request->subcategory_id)->where('attributable_type', 'App\Models\Subcategory')->get();
           if (!empty($subAttrs)) {
             foreach ($subAttrs as $key => $subAttr) {
               $in_name = $subAttr->input_name;
               if ($request->has("$in_name")) {
                 $attrArr["$in_name"]["values"] = $request["$in_name"];
                 $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                 if ($subAttr->details_status) {
                   $attrArr["$in_name"]["details_status"] = 1;
                 } else {
                   $attrArr["$in_name"]["details_status"] = 0;
                 }
               }
             }
           }
         }

         if (!empty($request->childcategory_id)) {
           $childAttrs = Attribute::where('attributable_id', $request->childcategory_id)->where('attributable_type', 'App\Models\Childcategory')->get();
           if (!empty($childAttrs)) {
             foreach ($childAttrs as $key => $childAttr) {
               $in_name = $childAttr->input_name;
               if ($request->has("$in_name")) {
                 $attrArr["$in_name"]["values"] = $request["$in_name"];
                 $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                 if ($childAttr->details_status) {
                   $attrArr["$in_name"]["details_status"] = 1;
                 } else {
                   $attrArr["$in_name"]["details_status"] = 0;
                 }
               }
             }
           }
         }

         if (empty($attrArr)) {
           $input['attributes'] = NULL;
         } else {
           $jsonAttr = json_encode($attrArr);
           $input['attributes'] = $jsonAttr;
         }


          $data->update($input);

         
        //-- Logic Section Ends

        $prod = Product::find($data->id);

        // Set SLug
        $prod->slug = str_slug($data->name,'-').'-'.strtolower($data->sku);

        // Set Photo
        $resizedImage = Image::make(public_path().'/assets/images/products/'.$prod->photo)->resize(800, null, function ($c) {
          $c->aspectRatio();
        });
        $photo = time().str_random(8).'.jpg';
        $resizedImage->save(public_path().'/assets/images/products/'.$photo);

        // Set Thumbnail
        $background = Image::canvas(300, 300);
        $resizedImage = Image::make(public_path().'/assets/images/products/'.$prod->photo)->resize(300, 300, function ($c) {
          $c->aspectRatio();
          $c->upsize();
        });

        // insert resized image centered into background
        $background->insert($resizedImage, 'center');

        // save or do whatever you like
        $thumbnail = time().str_random(8).'.jpg';
        $background->save(public_path().'/assets/images/thumbnails/'.$thumbnail);
        $prod->thumbnail  = $thumbnail;
        $prod->photo  = $photo;
        $prod->update();

        //--- Redirect Section
        return response()->json(['status' => true, 'data' => new ProductDetailsResource($prod), 'error' => []]);
        //--- Redirect Section Ends
      }
      catch(\Exception $e){
        return response()->json(['status' => true, 'data' => [], 'error' => ['message' => $e->getMessage()]]);
      }

    }

    //*** POST Request CATALOG
    public function catalogupdate(Request $request, $id)
    {
      try{
        $user = auth()->user();
        $package = $user->subscribes()->orderBy('id','desc')->first();
        $prods = $user->products()->orderBy('id','desc')->get()->count();
        $old_prod = Product::find($id);

        if($prods < $package->allowed_products || $package->allowed_products == 0)
        {
        //--- Validation Section
        $rules = [
          'name'         => 'required',
          'price'        => 'required',
          'file'         => 'mimes:zip',
          'photo'        => 'mimes:jpeg,jpg,png,svg',
          'type'         => [
                           'required',
                           Rule::in(['Physical', 'Digital', 'License']),
                            ],
          'product_type' => [
                           'required',
                           Rule::in(['normal', 'affiliate']),
                            ],
        ];

        $validator = Validator::make(Input::all(), $rules);

        if ($validator->fails()) {
          return response()->json(['status' => false, 'data' => [], 'error' => $validator->errors()]);
        }
        //--- Validation Section Ends

        //--- Logic Section
            $data = new Product;
            $sign = Currency::where('is_default','=',1)->first();
            $input = $request->all();
            // Check File

            if ($file = $request->file('file'))
            {
                $name = time().str_replace(' ', '', $file->getClientOriginalName());
                $file->move('assets/files',$name);
                $input['file'] = $name;
            }

            $image_name = '';
            if($request->is_photo == 1)
            {
                if ($file = $request->file('photo')) 
                {      
                   $name = time().str_replace(' ', '', $file->getClientOriginalName());
                   $file->move('assets/images/products',$name);           
                   $image_name = $name;
                } 
            }
            else {
             $image_name = $old_prod->photo;
            }

            $input['photo'] = $image_name;

            // Check Physical
            if($request->type == "Physical")
            {

            //--- Validation Section
            $rules = ['sku'      => 'min:8|unique:products'];

            $validator = Validator::make(Input::all(), $rules);

            if ($validator->fails()) {
              return response()->json(['status' => false, 'data' => [], 'error' => $validator->errors()]);
            }
            //--- Validation Section Ends

            // Check Condition
            if ($request->product_condition_check == ""){
                $input['product_condition'] = 0;
            }

            // Check Shipping Time
            if ($request->shipping_time_check == ""){
                $input['ship'] = null;
            }

            // Check Size
            if(empty($request->size_check ))
            {
                $input['size'] = null;
                $input['size_qty'] = null;
                $input['size_price'] = null;

            }
            else{
                    if(in_array(null, $request->size) || in_array(null, $request->size_qty))
                    {                  
                        $input['size'] = null;
                        $input['size_qty'] = null;
                        $input['size_price'] = null;
                    }
                    else
                    {
                        $input['size'] = implode(',', $request->size);
                        $input['size_qty'] = implode(',', $request->size_qty);
                        $input['size_price'] = implode(',', $request->size_price);
                    }
            }

            // Check Whole Sale
            if(empty($request->whole_check ))
            {
                $input['whole_sell_qty'] = null;
                $input['whole_sell_discount'] = null;
            }
            else{
                if(in_array(null, $request->whole_sell_qty) || in_array(null, $request->whole_sell_discount))
                {
                $input['whole_sell_qty'] = null;
                $input['whole_sell_discount'] = null;
                }
                else
                {
                    $input['whole_sell_qty'] = implode(',', $request->whole_sell_qty);
                    $input['whole_sell_discount'] = implode(',', $request->whole_sell_discount);
                }
            }

            // Check Color
            if(empty($request->color_check))
            {
                $input['color'] = null;
            }
            else{
                $input['color'] = implode(',', $request->color);
            }

            // Check Measurement
            if ($request->mesasure_check == "")
             {
                $input['measure'] = null;
             }

            }

            // Check Seo
            if (empty($request->seo_check))
            {
                $input['meta_tag'] = null;
                $input['meta_description'] = null;
            }
            else {
              if (!empty($request->meta_tag))
              {
                  $input['meta_tag'] = implode(',', $request->meta_tag);
              }
            }

             // Check License

            if($request->type == "License")
            {
                if(in_array(null, $request->license) || in_array(null, $request->license_qty))
                {
                    $input['license'] = null;
                    $input['license_qty'] = null;
                }
                else
                {
                    $input['license'] = implode(',,', $request->license);
                    $input['license_qty'] = implode(',', $request->license_qty);
                }
            }

            // Check Features
            if($request->features){
              if(in_array(null, $request->features) || in_array(null, $request->colors))
              {
                  $input['features'] = null;
                  $input['colors'] = null;
              }
              else
              {
                  $input['features'] = implode(',', str_replace(',',' ',$request->features));
                  $input['colors'] = implode(',', str_replace(',',' ',$request->colors));
              }
            }

            //tags
            if (!empty($request->tags))
            {
                $input['tags'] = implode(',', $request->tags);
            }

            // Convert Price According to Currency

            if($request->price){
              $input['price'] = ($input['price'] / $sign->value);
             }
    
             if($request->previous_price){
              $input['previous_price'] = ($input['previous_price'] / $sign->value);
             }

             $input['user_id'] = $user->id;

             // store filtering attributes for physical product
             $attrArr = [];
             if (!empty($request->category_id)) {
               $catAttrs = Attribute::where('attributable_id', $request->category_id)->where('attributable_type', 'App\Models\Category')->get();
               if (!empty($catAttrs)) {
                 foreach ($catAttrs as $key => $catAttr) {
                   $in_name = $catAttr->input_name;
                   if ($request->has("$in_name")) {
                     $attrArr["$in_name"]["values"] = $request["$in_name"];
                     $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                     if ($catAttr->details_status) {
                       $attrArr["$in_name"]["details_status"] = 1;
                     } else {
                       $attrArr["$in_name"]["details_status"] = 0;
                     }
                   }
                 }
               }
             }

             if (!empty($request->subcategory_id)) {
               $subAttrs = Attribute::where('attributable_id', $request->subcategory_id)->where('attributable_type', 'App\Models\Subcategory')->get();
               if (!empty($subAttrs)) {
                 foreach ($subAttrs as $key => $subAttr) {
                   $in_name = $subAttr->input_name;
                   if ($request->has("$in_name")) {
                     $attrArr["$in_name"]["values"] = $request["$in_name"];
                     $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                     if ($subAttr->details_status) {
                       $attrArr["$in_name"]["details_status"] = 1;
                     } else {
                       $attrArr["$in_name"]["details_status"] = 0;
                     }
                   }
                 }
               }
             }

             if (!empty($request->childcategory_id)) {
               $childAttrs = Attribute::where('attributable_id', $request->childcategory_id)->where('attributable_type', 'App\Models\Childcategory')->get();
               if (!empty($childAttrs)) {
                 foreach ($childAttrs as $key => $childAttr) {
                   $in_name = $childAttr->input_name;
                   if ($request->has("$in_name")) {
                     $attrArr["$in_name"]["values"] = $request["$in_name"];
                     $attrArr["$in_name"]["prices"] = $request["$in_name"."_price"];
                     if ($childAttr->details_status) {
                       $attrArr["$in_name"]["details_status"] = 1;
                     } else {
                       $attrArr["$in_name"]["details_status"] = 0;
                     }
                   }
                 }
               }
             }

             if (empty($attrArr)) {
               $input['attributes'] = NULL;
             } else {
               $jsonAttr = json_encode($attrArr);
               $input['attributes'] = $jsonAttr;
             }

            // Save Data

              $data->fill($input)->save();


            // Set SLug

                $prod = Product::find($data->id);
                if($prod->type != 'Physical'){
                    $prod->slug = str_slug($data->name,'-').'-'.strtolower(str_random(3).$data->id.str_random(3));
                }
                else {
                    $prod->slug = str_slug($data->name,'-').'-'.strtolower($data->sku);
                }
                $photo = $prod->photo;

                // Set Photo
                $resizedImage = Image::make(public_path().'/assets/images/products/'.$prod->photo)->resize(800, null, function ($c) {
                    $c->aspectRatio();
                });
                $photo = time().str_random(8).'.jpg';
                $resizedImage->save(public_path().'/assets/images/products/'.$photo);
                
                // Set Thumbnail

                 $background = Image::canvas(300, 300);
                 $resizedImage = Image::make(public_path().'/assets/images/products/'.$prod->photo)->resize(300, 300, function ($c) {
                     $c->aspectRatio();
                     $c->upsize();
                 });
                 // insert resized image centered into background
                 $background->insert($resizedImage, 'center');
                 // save or do whatever you like
                 $thumbnail = time().str_random(8).'.jpg';
                 $background->save(public_path().'/assets/images/thumbnails/'.$thumbnail);

                $prod->thumbnail  = $thumbnail;
                $prod->photo  = $photo;
                $prod->update();

        //logic Section Ends

        //--- Redirect Section
        return response()->json(['status' => true, 'data' => new ProductDetailsResource($prod), 'error' => []]);
        //--- Redirect Section Ends
        }
        else
        {
        //--- Redirect Section
        return response()->json(['status' => false, 'data' => [], 'error' => ["message" => 'You Can\'t Add More Product.']]);
        //--- Redirect Section Ends
        }
      }
      catch(\Exception $e){
        return response()->json(['status' => true, 'data' => [], 'error' => ['message' => $e->getMessage()]]);
      }
    }


    //*** GET Request
    public function destroy($id)
    {
      try{
      $user = auth()->user();
      $data = Product::find($id);
      if(!$data){
        return response()->json(['status' => false, 'data' => [], 'error' => ["message" => 'This item does not exist.']]);
      }
      if($data->user_id == $user->id){

        if($data->galleries->count() > 0)
        {
            foreach ($data->galleries as $gal) {
                    if (file_exists(public_path().'/assets/images/galleries/'.$gal->photo)) {
                        unlink(public_path().'/assets/images/galleries/'.$gal->photo);
                    }
                $gal->delete();
            }
        }

        if($data->ratings->count() > 0)
        {
            foreach ($data->ratings  as $gal) {
                $gal->delete();
            }
        }

        if($data->wishlists->count() > 0)
        {
            foreach ($data->wishlists as $gal) {
                $gal->delete();
            }
        }

        if($data->clicks->count() > 0)
        {
            foreach ($data->clicks as $gal) {
                $gal->delete();
            }
        }

        if($data->comments->count() > 0)
        {
            foreach ($data->comments as $gal) {
            if($gal->replies->count() > 0)
            {
                foreach ($gal->replies as $key) {
                    $key->delete();
                }
            }
                $gal->delete();
            }
        }

        if (!filter_var($data->photo,FILTER_VALIDATE_URL)){
            if (file_exists(public_path().'/assets/images/products/'.$data->photo)) {
                unlink(public_path().'/assets/images/products/'.$data->photo);
            }
        }

        if (file_exists(public_path().'/assets/images/thumbnails/'.$data->thumbnail) && $data->thumbnail != "") {
            unlink(public_path().'/assets/images/thumbnails/'.$data->thumbnail);
        }

        if($data->file != null){
            if (file_exists(public_path().'/assets/files/'.$data->file)) {
                unlink(public_path().'/assets/files/'.$data->file);
            }
        }

        $data->delete();
        //--- Redirect Section
        return response()->json(['status' => true, 'data' => ['message' => 'Product Deleted Successfully.'], 'error' => []]);
        //--- Redirect Section Ends

      }else{
          return response()->json(['status' => false, 'data' => [], 'error' => ["message" => 'This item is not your.']]);
      }
    }
    catch(\Exception $e){
      return response()->json(['status' => true, 'data' => [], 'error' => ['message' => $e->getMessage()]]);
    }
    }


    public function getAttributes(Request $request) {
    try{
      $model = '';
      if ($request->type == 'category') {
        $model = 'App\Models\Category';
      } elseif ($request->type == 'subcategory') {
        $model = 'App\Models\Subcategory';
      } elseif ($request->type == 'childcategory') {
        $model = 'App\Models\Childcategory';
      }

      $attributes = Attribute::where('attributable_id', $request->id)->where('attributable_type', $model)->get();
      $attrOptions = [];
      foreach ($attributes as $key => $attribute) {
        $options = AttributeOption::where('attribute_id', $attribute->id)->get();
        $attrOptions[] = ['attribute' => $attribute, 'options' => $options];
      }
      return response()->json(['status' => true, 'data' => $attrOptions, 'error' => []]);
    
    }
    catch(\Exception $e){
      return response()->json(['status' => true, 'data' => [], 'error' => ['message' => $e->getMessage()]]);
    }
      
      
    }


}