<?php 
namespace OfficeBrain\Bundle\ProductBundle\Manager\Service;
use Symfony\Component\HttpFoundation\Request;
use OfficeBrain\Bundle\ProductBundle\Helper\PluginDataHelper;
use OfficeBrain\Bundle\ObSolrOperationBundle\Form\Data\OperationData;
use OfficeBrain\Bundle\ProductBundle\Entity\RelatedProduct;
use OfficeBrain\Bundle\ProductBundle\Entity\ProductOrder;
//use OfficeBrain\Bundle\ProductBundle\ApiClient\ProductApiClient;

/**
 * @author Employee Id: 4808
 *
 * Description : This Class Used For Product Admin Functionality 
 *
 **/
class ProductAdminManager
{
	/**
	 * @author Employee Id: 4808
	 *
	 * Description : This function used for Set and intilize variables and request array
	 *
	 **/
	public function __construct(Request $request, $service_container,$productApi,$productCategoryMappingRepository)
	{
		$this->request=$request;
		$this->productApi=$productApi;		
		$this->serviceContainer = $service_container;
		$this->PluginDataHelper = new PluginDataHelper($this->serviceContainer);
		$this->translator = $this->serviceContainer->get('translator');
		$this->coreManager = $this->serviceContainer->get('office_brain_core_manager');
		$this->relatedProductRepo = $this->serviceContainer->get('doctrine')->getRepository('OfficeBrainProductBundle:RelatedProduct');
		$this->productCategoryMappingRepository = $productCategoryMappingRepository;
		//$this->imageManager=$imageManager;
        $this->optionalChargeArray = array(
            'TEST_CHARGE'=> 'Test Charge',
            'TEST_2' => 'Test 2 Charge',
            'RUN_CHARGE' => 'Run Charge',
        );
		
	}
	/**
	 * @author Employee Id: 4808
	 * 
	 * Description: This Function Used For Listing of Product Data
	 * 
	 * @param unknown $searchStatus
	 * @param string $searchParam
	 * @param string $searchQuery
	 * @param string $sortType
	 * @param string $sortBy
	 * @param string $cultureid
	 * @param string $supplier_id
	 * @param number $records_per_page
	 * @param number $page
	 * @return multitype:
	 */
	public function listProduct($searchStatus,$searchParam='', $searchQuery='', $sortType='DESC', $sortBy='updatedAt',$cultureName="", $country = "", $supplier_id="",$records_per_page="",$page="",$projectId="",$brandIds="",$catIds="")
	{
		$data = array();
		$params = array('status'=>$searchStatus,'searchParam'=>$searchParam ,'searchQuery'=>$searchQuery, 'sortType'=>$sortType, 'sortBy'=>$sortBy,
					'supplier_id'=>$supplier_id,'culture_name'=>$cultureName,'country_code' => $country,'brand_ids'=>$brandIds,'cat_ids'=>$catIds);
		if($projectId != ""){
			$params['project_id']=$projectId;
		}
		if($records_per_page != "")
		{
			$params['records_per_page']=$records_per_page;
			$params['page']=$page;
		}
		$this->productApi->init('list_product');
		$this->productApi->setCallParameters($params);
		$this->productApi->doProcess();
		
		if ($this->productApi->isSuccess()) {
			$data = $this->productApi->getResultArray();
		}else{
			$data['status'] = "error";
			$data['error_message'] = "Record Not Found";
		}
		return $data;
	}
	/**
	 * @author Employee Id: 4532
	 *
	 * Description: add product order
	 * @param number $productData
	 * @param string $opration
	 */
	public function syncProductOrder($productData,$localization_to_update,$projectId,$env,$instanceId){
		
// 		$this->ProductOrderRepo = $this->serviceContainer->get('doctrine')->getRepository('OfficeBrainProductBundle:ProductOrder');
// 		//$productOrder = new ProductOrder();
// 		$allData = $this->ProductOrderRepo->findall();
		
// 		foreach($allData as $index=>$data)
// 		{
// 			echo $data->getSku();
// 		}
// 		exit;
		$i = 1;
// 		//echo '<pre>'; print_r($productData); die;
		foreach ($productData['data'] as $info){
			//echo $info['product_master_id'].'----->>';
			$productOrder = new ProductOrder();
			$productOrder->setProductId($info['product_master_id']);
			$productOrder->setProductOrd($i);
			$productOrder->setCultureProductId($info['culture_product_id']);
			$productOrder->setActive($info['active']);
			$productOrder->setSku($info['sku_number']);
			$this->ProductOrderRepo->set($productOrder);
			//$this->updateSolrData($info['product_master_id'],$localization_to_update,$projectId,$env,$instanceId,'update');
			$i++;
		}
		echo 'Done'; die;
		
	}
	
	public function syncProductOrderGivenByClient($info){
			$this->ProductOrderRepo = $this->serviceContainer->get('doctrine')->getRepository('OfficeBrainProductBundle:ProductOrder');
			//echo get_class($this->ProductOrderRepo); die;
			$i = 1;
			//echo '<pre>'; print_r($productData); die;
			//foreach ($productData as $info){
				//echo $info['product_master_id'].'----->>';
				$productOrder = new ProductOrder();
				$productOrder->setProductId($info['product_id']);
				$productOrder->setProductOrd($info['ranking']);
				$productOrder->setCultureProductId(0);
				$productOrder->setActive(0);
				$productOrder->setSku($info['sku']);
				$this->ProductOrderRepo->set($productOrder);
				
				$i++;
			//}
				
				
			}
	
	
	/**
	 * @author Employee Id: 4532
	 *
	 * Description: get all product order number
	 */
	
	public function getProductOrderData(){
		$this->ProductOrderRepo = $this->serviceContainer->get('doctrine')->getRepository('OfficeBrainProductBundle:ProductOrder');
		
		$productOrd = $this->ProductOrderRepo->getProductOrderDataVal();
		$result = array();
		if(count($productOrd) > 0){
			$result = array_column($productOrd, 'productOrd','productId');
		}
		return $result;
	}
	
	public function getOrderNumOfProduct($productId){
		$this->ProductOrderRepo = $this->serviceContainer->get('doctrine')->getRepository('OfficeBrainProductBundle:ProductOrder');
		return $this->ProductOrderRepo->getOrderNumByProductId($productId);
	}
	public function getAndInsertMaxOrderNumber($productObject){
		$this->ProductOrderRepo = $this->serviceContainer->get('doctrine')->getRepository('OfficeBrainProductBundle:ProductOrder');
		$data = $this->ProductOrderRepo->getAndInsertMaxOrderNumber($productObject);
		
		if(isset($data['max_product_order']) && $data['max_product_order'] > 0)
		{
			$nextOrder = $data['max_product_order'] + 1;
		}
		else
		{
			$nextOrder = 1;
		}		
		
		$productOrder = new ProductOrder();
		$productOrder->setProductId($productObject['product_id']);
		$productOrder->setProductOrd($nextOrder);
		$productOrder->setCultureProductId($productObject['culture_product_id']);
		$productOrder->setActive($productObject['basic_information']['active']);
		$productOrder->setSku($productObject['basic_information']['sku_number']);
		$this->ProductOrderRepo->set($productOrder);
		return $nextOrder;
	}
	
	public function updateProductOrder($newOrder,$oldOrder,$productId){
		
		if($newOrder == $oldOrder){
			return;
		}
		$this->ProductOrderRepo = $this->serviceContainer->get('doctrine')->getRepository('OfficeBrainProductBundle:ProductOrder');

		$selectedProductIds = $this->ProductOrderRepo->getProductIdsBetweenOrders($newOrder,$oldOrder);
		//echo '<pre>'; print_r($selectedProductIds); die;
		$rearrangeProducts = $this->rearrangeProductOrder($selectedProductIds,$newOrder,$oldOrder,$productId);
		
		$this->ProductOrderRepo->updateProductsAsNewOrder($rearrangeProducts);
		
		return $rearrangeProducts;
	}
	
	public function rearrangeProductOrder($selectedProductIds,$newOrder,$oldOrder,$productId){

		$result = array();
		if($newOrder > $oldOrder){
			$i = 0;
			foreach($selectedProductIds as $selproduct){
				if($selproduct['productId'] == $productId){
					$result[$i]['productId'] = $productId;
					$result[$i]['productOrd'] = $newOrder;
				}else{
					$result[$i]['productId'] = $selproduct['productId'];
					$result[$i]['productOrd'] = $selproduct['productOrd']-1;
				}
				$i++;
			}
		}else if($newOrder < $oldOrder){
			$i = 0;
			foreach($selectedProductIds as $selproduct){
				if($selproduct['productId'] == $productId){
					$result[$i]['productId'] = $productId;
					$result[$i]['productOrd'] = $newOrder;
				}else{
					$result[$i]['productId'] = $selproduct['productId'];
					$result[$i]['productOrd'] = $selproduct['productOrd']+1;
				}
				$i++;
			}
		}
		
		return $result;
	}
	
	/**
	 * @author Employee Id: 4646
	 *
	 * Description: Update solr p 
	 * @param number $productId
	 * @param string $opration
	 */
	public function updateSolrData($productId,$localization_to_update,$projectId,$env,$instanceId,$opration='update')
	{	
		if(!$productId || !count((array)$localization_to_update) || !$projectId){
			return;
		}
		
		$this->productApi->init('product_country_language');		
		$this->productApi->setCallParameters(array('product_id'=>$productId));		
		$this->productApi->doProcess();
		
		if ($this->productApi->isSuccess()) {
			$listOflanguageAndCountryWhereProductAdded = $this->productApi->getResultArray();
			
			foreach($localization_to_update as $localization){
				list($language,$country) = explode("_",$localization);
				if(in_array($language, $listOflanguageAndCountryWhereProductAdded['languages']) && in_array($country, $listOflanguageAndCountryWhereProductAdded['countries']) ){
					$oprationData=new OperationData();
					$oprationData->setCulture($localization);
					$oprationData->setProductId($productId);
					$oprationData->setInstanceId($instanceId);
					$oprationData->setProjectId($projectId);
					$oprationData->setEnv($env);
					$syncService = $this->serviceContainer->get('office_brain_solr_operation.sync_service');
					
					if($opration=='update' && $listOflanguageAndCountryWhereProductAdded['product_status'][$country]==1 ){
						
						$syncService->processProductSyncCommand($oprationData,false);
					}else if ($opration=='delete' || $listOflanguageAndCountryWhereProductAdded['product_status'][$country]==0) {
						$syncService->processDeleteProductCommand($oprationData,false);
					}

					//CODE FOR SUBSHOP START					
					/*if($opration=='update' && $listOflanguageAndCountryWhereProductAdded['product_status'][$country]==1 ){
                    	$languageId = array_search($language, $listOflanguageAndCountryWhereProductAdded['languages']);
                        $oprationData->setLanguageId($languageId);
                        $oprationData->setInstanceId($instanceId);
                        $syncService->processSubShopProductSyncCommand($oprationData,false);
					}*/
					//CODE FOR SUBSHOP END
				} else {// If country get uncheck from product configuration page, we need to delete product from solr.
					$oprationData=new OperationData();
					$oprationData->setCulture($localization);
					$oprationData->setProductId($productId);
					$oprationData->setProjectId($projectId);
					$oprationData->setInstanceId($instanceId);
					$oprationData->setEnv($env);
					$syncService = $this->serviceContainer->get('office_brain_solr_operation.sync_service');
					
					$syncService->processDeleteProductCommand($oprationData,false);					
				}
			}
		}
	}
	
	public function manageColorsArray($requestParams){
		if(isset($requestParams['image_product']) and $requestParams['image_product']!=''){
			$result = array();

			foreach ($requestParams['image_product'] as $key=>$value){
				if(isset($value[0])){
					$result[$key][0] = $value[0];
				}
				if($value[2] == '' and $value[4] == ''){
					$result[$key][1] = $value[1];
					$result[$key][2] =  '';
				}else{
					if($value[2] != ''){
						$result[$key][1] = $value[3];
					}else if($value[4] != ''){
						$result[$key][1] = $value[5];
					}
					$result[$key][2] =  '';
					if($value[2] != ''){
						$result[$key][2] = 'BR|'.$value[2];
					}
					if($value[4] != ''){
						if($value[2] != ''){
							$result[$key][2] .= '|';
						}
						$result[$key][2] .= 'TR|'.$value[4];
					}
				}
			}
			$requestParams['image_product'] = $result;
		}
		return $requestParams;
	}
	
	/**
	 * @author Employee Id: 4808
	 * 
	 * Description: This Function Used For Add New Product
	 * 
	 * @param array $requestParams
	 *
	 * @return array|multitype:string |multitype:string NULL
	 */
	public function add($cultureName='',$requestParams)
	{
		//Add product API request
		$requestParams = $this->manageColorsArray($requestParams);
		$this->productApi->init('add_product');
		$this->productApi->setCallParameters(array('params'=>json_encode($requestParams)));
		$this->productApi->setPostMethodTrue();
		$this->productApi->doProcess();
		if ($this->productApi->isSuccess()) {
          $data = $this->productApi->getResultArray();
          if($data['status'] == 'error'){
          	$data['error_message'] = 'product_add_edit.'.$data['error_message'];
          }else{
          	if($requestParams['master_product_id']){
          		$data['success_message']="product_updated_successfully";
          	}
          	$data['success_message'] = 'product_add_edit.'.$data['success_message'];
          	$this->productCategoryMappingRepository->delete($data['master_product_id']);
          	if(isset($data['return_data']['category_data'])){
          		//Loop ForCountry
          		foreach($data['return_data']['category_data'] as $countryId=>$countryData){
          			// Loop For Get Category Data
          			foreach($countryData as $categoryInfo){
          				$returnData = $this->productCategoryMappingRepository->add($categoryInfo['cat_id'],$categoryInfo['product_id'],$categoryInfo['country_id']);
          			}
          		}
          	}
          }
          return $data;
        } else {
          return array('status'=>'error', 'message'=>'product_add_edit.'.$this->productApi->getErorDescription());
        }
    }
    
    /**
     * @author Employee Id: 4246
     * Description : This Function is Use For Remove Product From Master Id
     * @param integer $product_master_id
     */
    public function delete($product_master_id, $project_id, $supplier_id, $locale_language, $instance_type, $instance_id, $product_country){
    	$this->productApi->init('delete_product');
    	$this->productApi->setCallParameters(array('product_master_id' => $product_master_id, 'project_id' => $project_id, 'supplier_id' => $supplier_id, 'locale_language' => $locale_language, 'instance_type' => $instance_type, 'instance_id' => $instance_id, 'product_country' => $product_country));
    	$this->productApi->doProcess();
    	$return = false;
    
    	if ($this->productApi->isSuccess()) {
    		$data = $this->productApi->getResultArray();
    		$this->productCategoryMappingRepository->delete($data['product_id'],$data['country_id']);
    		return array('status'=>'success','message'=>'product.PRODUCT_DELETED_SUCCESSFULLY','data'=>$data);
    	} else {
    		return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
    	}
    }
    
    /**
     * Emp Id : 4246
     * Description : This Function is Used To Change Country Product Status Accroding To Sed Status
     *
     * @param unknown $product_master_id
     * @param unknown $country
     * @param unknown $setStatus
     * @return multitype:string unknown |multitype:string NULL
     */
    
    public function changeProductStatus($product_master_id,$country,$setStatus, $project_id, $supplier_id, $locale_language, $instance_type, $instance_id){
        $this->productApi->init('change_product_status');
    	$this->productApi->setCallParameters(array('product_id' => $product_master_id,'country' => $country, 'set_status' => $setStatus, 'project_id' => $project_id, 'supplier_id' => $supplier_id, 'locale_language' => $locale_language, 'instance_type' => $instance_type, 'instance_id' => $instance_id));
    	$this->productApi->doProcess();
    	$return = false;
    
    	if ($this->productApi->isSuccess()) {
    		$data = $this->productApi->getResultArray();
    		return $data;
    	} else {
    		return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
    	}
    }
    
    /**
     * @author Employee Id: 4808
     * 
     * Description : This function used for Set Data for Product Add  
     * @return multitype:multitype:string  multitype:multitype:string   multitype:multitype:string multitype:
     */
	public function preSetDataForPlugin($projectSetting,$projectId, $editParams=array(),$supplierId=0)
	{   
		//TODO: REMOVE SERVICE CONTAINER
		$countryArray = $this->serviceContainer->getParameter('country');
        $languageArray = $this->serviceContainer->getParameter('language');
        $priceUnit = $this->serviceContainer->getParameter('price_unit');
        $priceUnit['box'] = 'Box';
        asort($priceUnit);
        $source = $this->serviceContainer->getParameter('source');
        //@list($default_language) = explode("_",$this->serviceContainer->getParameter('locale'));
        $tempParam = $this->request->query->all();
        @list($default_language) = explode("_",($tempParam['language']) ? $tempParam['language'] : $this->request->getLocale());
        //echo $default_language; die;
	    $editLanguageArray = array();
		// TODO: Unset Language Data For Not availabe Countries in Edit
        if(!empty($editParams['available_country'])){
        	foreach($editParams['available_country'] as $editAwailableCountry){
        		if(isset($countryArray[$editAwailableCountry])){
        			//$editLanguageArray = $countryArray[$editAwailableCountry]['language'];
        			$editLanguageArray = array_merge($editLanguageArray,$countryArray[$editAwailableCountry]['language']);
        		}
        	}
        	$extraLanguages = array_diff(array_keys($languageArray),array_keys($editLanguageArray));
        	foreach($extraLanguages as $extraLanguage){
        		unset($editParams[$extraLanguage]);
        	}
        }
        $attribute_to_exclude = $this->serviceContainer->getParameter('attribute_to_exclude_on_product_configuration');
        
        $imprintMethodMasterId = $this->serviceContainer->getParameter('imprint_method_master_id');
        $imprintPositionMasterId = $this->serviceContainer->getParameter('imprint_position_master_id');
        $fixedChargesArray = $this->serviceContainer->getParameter('fixed_charges');
        $quantityWiseChargesArray = $this->serviceContainer->getParameter('quantity_wise_charges');
        $optionalChargesArray = $this->serviceContainer->getParameter('optional_charges');
//         $optionalChargesArray = $this->optionalChargeArray;
        $packagingTypeMasterId = $this->serviceContainer->getParameter('packaging_type_master_id');

        $languageData = array();
        $localization_to_fetch = array();
        foreach($languageArray as $langageCode=>$language){
        	$languageData[] = array('id'=>'lang_'.$langageCode,'name'=>$langageCode,'description'=>$language['name'],'status'=>'true');
        	$localization_to_fetch[] = $langageCode;
        }
        
        // Create Custom array For Culture Response
        $reponse = array('status'=>'success','data'=>$languageData);
        $data_to_set = array();
        $data_to_set['plugin_data'] = array();
            
        //localization
        $data_to_set['localization'] = array();
        $localizationAndId = array();
        foreach ($reponse['data'] as $_response) {
            $data_to_set['localization'][] = array($_response['name']=>$_response['description']);
            $localizationAndId[$_response['name']] = $_response['id'];
        }
       
        //Country & Language        
        $countryToActivateProduct = array();
        $languageToActivateProduct = array();
        $stateArray = array();
        
        $countryToActivateProduct[] = array('id'=>'country','title'=>$this->translator->trans('product_add_edit.country'),'class'=>'','icon'=> array(array('class'=>'country','html'=>'div','text'=>'icon')),'icon_class'=>'fa-globe','require'=>true ,'enable'=>true);
        $languageToActivateProduct[] = array('id'=>'language','title'=>$this->translator->trans('product_add_edit.language'),'class'=>'','icon'=> array(array('class'=>'country','html'=>'div','text'=>'icon')), 'enable'=>false,'teamplate'=>'B');

        $tempLanguageToActivateProduct = array();
        foreach($countryArray as $country){
        	$checked = 'true';
        	$disabled = 'false';
        	if(isset($editParams['available_country'])){
        		if(!in_array($country['short_name'],$editParams['available_country'])){
        			$checked = 'false';
        		}else{
        			// For Disable onEdit Screen
        			$disabled = 'false';
        		}
        	}
          $countryToActivateProduct[] = array('id'=>'country_'.$country['short_name'],'checked'=>$checked, 'disabled'=>$disabled,'name'=>'country[]','title'=>$country['name'],
          		'value'=>$country['id']."_".$country['short_name'],'rules'=>'require_from_group');
          $languageToActivate = array();
          $languageToActivate[] = array('id'=>'country_'.$country['short_name'],'title'=>$country['name']);
          
          $states = $this->coreManager->getStateData($country['id']);
          if(!empty($states)){
	          foreach($states as $stateId => $state){
	          	$stateCode = $this->coreManager->getStateCode($stateId);
	          	$stateArray[$country['short_name']][$stateCode] = $state;
	          }
          }
          
          foreach($country['language'] as $languageCode=>$languageId){
            $languageToActivate[] = array('id'=>$languageCode, 'name'=>'lang['.$country['short_name'].'][]','title'=>$country['name'],'checked'=>'true','value'=>$languageCode);
          }
          $tempLanguageToActivateProduct[] = $languageToActivate;
        }
        $languageToActivateProduct[] = $tempLanguageToActivateProduct;

        $data_to_set['plugin_data']['country_to_activate']= $countryToActivateProduct;
        $data_to_set['plugin_data']['language_to_activate']= $languageToActivateProduct;
        
        $supplierData = $this->getSupplierNameList($projectId);
        $supplierwiseBrandSettings = $projectSetting['add_update']['brand'];
        if($supplierwiseBrandSettings['supplierwise_brand']){
        	$supplierId = (isset($editParams['supplier_id']))? $editParams['supplier_id'] : $supplierId ;
        }
        $selected_supplier_id = (isset($editParams['supplier_id']))? $editParams['supplier_id'] : 0;
        $data_to_set['plugin_data']['supplier'] = array($supplierData,$selected_supplier_id);
        
        $matrixType = $this->getMatrixTypeList($projectId);
        $vatUnitSelected = (!empty($editParams['prod_matrix_vat_details']['vat_unit'])) ? $editParams['prod_matrix_vat_details']['vat_unit'] : '';
        $matrixTypeSelectedId = (!empty($editParams['prod_matrix_details'])) ? $editParams['prod_matrix_details'] : '';
        if(isset($matrixType) && !empty($matrixType)){
                $data_to_set['plugin_data']['matrix_type'] = array($matrixType,$matrixTypeSelectedId);
                $data_to_set['plugin_data']['matrix_type']['vat']['field'] = (!empty($editParams['prod_matrix_vat_details']['vat'])) ? $editParams['prod_matrix_vat_details']['vat'] : '';
                $data_to_set['plugin_data']['matrix_type']['vat']['type'] = array(array('label'=>'Percentage','value'=>'percentage','vat_unit_selected'=>$vatUnitSelected),array('label'=>'Flat','value'=>'flat','vat_unit_selected'=>$vatUnitSelected));
        }
        
        $data_to_set['localization_data'] = array();

        $countryDataToMap = array('id'=>'210','title'=>'&nbsp;');
        $sku=(!empty($editParams[$default_language]['basic_information']['sku_number']) ?
        		 $editParams[$default_language]['basic_information']['sku_number'] : "");
        $data_to_set['plugin_data']['sku'] = array('id'=>$default_language,'name'=>'sku', 'title'=> $this->translator->trans('product_add_edit.sku'), 'value'=>$sku, 'rule'=>"required");
        $data_to_set['plugin_data']['product_name'][] = $countryDataToMap;
        $data_to_set['plugin_data']['brand'][] = $countryDataToMap;
        $data_to_set['plugin_data']['description'][] = $countryDataToMap;
        $data_to_set['plugin_data']['tags'][] = $countryDataToMap;
        $data_to_set['plugin_data']['gift'][] = $countryDataToMap;
        $data_to_set['plugin_data']['keyword'][] = $countryDataToMap;
        $data_to_set['plugin_data']['feature_detail'][] = $countryDataToMap;
        $data_to_set['plugin_data']['detail'][] = $countryDataToMap;
        $data_to_set['plugin_data']['category'][] = $countryDataToMap;
        $data_to_set['plugin_data']['video'][] = $countryDataToMap;
        // Distributor Url
        $data_to_set['plugin_data']['distributor_central_url'][] = $countryDataToMap;
        $data_to_set['plugin_data']['status'][] = $countryDataToMap;
        $data_to_set['plugin_data']['valid_up_to'][] = $countryDataToMap;
        $data_to_set['plugin_data']['special_price_valid_up_to'][] = $countryDataToMap;
        $data_to_set['plugin_data']['sample_product'][] = $countryDataToMap;
        $data_to_set['plugin_data']['product_image'][] = $countryDataToMap;
        $data_to_set['plugin_data']['pricing'][] = $countryDataToMap;
        $data_to_set['plugin_data']['price_unit'] = $priceUnit;
        $data_to_set['plugin_data']['source'] = $source;
        $data_to_set['plugin_data']['shipping_detail'][] = $countryDataToMap;
        $data_to_set['plugin_data']['country'][]=$countryArray;
        $data_to_set['plugin_data']['state'][]=$stateArray;
        $data_to_set['plugin_data']['language'][]=$languageArray;
        $data_to_set['plugin_data']['general_information'][] = $countryDataToMap;
        
        if (isset($projectSetting['add_update']['global_pricing']))
        {
        	foreach ($projectSetting['add_update']['global_pricing'] as $glbPricingKey => $glbPricingVal)
        	{
        		if ($glbPricingVal['status'] == 1)
        		{
        			$data_to_set['plugin_data'][$glbPricingKey][] = $countryDataToMap;
        		}
        	}
        }
        
        if(isset($editParams['regular_price_unit']))
        {
        	$data_to_set['plugin_data']['price_unit_selected'] = $editParams['regular_price_unit'];
        }
        if(isset($editParams['product_source']))
        {
            $data_to_set['plugin_data']['product_source_selected'] = $editParams['product_source'];
        } 
        $video_url=(!empty($editParams[$default_language]['basic_information']['video_url']) ? $editParams[$default_language]['basic_information']['video_url'] : "");
        $data_to_set['plugin_data']['video'][] = array('id'=>$default_language,'name'=>$this->translator->trans('product_add_edit.video_url'), 'value'=>$video_url);
        
        // Distributor Url
        $distributorUrl=(!empty($editParams[$default_language]['basic_information']['distributor_url']) ? $editParams[$default_language]['basic_information']['distributor_url'] : "");
        $data_to_set['plugin_data']['distributor_central_url'][] = array('id'=>$default_language,'name'=>$this->translator->trans('product_add_edit.url'), 'value'=>$distributorUrl);
        // EO Distributor Url
        $data_to_set['plugin_data']['status'][] = array('id'=>$default_language,'name'=>$this->translator->trans('product_add_edit.status'), 
        			'attribute'=>array(
        					array('lable'=>$this->translator->trans('product_add_edit.active'),'checked'=>true,'value'=>'1'),
        					array('lable'=>$this->translator->trans('product_add_edit.deactive'),'checked'=>false,'value'=>'0')
        			));
        $defaultPath = (isset($editParams['prod_images']['default_image'])) ? array($editParams['prod_images']['default_image']) : '';
        $sizeChart = (isset($editParams['prod_images']['size_chart'])) ? array($editParams['prod_images']['size_chart']) : '';
        $imprintChart = (isset($editParams['prod_images']['imprint_chart'])) ? array($editParams['prod_images']['imprint_chart']) : '';
        $otherImage = (isset($editParams['prod_images']['other'])) ? $editParams['prod_images']['other'] : '';
        $data_to_set['plugin_data']['product_image'][] = array('id'=>$default_language,'name'=>'Image',
        			'fields' => array(
        							array('lable'=>$this->translator->trans('product_add_edit.default_image'),
        								'name'=>'default_image',
        								'id' => 'default_image',		
        								'enable_color_box'=> true,
        								'add_more'=> false,
        								'default_image'=> "browse-image.jpg",	
        								'values'=>array('image'=>array('detail' => $defaultPath),'browse_text'=> $this->translator->trans('product_add_edit.browse'),'remove_text'=>$this->translator->trans('product_add_edit.remove_image'),'master_colors' => array())),
        							array('lable'=>$this->translator->trans('product_add_edit.sizing_chart'),
        								'enable_color_box'=> false,
        								'name'=>'size_image',
        								'id'=>'size_image',
        								'add_more'=> false,
        									'default_image'=> "browse-image.jpg",
        								'values'=>array('image'=>array('detail' => $sizeChart), 'browse_text'=>$this->translator->trans('product_add_edit.browse'),'remove_text'=>$this->translator->trans('product_add_edit.remove_image'),'master_colors' => array())),
        							array('lable'=>$this->translator->trans('product_add_edit.imprint_chart'),
        								'enable_color_box'=> false,
        									'name'=>'imprint_location',
        									'id'=>'imprint_location',
        								'add_more'=> false,
        									'default_image'=> "browse-image.jpg",
        								'values'=>array('image'=>array('detail' => $imprintChart), 'browse_text'=>$this->translator->trans('product_add_edit.browse'),'remove_text'=>$this->translator->trans('product_add_edit.remove_image'),'master_colors' => array())),
        							array('lable'=>'Other Images',
        							'enable_color_box'=> true,
        							'name'=>'other[]',
        							'id' => 'other_image',
        							'add_more'=> true,
        							'default_image'=> "browse-image.jpg",
        							'values'=>array('image'=>array('detail'=> $otherImage),'browse_text'=> $this->translator->trans('product_add_edit.browse'),'remove_text'=>$this->translator->trans('product_add_edit.remove_image'),'master_colors' => array()))
        					));
        $validUpTo=(!empty($editParams[$default_language]['basic_information']['valid_up_to']) ? $editParams[$default_language]['basic_information']['valid_up_to'] : "");
        
        $specialPriceValidUpTo=(!empty($editParams[$default_language]['basic_information']['special_price_valid_up_to']) ? $editParams[$default_language]['basic_information']['special_price_valid_up_to'] : "");
        
        $data_to_set['plugin_data']['valid_up_to'][] = array('id'=>$default_language,'name'=> $this->translator->trans('product_add_edit.valid_up_to'), 'value'=>$validUpTo);
        $data_to_set['plugin_data']['special_price_valid_up_to'][] = array('id'=>$default_language,'name'=> $this->translator->trans('product_add_edit.special_price_valid_up_to'), 'value'=>$specialPriceValidUpTo);

        foreach($countryArray as $countryKey => $country){
            
	       	$data_to_set['plugin_data']['country'][] = array('id'=>'country_'.$country['short_name'],'code'=>$country['short_name'],'title'=>$country['name']);
        	$countryLangAr[$country['id']] = $default_language.'_'.$country['short_name'];
        	$currencyConfig[$country['short_name']] = $country['currency']['id'];
          	$data = array('id'=>'country_'.$country['short_name'],'name'=>'pricing['.$country['short_name'].']','title'=>$country['name'],
            'field'=> array(
            		  array( array('label'=>$this->translator->trans('product_add_edit.start'),'name'=>'start'),array('label'=>$this->translator->trans('product_add_edit.end'),'name'=>'end')),
                      array( array('label'=>'','name'=>'start')),
                      array( array('label'=>$this->translator->trans('product_add_edit.min_qty'),'name'=>'start')),
            		  array( ) //FOR VARIATION. WE WON'T USE THIS TO RENDER
            		),
            'currency_id'=>$country['currency']['id'],
            'fieldData' => array(array(),array(),array(),array()),
            'comments'=>array(array('name'=>'pricing_comment['.$country['short_name'].']','placeholder'=> $this->translator->trans('product_add_edit.what_include'), 'value'=>""))
        	);

          	$pricingSettings = $projectSetting['add_update']['pricing'];
          	if($pricingSettings['pricing_type']['decorated']){
          		$data['field'][0][] = array('label'=> $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'],'name'=>'price');
          		$data['field'][0][] = array('label'=>$this->translator->trans('product_add_edit.code'),'name'=>'code');
          		
          		$data['field'][1][] = array('label'=> $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'],'name'=>'price');
          		$data['field'][1][] = array('label'=>$this->translator->trans('product_add_edit.code'),'name'=>'code');
          	}
          	
          	if($pricingSettings['pricing_type']['blank']){
          		$data['field'][0][] = array('label'=> $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'],'name'=>'blank_price');
          		$data['field'][0][] = array('label'=>$this->translator->trans('product_add_edit.code'),'name'=>'blank_code');
          		
          		$data['field'][1][] = array('label'=> $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'],'name'=>'blank_price');
          		$data['field'][1][] = array('label'=> $this->translator->trans('product_add_edit.code'),'name'=>'blank_code');
          	}
          	
          	if($pricingSettings['pricing_type']['special']){
          		$data['field'][0][] = array('label'=> $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'],'name'=>'special_price');
          		$data['field'][0][] = array('label'=>$this->translator->trans('product_add_edit.code'),'name'=>'special_code');
          	
          		$data['field'][1][] = array('label'=> $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'],'name'=>'special_price');
          		$data['field'][1][] = array('label'=> $this->translator->trans('product_add_edit.code'),'name'=>'special_code');
          	}
          	
          	if(!empty($editParams['regular_variations_type']) && isset($editParams['regular_variations_charges'][$country['short_name']])){
          		$data_to_set['plugin_data']['pricing_type'] = $editParams['regular_variations_type'];
          		if($editParams['regular_variations_type']=='regular'){
          			$data['fieldData'][0] = $editParams['regular_variations_charges'][$country['short_name']];
          		}else if($editParams['regular_variations_type']=='piece_wise'){
          			$data['fieldData'][1] = $editParams['regular_variations_charges'][$country['short_name']];
          		}else if($editParams['regular_variations_type']=='call_for_price'){
          			$data['fieldData'][2] = $editParams['regular_variations_charges'][$country['short_name']];
          		}else if($editParams['regular_variations_type']=='variation'){
          			$data['fieldData'][3] = $editParams['regular_variations_charges'][$country['short_name']];
          		}
          	}else{
          		if(!isset($data_to_set['plugin_data']['pricing_type']))
          			$data_to_set['plugin_data']['pricing_type'] = "call_for_price";
          		
          			if (isset($data['fieldData'][2]) & count($data['fieldData'][2]) == 0) {
          				foreach(array('blank', 'decorative') as $cfpType) {
          					$data['fieldData'][2][] = array('from' => 1, 'to' => '', 'type' => $cfpType, 'blank_rate' => '', 'blank_code' => 0);
          				}
          			}
          	}
          	$data['currency_for_variation'] = $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'].' & '.$this->translator->trans('product_add_edit.code');
          	$data_to_set['plugin_data']['pricing'][] = $data;

          	//	global-pricing : prepare edit data
          	$tempGlobalData = $data;
          	unset($tempGlobalData['fieldData']);
          	 
          	if (isset($projectSetting['add_update']['global_pricing']))
          	{
          		foreach ($projectSetting['add_update']['global_pricing'] as $glbPricingKey => $glbPricingVal)
          		{
          			if ($glbPricingVal['status'] == 1)
          			{
          				$tempGlobalData['fieldData'] = array(array(),array(),array(),array());
          	
          				if(isset($editParams['global_pricing'][$glbPricingKey]))
          				{
          					$editParamsGlobalPricing = $editParams['global_pricing'][$glbPricingKey];
          					 
          					if(!empty($editParamsGlobalPricing['regular_variations_type']) && isset($editParamsGlobalPricing['regular_variations_charges'][$country['short_name']])){
          						//$data_to_set['plugin_data']['pricing_type'] = $editParamsGlobalPricing['regular_variations_type'];
          						if($editParamsGlobalPricing['regular_variations_type']=='regular'){
          							$tempGlobalData['fieldData'][0] = $editParamsGlobalPricing['regular_variations_charges'][$country['short_name']];
          						}else if($editParamsGlobalPricing['regular_variations_type']=='piece_wise'){
          							$tempGlobalData['fieldData'][1] = $editParamsGlobalPricing['regular_variations_charges'][$country['short_name']];
          						}else if($editParamsGlobalPricing['regular_variations_type']=='call_for_price'){
          							$tempGlobalData['fieldData'][2] = $editParamsGlobalPricing['regular_variations_charges'][$country['short_name']];
          						}else if($editParamsGlobalPricing['regular_variations_type']=='variation'){
          							$tempGlobalData['fieldData'][3] = $editParamsGlobalPricing['regular_variations_charges'][$country['short_name']];
          						}
          					}
          				}
          	
          				$data_to_set['plugin_data'][$glbPricingKey][] = $tempGlobalData;
          	
          				$data_to_set['plugin_data'][$glbPricingKey.'_price_unit_selected'] = $editParamsGlobalPricing['regular_price_unit'];
          	
          				$data_to_set['plugin_data'][$glbPricingKey.'_pricing_type'] = isset($editParamsGlobalPricing['regular_variations_type']) ? $editParamsGlobalPricing['regular_variations_type'] : '';
          			}
          		}
          	}
          	// add fieldData key data for add/edit
          	      
        }
        $data_to_set['plugin_data']['currency_config'] = $currencyConfig;
        
        // For Sample Product
        foreach($countryArray as $country){
            //Sample product
			$data_to_set['plugin_data']['sample_product'][] = array('id'=>'country_'.$country['short_name'],'name'=>'sample_product['.$country['short_name'].']','title'=>$country['name'],
        			'field'=> array(
        					array('lable'=> $this->translator->trans('product_add_edit.price').' '.$country['currency']['name'],'name'=>'price','value'=>(isset($editParams['sample_product'][$country['short_name']]['price'])?$editParams['sample_product'][$country['short_name']]['price']:'')),
        					array('lable'=> $this->translator->trans('product_add_edit.max_qty'),'name'=>'max_quantity','value'=>(isset($editParams['sample_product'][$country['short_name']]['max_quantity'])?$editParams['sample_product'][$country['short_name']]['max_quantity']:''))
        			),
        			'currency_id'=>$country['currency']['id'],
        	);
			
        	$main_category = array();
            
            //CATEGORY AND SUBCATEGORY
            $apiManager= $this->serviceContainer->get("officebrain_category_api_manager");
            // Last Parameter : isFromProductPage = true
            $categoryAndSubCategory = $apiManager->getList($countryLangAr,array(),true);
            
            $countryName = 'country_'.$country['short_name'];
            
            if($categoryAndSubCategory) {
                foreach ($categoryAndSubCategory[$default_language.'_'.$country['short_name']] as $category_id=>$category_data) {
                    $level_1_category = array();
                    $disabled=true;
                    $enable = false;
            
                    if(isset($category_data['child'])) {
                        foreach ($category_data['child'] as $child_category_id=>$child_category) {
                            $level_2_category = array();
                            $l1_disabled = true;
                            if(array_key_exists('child',$child_category)){
                                foreach($child_category['child'] as $l2_category_id => $l2_level_category){
                                	$checked = false;
                                	if(isset($editParams['category'][$country['short_name']]) && in_array($l2_category_id,$editParams['category'][$country['short_name']]))
                                		$checked = true;
                                    $level_2_category[] = array('id'=>'id_'.$l2_category_id,'title'=>$l2_level_category['cat_name'],'checked'=> $checked,'name'=>'category['.$countryName.'][]','value'=>$l2_category_id);
                                }
                            } else {$l1_disabled=false;}
                            
                            $checked = false;
                            if(isset($editParams['category'][$country['short_name']]) && in_array($child_category_id,$editParams['category'][$country['short_name']]))
                            	$checked = true;
                            $level_1_category[] = array('id'=>'id_'.$child_category_id,'title'=>$child_category['cat_name'],'checked'=> $checked,'disabled'=>$l1_disabled,'name'=>'category['.$countryName.'][]','value'=>$child_category_id,'subCategory'=>$level_2_category);
                        }
                    } else {
                        if(isset($editParams['category'][$country['short_name']]) && in_array($category_data['pms_id'],$editParams['category'][$country['short_name']])) {
                            $disabled=false;
                            $enable = true;
                        } else {
                            $disabled=false;
                            $enable = false;
                        }
                    }
                    $main_category[] = array('id'=>"id_".$category_id,'title'=>$category_data['cat_name'],'checked'=>$enable,'subCategory'=>$level_1_category,'disabled'=>$disabled,'name'=>'category['.$countryName.'][]','value'=>$category_id);
                }
            }
            $data_to_set['plugin_data']['category'][] = array("id"=> $countryName, "name"=>$country['name'], 'mainCateogry'=>$main_category);
        }
        	
        $data_to_set['plugin_data']['attribute_used_as_variation'] =(isset($editParams['variation_attribute_ids']) ? $editParams['variation_attribute_ids'] : array());
        
        foreach ($localization_to_fetch as $localization) {
            $cultureId = $localizationAndId[$localization];
            $language = $languageArray[$localization]['name'];
            
            if ($default_language==$localization) {
            	//Exclude "Imprint Method, Imprint position etc." from attributes;
            	if(!isset($editParams['attributes'])){
            		$editParams['attributes']=array();
            		$editParams['attributes_values'] = array();
            	}
            	$data_to_set = $this->PluginDataHelper->getAttributeDataForPlugin($localization,$language, $data_to_set,$attribute_to_exclude,$editParams['attributes'],$editParams['attributes_values']);
            	$data_to_set = $this->PluginDataHelper->getImprintDataForPlugin($localization,$language, $data_to_set, array(), $imprintMethodMasterId, $fixedChargesArray, $quantityWiseChargesArray, $optionalChargesArray, $editParams);
            	$shippingInfo = !empty($editParams['shipping_information'])?$editParams['shipping_information']:array();
            	$data_to_set = $this->PluginDataHelper->getShippingDataForPlugin($localization,$data_to_set,$shippingInfo);
            	if(isset($editParams['brand'])){
            		$data_to_set = $this->PluginDataHelper->getBrandDataForPlugin($localization,$language, $data_to_set,$editParams['brand'],$supplierId);
            	}
            	else{
            		// supplierId used for get supplierwise Brand. if project settings "supplierwise_brand":0 its retrive all brand data.
            		$data_to_set = $this->PluginDataHelper->getBrandDataForPlugin($localization,$language, $data_to_set,array(),$supplierId);
            	}

            	// Set Packaging Type Data ForPlugin 
            	$data_to_set = $this->PluginDataHelper->getPackagingDataForPlugin($localization,$language, $data_to_set, array(), $packagingTypeMasterId,$editParams);
            }            
            
            $sku=(!empty($editParams[$localization]['basic_information']['sku_number']) ? $editParams[$localization]['basic_information']['sku_number'] : "");
            $data_to_set['plugin_data']['sku'][] = array('id'=>$localization,'name'=>'sku['.$localization.']', 'title'=> $language, 'value'=>$sku, 'rule'=>"required");            		
            
            //PRODUCT NAME
            $product_name=(!empty($editParams[$localization]['basic_information']['title']) ? $editParams[$localization]['basic_information']['title'] : "");
            $data_to_set['plugin_data']['product_name'][] = array('id'=>$localization,
                    'name'=>'product_name['.$localization.']','title'=>$language, 'value'=>$product_name);
                
            //Set Product description
            $productDescription=(!empty($editParams[$localization]['basic_information']['description']) ? $editParams[$localization]['basic_information']['description'] : "");
            $data_to_set['plugin_data']['description'][] = array('id'=>$localization,
                    'name'=>'product_description['.$localization.']','title'=>$language, 'value'=>$productDescription);
            
            //Set Keyword
            $keyword=(!empty($editParams[$localization]['keyword']) ? $editParams[$localization]['keyword'] : "");
            $data_to_set['plugin_data']['keyword'][] = array('id'=>$localization,
                    'name'=>'keyword['.$localization.']','title'=>$language, 'value'=>str_replace("::SEP::", ",", $keyword));
            
            //Set Feature details.
            $featureDetail=(!empty($editParams[$localization]['feature_details']) ? $editParams[$localization]['feature_details'] : "");
            $data_to_set['plugin_data']['feature_detail'][] = array('id'=>$localization,
                    'name'=>'feature_detail['.$localization.']','label'=>'feature_detail_label['.$localization.']', 'value'=>$featureDetail,'title'=>$language,
                    'attr'=> array()
            );
            //Set General Information
            $generalInformation=(!empty($editParams[$localization]['basic_information']['general_information']) ? $editParams[$localization]['basic_information']['general_information'] : "");
            $generalInformationUrl=(!empty($editParams[$localization]['basic_information']['general_information_url']) ? $editParams[$localization]['basic_information']['general_information_url'] : "");
            $data_to_set['plugin_data']['general_information'][] = array('id'=>$localization,
            		'name'=>'general_information['.$localization.']','label'=>'general_information_title['.$localization.']', 'value'=>$generalInformation,'title'=>$language,'pdf_link' => $generalInformationUrl 
            );
        }
        return $data_to_set;
	}

	/**
	 * @author: Employee Id : 4808
	 * @description : This Function is Used for Display Product Images
	 * 
	 * @param unknown $product_id
	 * @param unknown $image_type
	 */
	public function productImages($product_id,$image_type){
		
		$data = array();
		
		$params = array('productId'=>json_encode($product_id),'imageType'=>$image_type);
		$this->productApi->init('product_image');
		$this->productApi->setCallParameters($params);
		$this->productApi->doProcess();
		
		if ($this->productApi->isSuccess()) {
			$data = $this->productApi->getResultArray();
		}
		return $data;
	}

	/**
	 * @author: Employee Id: 480
	 * @description: This function is Related to Upload Images For ImageLibrary
	 * 
	 * @param unknown $productId
	 * @param unknown $fileData
	 * @param string $type
	 * @param string $fileUploadType
	 * @return multitype:Ambigous <boolean, string, unknown>
	 */
	public function uploadfiles($productId,$fileData,$type='image',$fileUploadType = null) {
		
		$index = 0;
		$error_file_upload = false;
		foreach ($fileData as $key => $value) {
			if (count($fileData[$key]) == 0) {
				continue;
			}
			if($type=='zip'){
				$allowedExts = array("zip");
			}elseif ($key == "high_res") {
				$allowedExts = array("jpeg", "jpg", "png");
			} elseif ($key == "template") {
				$allowedExts = array("pdf");
			}
			if (count($value) < 1 ) {
				continue;
			}
	
			foreach ($value as $k=>$file) {
				if(empty($file))
					continue;
	
				$tmpfile = $file->getPathName();
				$filename = $file->getClientOriginalName();
				$dataFile ='@'.realpath($tmpfile).';filename='.$filename;
	
				if (empty($file)){
					continue;
				}
				$_originalName = $file->getClientOriginalName();
				$extArr = explode(".", $_originalName);
	
				$ext = strtolower($extArr[count($extArr) - 1]);
	
				if (!in_array($ext, $allowedExts)) {
					$error_file_upload[$key][$_originalName] = $this->translator->trans('product_add_edit.pls_upload_valid_file');
					continue;
				}
				
				$this->productApi->init('add_product_image');
				$params = array(
						'productId'=>$productId,
						'file'=>$dataFile,
						'imageType'=> ($type=="zip")?$key."_zip":$key,
						'fileType'=>($fileUploadType!= null && isset($fileUploadType[$key]) && isset($fileUploadType[$key][$k])?$fileUploadType[$key][$k]:null),
				);
				$this->productApi->setCallParameters($params);
				$this->productApi->doProcess();
				
				if ($this->productApi->isSuccess()) {
					$productArray = $this->productApi->getResultArray();
					/*if($key == "web")
					{
						$this->generateThumbnail($productArray["id"]);
					}*/
				    } else{
					  $err = $this->productApi->getResultArray();
					  $error_file_upload[$key][$_originalName] = $err['error_message'];
				    }
			} // end of foreach
			
			$index++;
		}
		return array("error_file_upload"=>$error_file_upload);
	}
	/**
	 * @author : Employee Id :4808
	 * @description: This function is Used to Remove the image 
	 */
	public function removeProductImage($productId,$imageId)
	{
		$this->productApi->init('remove_product_images');
		$params  = array('productId'=>$productId,'imageId'=>$imageId);
		
		$this->productApi->setCallParameters($params);
		$this->productApi->doProcess();
		$result = false;
		if ($this->productApi->isSuccess()) {
			$result = $this->productApi->getResultArray();
		}
	}
	
	/**
	 * @author Employee Id: 4246
	 *
	 * Description: This Function Used For View Product
	 *
	 * @param array $requestParams
	 *
	 * @return array|multitype:string |multitype:string NULL
	 */
	public function view($product_ids,$product_culture,$is_for_admin=false)
	{
		//Add product API request
		if($is_for_admin){
			$this->productApi->init('view_product_admin');
		}else{
		$this->productApi->init('view_product');
		}
		$this->productApi->setCulture($product_culture);
		$this->productApi->setCallParameters(array('product_ids' => $product_ids));
		$this->productApi->doProcess();
		
		$return = false;
		if ($this->productApi->isSuccess()) {
			$data = $this->productApi->getResultArray();
			$status = "success";
			return array("status"=>$status,"data"=> $data);
		} else {
			return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
		}
	}
	
	/**
	 * @author Employee Id: 4045
	 *
	 * Description: This Function Used For View Product in Edit page
	 *
	 * @param array $requestParams
	 *
	 * @return array|multitype:string |multitype:string NULL
	 */
	public function editView($product_ids,$productCulture,$countries,$defaultCulture)
	{
		//Add product API request
		$this->productApi->init('edit_product_info');
		$this->productApi->setCallParameters(array('product_id' => $product_ids,"languages"=>$productCulture,"countries"=>$countries,"default_culture"=>$defaultCulture));
		$this->productApi->doProcess();
		$return = false;
		
		if ($this->productApi->isSuccess()) {
			$data = $this->productApi->getResultArray();
			$data = $this->updateQuantityData($data,$countries);
			return $data;
		} else {
			return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
		}
	}
	
	/**
	 * Emp Id : 5473
	 * Description : Get Supplier Name List From Project Id
	 * @param unknown $projectId
	 */
	public function updateQuantityData($data,$countries){		
			if(isset($data['regular_variations_charges']) && !empty($data['regular_variations_charges']))
			{
				foreach($data['regular_variations_charges'] as $countryCode => $countryData){
					$countryWiseQuantityArray[$countryCode] = array();
					if(isset($countryData['pricing']) && !empty($countryData['pricing']))
					{
						foreach($countryData['pricing']as $variationId => $variationData){
							if(isset($data['regular_variations_charges'][$countryCode]['quantity_data']))
							{
								if(count($data['regular_variations_charges'][$countryCode]['quantity_data']) < count($variationData))
								{
									$data['regular_variations_charges'][$countryCode]['quantity_data']= array_keys($variationData);
								}
							}
						}
					}
				}
			}
			return $data;
	}
	
	
	
	/**
	 * Emp Id : 4246
	 * Description : Get Supplier Name List From Project Id
	 * @param unknown $projectId
	 */
	public function getSupplierNameList($projectId){
		
		$this->productApi->init('get_supplier_name');
		$this->productApi->setCallParameters(array('project_id' => $projectId));
		$this->productApi->doProcess();
		$return = false;
		if ($this->productApi->isSuccess()) {
			$data = $this->productApi->getResultArray();
			return $data;
		} else {
			return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
		}
	}
	
	/**
	 * @author Employee Id: 4589
	 *
	 * Description: This Function Used For Update product group price
	 *
	 * @param array $requestParams
	 *
	 * @return array|multitype:string |multitype:string NULL
	 */
	public function editProductGroupPrice($requestParams)
	{
		//Add product API request
		$this->productApi->init('update_product_group_price');
		$this->productApi->setCallParameters(array('params'=>json_encode($requestParams)));
		$this->productApi->setPostMethodTrue();
		$this->productApi->doProcess();
		$return = false;
	
		if ($this->productApi->isSuccess()) {
			$data = $this->productApi->getResultArray();
			return $data;
		} else {
			return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
		}
	}
	
    /**
     * Emp Id : 4160
     * Description : Integrate with ERP
     * @param unknown
     */
    public function integrateWithErp($queueApiManager, $action, $id, $params = array()) {
        if ($action == 'create' || $action == 'update') {
            $countryArray = $this->serviceContainer->getParameter('country');
            $cultureCountry = array();
            foreach ($countryArray as $key=>$value) {
                foreach($value['language'] as $k => $v) {
                    $cultureCountry[] = $k.'_'.$value['short_name'];
                }
            }
            foreach ($cultureCountry as $key=>$value) {
                $returnData = $this->view($id, $value,true);
                if($returnData['status'] == 'success' && !empty($queueApiManager)) {
                    $queueApiManager->mapQueue($action, $returnData['data'][$id]);
                }
            }
        } else {
            if (!empty($queueApiManager)) {
                $queueApiManager->mapQueue($action, $params);
            }
        }
    }
    public function checkDuplicateSKU($sku,$supplierId,$productId){
    	$this->productApi->init('check_duplicate_sku');
    	$params = array('sku'=>$sku,'supplier_id'=>$supplierId);
    	if($productId){
    		$params['product_id'] = $productId;
    	}
    	$this->productApi->setCallParameters($params);
//     	$this->productApi->setPostMethodTrue();
    	$this->productApi->doProcess();
    	$return = false;
    	
    	if ($this->productApi->isSuccess()) {
    		$data = $this->productApi->getResultArray();
    		return $data;
    	} else {
    		return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
    	}
    }
    
    /**
     * Emp Id : 5190
     * Description : Get Matrix Type List Using Project Id
     * @param unknown $projectId
     */
    public function getMatrixTypeList($projectId){
        $this->productApi->init('get_matrix_type');
        $this->productApi->setCallParameters(array('project_id' => $projectId));
        $this->productApi->doProcess();
        $return = false;
        if ($this->productApi->isSuccess()) {
            $data = $this->productApi->getResultArray();
            return $data;
        } else {
            return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
        }
    }
    
    /**
     * Emp Id : 5190
     * Description : Get Matrix List with values Using Project Id
     * @param unknown $projectId
     */
    
    public function getMatrixList($projectId){
    	$this->productApi->init('get_matrix_list');
        $this->productApi->setCallParameters(array('project_id' => $projectId));
        $this->productApi->doProcess();
        $return = false;
        if ($this->productApi->isSuccess()) {
            $data = $this->productApi->getResultArray();
            return $data;
        } else {
            return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
        }
    }
    
    /**
     * @author Employee Id: 4160
     * Description : To get product details from API
     *
     * @param string $supplierId
     * @param string $limit
     *
     * @return array
     *
     * @throws Exception   
     *
     **/
    public function getProductsBySupplierId($supplierId, $culture, $start, $limit)
    {
        $this->productApi->init('supplier_product_list');
        $this->productApi->setCallParameters(array('supplier_id'=>$supplierId, 'culture'=>$culture, 'start'=>$start, 'limit'=>$limit));
        $this->productApi->setCulture($culture);
        $this->productApi->doProcess();
        if ($this->productApi->isSuccess()) {
            return $this->productApi->getResultArray();
        }
        return array();
    }
    
    /**
     * Emp Id : 5190
     * Description : Get Export Products with values Using CountryId and CultureId
     */
    
    public function getExportProduct($requestParams){
    	$brandId = (isset($requestParams['brand_id']) && $requestParams['brand_id']>0) ? $requestParams['brand_id'] : ''; 
    	$this->productApi->init('export_product_data');
    	$this->productApi->setCallParameters(array('supplier_id'=>$requestParams['supplier_id'],'country_id'=>$requestParams['country_id'],'culture_id'=>$requestParams['culture_id'],'project_id'=>$requestParams['project_id'],'brand_id'=>$brandId));
    	$this->productApi->doProcess();
    	$return = false;
    	if ($this->productApi->isSuccess()) {
    		$data = $this->productApi->getResultArray();
    		return $data;
    	} else {
    		return array('status'=>'error', 'message'=>$this->productApi->getErorDescription());
    	}
    }
    
    /**
     * copy product
     * @param unknown $supplierId
     * @param unknown $productId
     */
    public function copy($supplierId, $productId)
    {
    	$this->productApi->init('copy_product');
    	$this->productApi->setCallParameters(array('supplier_id'=>$supplierId, 'product_id'=>$productId));
    	//$this->productApi->setCulture($culture);
    	$this->productApi->doProcess();
    	if ($this->productApi->isSuccess()) {
    		return $this->productApi->getResultArray();
    	}
    	return array();
    }
    
    /**
     * Emp Id : 5190
     * Check Import Status
     * @param unknown $supplierId
     * @param unknown $culture
     * @param unknown $projectId
     * @param unknown $userId
     */
    public function checkImportStatus($supplierId, $projectId)
    {
    	$this->productApi->init('check_import_status');
    	$this->productApi->setCallParameters(array('supplier_id'=>$supplierId, 'project_id'=>$projectId));
    	$this->productApi->doProcess();
    	
    	if ($this->productApi->isSuccess()) {
    		return $this->productApi->getResultArray();
    	}
    	
    	return array();
    }
    
    /**
     * Emp Id : 5190
     * Description : upload import file
     */
    
    public function uploadImportFile($supplierId,$countryId,$cultureId,$projectId,$uploadFile,$uploadPath, $userId){
    	$this->productApi->init('upload_import_file');
    	
    	if(__PHP_VERSION__<54){
    		$param = array('supplier_id'=>$supplierId, 'country_id'=>$countryId, 'culture_id'=>$cultureId, 'project_id'=>$projectId, "file"=>"@".realpath($uploadFile),'upload_path'=>$uploadPath,'user_id'=>$userId);
    	}else{
    		$param = array('supplier_id'=>$supplierId, 'country_id'=>$countryId, 'culture_id'=>$cultureId, 'project_id'=>$projectId, "file"=>realpath($uploadFile),'upload_path'=>$uploadPath,'user_id'=>$userId);
    	}
    	
    	$this->productApi->setCallParameters($param);
    	$this->productApi->doProcess();
    	if ($this->productApi->isSuccess()) {
    		return $this->productApi->getResultArray();
    	}
    	return array();
    }
    
    /**
     * Emp Id : 5190
     * copy product
     * @param unknown $supplierId
     * @param unknown $culture
     * @param unknown $projectId
     * @param unknown $userId
     */
    public function importErrorLog($importId)
    {
    	$this->productApi->init('import_error_log');
    	$this->productApi->setCallParameters(array('import_id'=>$importId));
    	$this->productApi->doProcess();
    	 
    	if ($this->productApi->isSuccess()) {
    		return $this->productApi->getResultArray();
    	}
    	 
    	return array();
    }
    
    public function getCategoryIds($productId,$countryId)
    {
    	$categoryIds = array();
    	$categoryEntities = $this->productCategoryMappingRepository->getCategoryByProductId($productId,$countryId);
    	foreach($categoryEntities as $categoryEntity)
    	{
    		$categoryIds[] = $categoryEntity['categoryId'];
    	}
    	return $categoryIds;
    }
    
    public function productreletedid($productId)
    {
    
    	$productreletEntities = $this->relatedProductRepo->getreletedProductId($productId);
    	return $productreletEntities;
    }
    
    public function insertRelatedProducts($productId, $relatedProductIds,$culture)
    {
    
    	if((!(empty($relatedProductIds))) && is_array($relatedProductIds))
    	{
    		foreach($relatedProductIds as $relatedProductId)
    		{
    			$this->insertRelatedProduct($productId, $relatedProductId,$culture);
    		}
    	}
    }
    
    public function insertRelatedProduct($productId, $relatedProductId, $culture){
    
    	if((!(empty($productId))) && (!(empty($relatedProductId))) &&  (!(empty($culture))))
    	{
    		$relatedProducts = $this->relatedProductRepo->areProductsAlreadyRelated($productId, $relatedProductId, $culture);
    		if(empty($relatedProducts))
    		{
    			$relatedProduct = new RelatedProduct();
    			$relatedProduct->setProductId($productId);
    			$relatedProduct->setRelatedProductId($relatedProductId);
    			$relatedProduct->setCulture($culture);
    			$this->relatedProductRepo->insertRelatedProduct($relatedProduct);
    			 
    
    			$relatedProduct = new RelatedProduct();
    			$relatedProduct->setProductId($relatedProductId);
    			$relatedProduct->setRelatedProductId($productId);
    			$relatedProduct->setCulture($culture);
    			$this->relatedProductRepo->insertRelatedProduct($relatedProduct);
    		}
    	}
    }
    
    
    public function deleteRelatedProducts($productId, $relatedProductIds,$culture)
    {
    	if((!(empty($relatedProductIds))) && is_array($relatedProductIds))
    	{
    		foreach($relatedProductIds as $relatedProductId)
    		{
    			$this->deleteRelatedProduct($productId, $relatedProductId,$culture);
    		}
    	}
    }
    
    public function deleteRelatedProduct($productId, $relatedProductId, $culture){
    
    	if((!(empty($productId))) && (!(empty($relatedProductId))) &&  (!(empty($culture))))
    	{
    		$relatedProducts = $this->relatedProductRepo->areProductsAlreadyRelated($productId, $relatedProductId, $culture);
    		if((!(empty($relatedProducts))))
    		{
    			foreach($relatedProducts as $relatedProduct)
    			{
    				$this->relatedProductRepo->deleteRelatedProduct($relatedProduct);
    			}
    		}
    
    		$reverseRelatedProducts = $this->relatedProductRepo->areProductsAlreadyRelated($relatedProductId, $productId, $culture);
    		if((!(empty($reverseRelatedProducts))))
    		{
    			foreach($reverseRelatedProducts as $reverseRelatedProduct)
    			{
    				$this->relatedProductRepo->deleteRelatedProduct($reverseRelatedProduct);
    			}
    		}
    	}
    }
    
    /**
     * Emp Id : 4014
     * Description : Download Exported Products with values Using CountryId,CultureId,SupplierId and ProjectId
     */
    public function doProductCategoryMapping($projectId){
    	$countryArray = $this->serviceContainer->getParameter('country');

    	foreach ($countryArray as $c=>$country) {
	    	$this->productApi->init('get_all_product_category_mapping');
	    	$this->productApi->setCallParameters(array('project_id'=>$projectId,'country_id'=>$country['id']));
	    	$this->productApi->doProcess();
	    	if ($this->productApi->isSuccess()) {
	    		$productCategoryMappingArray = $this->productApi->getResultArray();
	    		if(!empty($productCategoryMappingArray)){
	    			$productCategoryObj = $this->productCategoryMappingRepository->setProductCategoryMapping($productCategoryMappingArray,$country['id']);
	    		}
	    	}
    	}
    	
    	return array();
    }
    
}
?>
