<?php
namespace OfficeBrain\Bundle\ProductBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Translation\Translator;
use OfficeBrain\Bundle\CoreBundle\CustomeHandler as FormErrorManager;

/*
 * This class for base functionality related to product admin. @author Office Brain - 4808 <support@officebrain.com>
 */

/**
 * @Route("/admin/{_locale}/product/distributor")
 */
class DistributorConfigureController extends Controller
{
   /**
	 * @author Employee Id: 4808
	 * 
	 * Description : This function used for Set and intilize variables and request array
	 *
	 **/
    public function init(){
        $this->request = $this->getRequest();
        $this->entityManager = $this->getDoctrine()->getManager();
        $this->session = $this->request->getSession();
        $this->translator = $this->get('translator');
        $this->formErrorManager = new FormErrorManager\JsonError();
        $this->productApiManager = $this->get("office_brain_product_admin_manager");
        $this->distributorManager = $this->get("officebrain_distributor_admin_manager");
        $this->brandApiManager = $this->get("office_brain_brand_api_manager");
        $this->categoryApiManager = $this->get("officebrain_category_api_manager");
        if (!$this->getUser() && $this->request->isXmlHttpRequest()) {
           // throw new AccessDeniedHttpException();
        }
        if ($this->has('office_brain_queue_api_manager')) {
            $this->request->attributes->set('object', 'Product');
            $this->queueApiManager = $this->get('office_brain_queue_api_manager');
        }
    }
    
    
    /**
     * @author Employee Id: 5190
     *
     * Description : This function used for Add Product Information
     * @return array
     * @Route("/add", name="officebrain_product_distributor_add"),
     * @Template("OfficeBrainProductBundle:ProductAdmin:distributorAdd.html.twig")
     */
    public function addAction(){
    	$this->init();
    	$projectSetting = $this->request->get('project_setting');
    
    	$cultureName = $this->request->get('culture_name');
    	$master_product_id = $this->request->get('master_product_id', '');
    	$distributor_product_id = $this->request->get('distributor_product_id', '');
    	$param = $this->request->get('_route_params');
    	$route = $this->request->get('_route');
    
    	$locale_language = $param['_locale'];
 		   	
    	if ($this->request->isXmlHttpRequest() && $this->request->getMethod()=='POST') {
    		
    		
    		$data = $this->request->request->all();
    		$data['master_product_id'] = $master_product_id;
    		$data['distributor_product_id'] = $distributor_product_id;
    		$data['project_id'] = $projectSetting['project_id'];
    		$data['locale_language'] = $locale_language;
    		$data['instance_type'] = $projectSetting['instance_type'];
    		$data['instance_id'] = $projectSetting['instance_id'];

    		$dataResponse =  $this->distributorManager->add($data);
    		if ($dataResponse['status']=='success') {
    			$response = array('form_status' => $dataResponse['status'],'success_message'=>$this->get('translator')->trans($dataResponse['message']));
    			$this->session->set('product-list-success', $this->get('translator')->trans($dataResponse['message']));
    			 
    			$actionPerformed = 'create';
    			if ($master_product_id) { $actionPerformed = 'update';}
    			//SOLR SYNC CODE START
    			$is_solr_syn_enabled = $this->container->getParameter('solr_sync');
    			if($is_solr_syn_enabled){
    				$env = $this->container->getParameter("kernel.environment");
    				$localization_to_update = $this->container->getParameter('localization_to_fetch');
    				$this->productApiManager->updateSolrData($dataResponse['master_product_id'],$localization_to_update,$projectSetting['project_id'],$env,$data['instance_id'],'update');
    			}
    			//SOLR SYNC CODE END
    		}
    		else {
    			$response = array('form_status' => $dataResponse['status'],'error_message'=>$this->get('translator')->trans($dataResponse['message']));
    		}
    		return new JsonResponse($response);
    	}

    	$data_to_set =  $this->productApiManager->preSetDataForPlugin($projectSetting['configuration_rule']['product'],$projectSetting['project_id']);
    	 
    	$this->viewTwigData['plugin_data'] = $data_to_set['plugin_data'];
    	$this->viewTwigData['ATTR_TYPE_IDS'] = $this->container->getParameter('attributes_types');
    	$this->viewTwigData['ATTR_IMPRINT_POSITION'] = $this->container->getParameter('imprint_position_master_id');
    	$this->viewTwigData['ATTR_IMPRINT_COLOR'] = $this->container->getParameter('imprint_color_master_id');
    	$this->viewTwigData['API_VERSION'] = $this->container->getParameter('api.available_call_to_override');
    	$this->viewTwigData['ATTR_COLOR_ID'] = $this->container->getParameter('color_attribute_id');
    	$this->viewTwigData['params_to_append'] = array_merge($this->request->get('_route_params'), $this->request->query->all());
    	$this->viewTwigData['form_method'] = 'add';
    	return $this->viewTwigData;
    }
    
    /**
     * @author Employee Id: 5190
     *
     * Description : This function used to Edit Distributor Product Information
     * @return array
     * @Route("/edit/{master_product_id}", name="officebrain_product_distributor_edit"),
     * @Template("OfficeBrainProductBundle:ProductAdmin:distributorAdd.html.twig")
     */
    public function editNewAction(){
    	$this->init();
    	$projectSetting = $this->request->get('project_setting');
    	$countryArray = $this->container->getParameter('country');
    	$languageArray = $this->container->getParameter('language');
    	$country_to_pass = array_column($countryArray,'short_name');
    	$language_to_pass = array_keys($languageArray);
    	$locale = $this->request->get('_locale',$this->container->getParameter('locale'));
    	@list($default_language,$default_country) = explode("_",$locale);
    	$cultureName = $this->request->get('culture_name');
    	$masterProductId = $this->request->get('master_product_id', '');
    	$param = $this->request->get('_route_params');
    	$route = $this->request->get('_route');
    	$distributorProductId=0;
    	
    	$productInfo = $this->productApiManager->editView($masterProductId,$language_to_pass,$country_to_pass,$default_language);
    	
    	if(!empty($masterProductId) && $masterProductId >0){
    		$distributorProductExist =  $this->distributorManager->existsDistributorProduct($masterProductId);
    		if($distributorProductExist){
    			$masterProductId= $distributorProductExist->getPmsId();
    			$distributorProductId = $distributorProductExist->getId();
    			$productInfo = $this->distributorManager->editViewDistributorProduct($productInfo, $distributorProductId, $language_to_pass, $country_to_pass, $default_language);
    			
    		}
    		
    		if(!count($productInfo)){
    			throw $this->createNotFoundException('The product does not exist');
    		}
    	}
    	else{
    		throw $this->createNotFoundException('The product does not exist');
    	}

    	$data_to_set =  $this->productApiManager->preSetDataForPlugin($projectSetting['configuration_rule']['product'], $projectSetting['project_id'],$productInfo);
    	
    	$this->viewTwigData['plugin_data'] = $data_to_set['plugin_data'];
    	$this->viewTwigData['ATTR_TYPE_IDS'] = $this->container->getParameter('attributes_types');
    	$this->viewTwigData['ATTR_IMPRINT_POSITION'] = $this->container->getParameter('imprint_position_master_id');
    	$this->viewTwigData['ATTR_IMPRINT_COLOR'] = $this->container->getParameter('imprint_color_master_id');
    	$this->viewTwigData['API_VERSION'] = $this->container->getParameter('api.available_call_to_override');
    	$this->viewTwigData['ATTR_COLOR_ID'] = $this->container->getParameter('color_attribute_id');
    	$this->viewTwigData['params_to_append'] = array_merge($this->request->get('_route_params'), $this->request->query->all());
    	$this->viewTwigData['master_product_id'] = $masterProductId;
    	$this->viewTwigData['distributor_product_id'] = $distributorProductId;
    	$this->viewTwigData['form_method'] = 'edit';
    	return $this->viewTwigData;
    }
    
    
    /**
     * EMp Id : 5190
     * Description : This Function is Used For Check SKU Exists Or not
     *
     * @Route("/check-distributor-product-duplicate-sku",
     * name="officebrain_product_distributor_check_duplicate_sku")
     */
    public function checkDistributorProductDuplicateSKU(){
    	$this->init();
    	$sku = $this->request->get('sku');
    	$supplierId = $this->request->get('supplier_id');
    	$productId = $this->request->get('product_id','');
    	$data = $this->distributorManager->checkDistributorProductDuplicateSKU($sku,$supplierId,$productId);
    	$data['message'] = $this->translator->trans('product.'.$data['message']);
    	return new JsonResponse($data);
    }
    
    /**
     * @author Employee Id: 5190
     *
     * Description : This function used for List Product Information
     *
     * @Route("/list/{page}",
     * name="officebrain_bundle_product_distributor_list_product_wo_culture",
     * requirements={"records_per_page"="12|24|48|100|996", "page"="\d+"},
     * defaults={"records_per_page"=100,"page"=1})
     *
     * @Route("/list/{country}/{language}/{page}",
     * name="officebrain_bundle_product_distributor_list_product",
     * requirements={"records_per_page"="12|24|48|100|996","page"="\d+"},
     * defaults={"records_per_page"=20,"page"=1})
     * @Template("OfficeBrainProductBundle:ProductAdmin:distributorProductList.html.twig")
     */
    public function listDistributorProductAction(){
    	$this->init();
    	list($defaultCulture,$defaultCountry) = explode("_",$this->request->get("_locale"));
    
    	$param = $this->request->get('_route_params');
    	$culture = $this->request->get('language',$defaultCulture);
    	$country = $this->request->get('country',$defaultCountry);
    	$activeCulture = $culture;
    	$searchStatus = $this->request->query->get('search_status', '');
    	$searchQuery = $this->request->query->get('search_query', '');
    	$sortBy = $this->request->query->get('sort', 'updatedAt');
    	$sortType = $this->request->query->get('direction', 'desc');
    	$searchParam = $this->request->query->get('search_param', '');
    	$supplier_id = $this->request->query->get('supplier_id','');
    	$brandIds = $this->request->query->get('brand_id','');
    	$catIds = $this->request->query->get('cat_id','');
    
    	$cultureCategory =  $activeCulture . "_" . $country;
    
    	// For Pagination
    	$page = $this->request->get('page', '1');
    	$records_per_page = $param['records_per_page'];
    	$recordsPerPage = $this->request->query->get('recordsPerPage',$records_per_page);
    	$start_index = (($page - 1) * $recordsPerPage - 1);
    	// End Pagination
    	$projectSetting = $this->request->get('project_setting');
    	$projectId = $projectSetting['project_id'];
    	$supplierData = $this->productApiManager->getSupplierNameList($projectId);
    	
    	$productData = $this->distributorManager->listDistributorProduct($searchStatus,$searchParam, $searchQuery, $sortType, $sortBy,$activeCulture,$country,$supplier_id,$supplierData,$records_per_page,$page,$projectId,$brandIds,$catIds);
    	
    	$paginator  = $this->get('knp_paginator');
    	$productData['image_url'] = "";
    	
    	$data['pagination'] = $paginator->paginate($productData, $page, $recordsPerPage);
    	$data['page']=$page;
    	$data['search_status']=$searchStatus;
    	$data['search_query']=$searchQuery;
    	$data['sort_by']=$sortBy;
    	$data['sort_type']=$sortType;
    	$data['search_param']=$searchParam;
    	$data['supplier_id']=$supplier_id;
    	$data['records_per_page'] = $recordsPerPage;
    	$data['supplier_data'] = $supplierData;
    
    	if(array_key_exists('status',$productData) && $productData['status'] == 'error' && is_array($productData))
    	{
    		$productSentData = array();
    		$data['error_message'] = $productData['error_message'];
    	}
    	else
    	{
    		if($productData['data']){
    			$data['total_product'] = $productData['count'];
    			$productSentData = $productData['data'];
    		}else{
    			$productSentData = array();
    			$data['error_message'] = $this->get('translator')->trans("product.RECORD_NOT_FOUND");
    		}
    	}
    
    	$data['params_to_append'] = array_merge($this->request->get('_route_params'), $this->request->query->all());
    	
    	return array('data'=>$data,'activeCountry' => $country, 'activeCulture'=>$activeCulture,'productData'=>$productSentData);
    }
    
    /**
     * EMp Id : 5190
     * Description : This Function is Used For Update Product Status According To Parameter
     *
     * @Route("/changestatus/{country}/{set_status}",
     * requirements = {"set_status"="1|0"},
     * name="officebrain_product_distributor_changestatus")
     */
    public function changeProductStatusAction(){
    	$this->init();
    	$param=$this->request->get('_route_params');
    	 
    	$ids_to_pass = array();
    	$ids = $this->request->get('ids','');
    	$ids_to_pass = explode("::",$ids);
    	$productId = json_encode($ids_to_pass);
    	 
    	$projectSetting = $this->request->get('project_setting');
    	$country = $this->request->get('country');
    	$setStatus = $this->request->get('set_status');
    	 
    	$productData = $this->distributorManager->changeProductStatus($productId,$country,$setStatus);
    	$data = array();
    	$data['status'] = $productData['status'];
    	$data['message'] = $this->translator->trans('product.'.$productData['message']);
    	return new JsonResponse($data);
    }
    
    /**
     * @author Employee Id: 4246
     * Description : This function used for Delete Product
     * @Route("/delete",
     * name="officebrain_product_distributor_delete")
     */
    public function deleteAction(){
    	$this->init();
    	$projectSetting = $this->request->get('project_setting');
    	$product_master_id = $this->request->get('product_master_id');
    	$distributor_product_id = $this->request->get('distributor_product_id');
    	$product_country = $this->request->get('product_country');
    	
    	$productData = $this->distributorManager->deleteProduct($product_master_id,$distributor_product_id, $product_country);
    	$data = array();
    	 
    	if($productData['status'] == 'success'){
    		//SOLR SYNC CODE START
    		$is_solr_syn_enabled = $this->container->getParameter('solr_sync');
    		if($is_solr_syn_enabled){
    			$env = $this->container->getParameter("kernel.environment");
    			$localization_to_update = $this->container->getParameter('localization_to_fetch');
    			$this->productApiManager->updateSolrData($product_master_id,$localization_to_update,$projectSetting['project_id'],$env,$projectSetting['instance_id'],'delete');
    		}
    		//SOLR SYNC CODE END
    	}
    	
    	$data['status'] = $productData['status'];
    	$data['message'] = $this->translator->trans('product.'.$productData['message']);
    	return new JsonResponse($data);
    }
    
     /**
     * @author Employee Id: 5190
     * Description : This function used for Distributor Product Information 
     * @Route("/view",
     * name="officebrain_distributor_product_view")
     * @Template("OfficeBrainProductBundle:ProductAdmin:distributorView.html.twig")
     */
    public function compareProductViewAction(){
    	$this->init();
    	$product_culture = $this->request->get('product_culture','');
    	$product_ids = $this->request->get('product_ids','');
    	$this->viewTwigData['distdata'] = '';
    	$this->viewTwigData['proddata'] = '';
    	 
    	$distributorProductData = $this->distributorManager->compareProductView($product_ids,$product_culture);

    	if($distributorProductData['status'] === "success"){
    		$distributorProductInfo = $distributorProductData['data'];
    		$this->viewTwigData['distdata'] = $distributorProductInfo[$product_ids];
    	}
    	else{
    		$this->viewTwigData['distdata']['error_message'] = $this->get('translator')->trans('product.'.$distributorProductData['error_message']);
    	}
    	
    	//$productData = $this->productApiManager->view($product_ids,$product_culture,true);
    	$productData = $this->distributorManager->distViewAPI($product_ids,$product_culture,true);
    	
    	if($productData['status'] == "success"){
    		$productInfo = $productData['data'];
    		$this->viewTwigData['proddata'] = $productInfo[$product_ids];
    	}
    	else{
    		 $this->viewTwigData['proddata']['error_message'] = $this->get('translator')->trans('product.'.$productData['message']);
    	}
    	$this->viewTwigData['API_VERSION'] = $this->container->getParameter('api.available_call_to_override');
    	$this->viewTwigData['params_to_append'] = array_merge($this->request->get('_route_params'), $this->request->query->all());
    	return $this->viewTwigData;
    }
    
    
    /**
     * @author Employee Id: 5190
     * Description : This function used for Distributor Product Information
     * @Route("/distview",
     * name="officebrain_distributor_product_overwrite_view")
     * @Template("OfficeBrainProductBundle:ProductAdmin:view.html.twig")
     */
    public function distViewAction(){
    	$this->init();
    	$product_culture = $this->request->get('product_culture','');
    	$product_ids = $this->request->get('product_ids','');
    	$productData = $this->distributorManager->distViewAPI($product_ids,$product_culture,true);
    	
    	if($productData['status'] == "success"){
    		$productInfo = $productData['data'];
    		if(array_key_exists('price_unit',$productInfo)){
    			$priceUnit = $this->container->getParameter('price_unit');
    			$productInfo['price_unit'] = array_key_exists(trim($productInfo['price_unit']),$priceUnit)?$priceUnit[$productInfo['price_unit']]:$productInfo['price_unit'];
    		}
    		$this->viewTwigData['data'] = $productInfo;
    		/* $productData = $this->distributorManager->distributorView($productInfo);
    		if(array_key_exists('price_unit',$productData)){
    			$priceUnit = $this->container->getParameter('price_unit');
    			$productData['price_unit'] = array_key_exists(trim($productData['price_unit']),$priceUnit)?$priceUnit[$productData['price_unit']]:$productData['price_unit'];
    		}
    		$this->viewTwigData['data'] = $productData; 
    		*/
    		
    	}
    	else{
    		$this->viewTwigData['data']['error_message'] = $this->get('translator')->trans('product.'.$productData['message']);
    	}
    	$this->viewTwigData['API_VERSION'] = $this->container->getParameter('api.available_call_to_override');
    	$this->viewTwigData['params_to_append'] = array_merge($this->request->get('_route_params'), $this->request->query->all());
    	return $this->viewTwigData;
    }
    
    
}
