<?php

namespace OfficeBrain\Bundle\CategoryBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
use OfficeBrain\Bundle\SolrBundle\Helper\ProductHelper;
use OfficeBrain\Bundle\SearchBundle\Form\Data\ProductSearchData;
use OfficeBrain\Bundle\SearchBundle\Form\Type\ProductSearchType;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Form\FormError;

/**
 * Sync product Category data command
 *
 * @author OfficeBrain 4220 <info@officebrain.com>
 */
class SyncProductCategoryCommand extends ContainerAwareCommand
{
    CONST COMMAND_NAME = 'office_brain:solr:sync:product-category';
    
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this
            ->setName(self::COMMAND_NAME)
            ->setDescription('Command to sync category product data')
        	->addOption('instanceId', null, InputOption::VALUE_OPTIONAL, 'project instance Id')
        	->addOption('culture', null, InputOption::VALUE_OPTIONAL, 'supported search culture')
        	->addOption('categoryId', null, InputOption::VALUE_OPTIONAL, 'Valid Category id that is pms id of category. ');
    }
    
    public function init() {
    	$this->container = $this->getContainer();
    	$this->request = $this->container->get('request');
    	$this->projectSetting = $this->request->get('project_setting');
    	$this->localeLanguage = $this->projectSetting['locale_language'];
    	$this->getCultureValue();
    	$this->entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
    	$this->searchManager = $this->container->get('office_brain_search_manager');
    	$this->formFactory = $this->container->get('form.factory');
    	$this->languageId = $this->getLanguageId();
    	$this->responseArray = array();
    	$this->productSearchClient = $this->container->get('office_brain_solr.product_search');
    	$this->productCategoryMappingRepo = $this->entityManager->getRepository('OfficeBrainProductBundle:ProductCategoryMapping');
    	
    	if(isset($this->projectSetting['instance_theme_meta']['product_category']['custom_label'])){
    		$this->categoryCustomlabel = $this->projectSetting['instance_theme_meta']['product_category']['custom_label'];
    	}
    	   	
    }
    

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
    	$this->init();
    	$startAt = microtime(true);
    	$categoryId= $input->getOption('categoryId','');
    	$instanceId= $input->getOption('instanceId',null);
    	$culture = $input->getOption('culture',null);
    	$categoryArray = array();
    	if ($instanceId == '') {
    		$output->writeln("Please provide a instance id");
    		return;
    	}
    	
    	if ($culture == '') {
    		$output->writeln("Please provide a culture");
    		return;
    	}
    	
    	/* $this->productQueue = $this->productCategoryMappingRepo->getProductCategoryMapping($categoryId);
    	
    	foreach ($this->productQueue as $key=>$categoryData){
    		$categoryArray[$categoryId][] = array('product_id' => $categoryData['productId']);
    	} */
    	
    	$productCounts = 0;
    	
//     	if (count($categoryArray) > 0) {
    		$searchQuery = $this->searchManager->getSearchArray();
    		$searchQuery['product_search']['instanceId']= $instanceId;
    		if($categoryId!=0 || $categoryId !='' ){
    			$searchQuery['product_search']['categoryId']= json_encode(array($categoryId));
    		}    		    			
    		$productSearchData = new ProductSearchData($this->entityManager, $this->languageId);
    		$productSearchForm = new ProductSearchType();
    		$this->form = $this->formFactory->create($productSearchForm, $productSearchData, array('csrf_protection' => false));
    		$this->form->bind($searchQuery['product_search']);
    		$this->responseArray = $this->searchManager->searchResult($this->form->getData(),true);
    		if(isset($this->responseArray['search_result_array']['data']) && count($this->responseArray['search_result_array']['data']) > 0)
    		{
    			$totalProducts = $this->responseArray['search_result_array']['data'];
//     			print_r($this->responseArray['search_result_array']['data']);die;
    			foreach ($this->responseArray['search_result_array']['data'] as $newKey=>$productData)
    			{
    				if ($culture !== null) {
    					$this->productSearchClient->setSearchCulture($culture);
    				}
    				$update = $this->productSearchClient->getCreateUpdateInstance();
    				$this->createDynamicIndex($update,$productData,$culture);
    				$productCounts = $productCounts + 1;
    			}
    			$output->writeln('Completed For category '.$categoryId .' And Total Products : '. count($totalProducts));
    		}
    		else
    		{
    			$output->writeln('No product found for category  '.$categoryId);
    		}
//     	}
    	
    	/* $time_taken = (microtime(true) - $startAt) / 60;    	
    	$time= "Processing time: " . sprintf("%.4f", ($time_taken)) . " minutes";    	
    	$logFilePath = $this->getContainer()->getParameter("kernel.logs_dir") . DIRECTORY_SEPARATOR . "product_category_" . $culture . ".csv";    	
    	$array = array(date("D M j G:i:s T Y"), $productCounts, $time);
    	$fp = fopen($logFilePath, 'a+');
    	fputcsv($fp, $array);
    	fclose($fp); */
    }
    
    /**
     * Create solr index function
     * @param SolrUpdate $update instance
     * Update For Supplier Prioritization
     */
     
    public function createDynamicIndex($update,$product,$culture)
    {
    	$this->init();
    	$doc = $update->createDocument ();
    	
    	$doc->instance_id_i=!empty($product['instance_id']) && is_int($product['instance_id']) ? $product['instance_id']:1;
    	$doc->currency_name_s = $product['currency_name'];
    	$doc->rating_f = $product['rating'];
    	$doc->id = $doc->instance_id_i."-".$product['product_id'];
    	$doc->culture_product_id_i = $product ['culture_product_id'];
    	$doc->product_id_i = $product ['product_id'];
    	$doc->slug_t = $product ['slug'];
    	
    	
    	if(isset($product ['category_is'])){
    		$doc->category_is = $product ['category_is'];
    	}
    	$doc->supplier_id_i = $product['supplier_id'];
    	$doc->supplier_s = $product ['supplier'];
    	$doc->supplier_t = $product ['supplier'];
    	$doc->supplier_id_name_s = $product ['supplier_id']."|".$product ['supplier'];
    	
    	if (isset ( $product ['min_price'] )) {$doc->min_price_f = $product ['min_price'];}
    	if (isset ( $product ['max_price'] )) {$doc->max_price_f = $product ['max_price'];}
    	if (isset ( $product ['min_quantity'] )) {$doc->min_quantity_i = $product ['min_quantity'];}
    	if (isset ( $product ['max_quantity'] )) {$doc->max_quantity_i = $product ['max_quantity'];}
    	
    	$doc->sku_t = $product ['sku'];
    	$doc->sku_s = $product ['sku'];
    	$doc->sku = $product ['sku'];
    	$doc->title_t = $product ['title'];
    	$doc->title_s = $product ['title'];
    	$doc->description_t = $product ['description'];
    	$doc->image_path_t = $product ['image_path'];
    	$doc->image_thumb_path_t = $product ['image_thumb_path'];

    	if(isset($product ['keyword_txt'])){ $doc->keyword_txt = $product ['keyword_txt'];}
    	if(isset($product ['color_mapping'])){$doc->color_mapping = $product ['color_mapping'];}
    	if(isset($product ['color_search_image'])){$doc->color_search_image = $product ['color_search_image'];}
    	if(isset($product ['color_mapping_search'])){$doc->color_mapping_search = $product ['color_mapping_search'];}
    	if(isset($product ['variation_image_path_txt'])){$doc->variation_image_path_txt = $product ['variation_image_path_txt'];}
    	if(isset($product ['variation_image_id_ss'])){$doc->variation_image_id_ss = $product ['variation_image_id_ss'];}
    	
    	if (isset ( $product ['attribute'] )){$doc->attribute_ss = $product ['attribute'];}
    	if(isset($product ['color'])){$doc->color_ss = $product ['color'];}
    	if (isset ( $product ['call_for_price'] )) {$doc->call_for_price_s = $product ['call_for_price'];}
    	if (isset ( $product ['base_price'] )) {$doc->base_price_f = $product ['base_price'];}
    	if (isset ( $product ['line_name'] )) {
    		$doc->line_name_t = $product ['line_name'];
    		$doc->line_name_s = $product ['line_name'];
    		$doc->line_name_id_name_s = (isset ( $product ['line_name_id'] )?$product ['line_name_id']:'')."|".$product ['line_name'];
    	}
    	if (isset ( $product ['line_name_id'] )) {
    		$doc->line_name_id_i = $product ['line_name_id'];
    	}
//     	print_R($product ['category_name_id_ss'] );die;
    	if (isset ( $product ['category_name_id_ss'] )) {
    		$productCategoryArray = array();
    		$categoryNameArray = array();
    		$oldCategoryNameArray = array();
    		foreach ($product ['category_name_id_ss'] as $val){
    			$categoryArray = explode("|",$val);
    			$pmsId = $categoryArray[0];
    			$oldCategoryNameArray[] = $categoryArray[1];
    			if(isset($this->categoryCustomlabel) && isset($this->categoryCustomlabel[$pmsId])){
    				$categoryArray[1] = $this->categoryCustomlabel[$pmsId][$this->languageId];
    			}
    			$categoryNameArray[] = $categoryArray[1];
//     			$categoryName = $categoryArray[1];
    			$productCategoryArray[] = implode("|",$categoryArray);
    		}
//     		$doc->category_name_id_ss = $product ['category_name_id_ss'];
    		$doc->category_name_id_ss = $productCategoryArray;
    		//$product['keyword_ss'] = $this->generateKeyword($product,$categoryNameArray,$oldCategoryNameArray);
    		$product['keyword_ss'] = $this->generateKeyword($product['keyword_ss'],$categoryNameArray,$oldCategoryNameArray);
    		
//     		$product['spelling'] = $this->generateKeyword($product['spelling'],$categoryNameArray,$oldCategoryNameArray);
    		$product['keyword_txt'] = $this->generateKeyword($product['keyword_txt'],$categoryNameArray,$oldCategoryNameArray);
    	}
    	
    	if (isset ( $product ['category_name_ss'])) {
    		if(isset($categoryNameArray)){
    			$doc->category_name_ss = $categoryNameArray;
    			$doc->category_name_txt = $categoryNameArray;
    		}else{
    			$doc->category_name_ss = $product ['category_name_ss'];
    			$doc->category_name_txt = $product ['category_name_ss'];
    		}
    	}
    	
    	if(isset($product ['keyword_ss'])){
    		$doc->keyword_ss = $product['keyword_ss'];
    	}
    	
    	$product['spelling'] = "";
    	if(isset($product ['spelling'])){
    		$doc->spelling = $product['spelling'];
    	}
    	if(isset($product ['keyword_txt'])){
    		$doc->keyword_txt = $product['keyword_txt'];
    	}
    	
    	if(isset($product['is_feature_product'])){
    		$doc->is_feature_product_t = $product['is_feature_product'];
    	}    	
		
    	if (isset ( $product['catalog_year'] )){
    		$doc->catalog_year_s = $product['catalog_year'];
    	}
    	
    	$doc->price_valid_until_s = $product ['price_valid_until'];
    	$doc->price_currency_s = $product ['price_currency'];
    	$doc->post_name_s = $product ['slug'];
    	
    	if(isset($product ['custom_sort_order'])){
    		$doc->custom_sort_order_i = $product ['custom_sort_order'];
    	}else{
    		$doc->custom_sort_order_i = 1;
    	}
    	if(isset($product['price_unit'])){
    		$doc->price_unit_s = $product['price_unit'];
    	}
    	
    	if(isset($product['price_valid_until'])){
    		$doc->price_valid_until_s = $product['price_valid_until'];
    	}
    	
    	if(isset($product['price_currency'])){
    		$doc->price_currency_s = $product['price_currency'];
    	}
    	
    	if(isset($product['production_time'])){
    		$doc->production_time_i = $product['production_time'];
    	}
    	
    	if(isset($product['production_time_unit'])){
    		$doc->production_time_unit_ss = $product['production_time_unit'];
    	}
    	
    	unset($product['id'],$product['instance_id'],$product['currency_name'],$product['rating'],$product['culture_product_id'],$product['product_id'],$product['slug'],$product['keyword_ss'],$product['supplier_id'],$product['supplier'],$product['min_price'],$product['max_price'],$product['min_quantity'],$product['max_quantity'],$product['sku'],$product['title'],$product['description'],$product['image_path'],$product['image_thumb_path'],$product['color_mapping'],$product['color_mapping_search'],$product['variation_image_path_txt'],$product['variation_image_id_ss'],$product['call_for_price'],$product['base_price'],$product['line_name'],$product['line_name_id'],$product['category_name_ss'],$product['category_name_id_ss'],$product['post_name'],$product['score'],$product['category_name_txt'], $product['catalog_year'], $product['price_unit'], $product['is_feature_product'], $product['price_valid_until'], $product['price_currency'], $product ['custom_sort_order'],$product['keyword_txt'],$product['production_time'],$product['production_time_unit']);
    	
    	foreach($product as $key=>$val){
    		if (strpos($key, 'min_qty') !== false || strpos($key, 'max_qty') !== false) {
    			$key = $key.'_i';
    		}
    		elseif (strpos($key, 'price') !== false || strpos($key, 'min_price') !== false || strpos($key, 'max_price') !== false) {
    			$key = $key.'_f';
    		}
    		elseif (strpos($key, 'code') !== false) {
    			$key = $key.'_s';
    		}else{
    			$key = $key;
    		}
    		$doc->$key = $val;
    	}
    	
    	$update->addDocument($doc);
    	$this->clientFactoryService = $this->getContainer()->get('office_brain_solr.client_factory_service');
    	$this->searchClient = $this->clientFactoryService->getProductSearchClientInstance ( $culture );
    	$update->addCommit();
    	$this->searchClient->update($update);
    }
    
    public function getCultureValue()
    {
    	$cultures = array();
    
    	if ($this->localeLanguage && $this->localeLanguage != '' && (int) $this->localeLanguage == 0) {
    		list($this->languageCode, $this->countryCode) = explode('_', $this->localeLanguage);
    	}
    
    	return $cultures;
    }
    
    public function getLanguageId(){
	    switch ($this->languageCode) {
	    	case 'fr':
	    		$language = '3';
	    		break;
	    	default:
	    		$language = '1';
	    		break;
	    }	    
	    return $language;
    }
    
    /* public function generateKeyword($product,$categoryNameArray,$oldCategoryNameArray)
    {
    	$product_keywords = isset($product['keyword']) && !empty($product['keyword']) ? explode(",",$product['keyword']): array();
    	$title_keywords = ProductHelper::extractCommonWords($product['title']);   	   	
    	//Array Trim
    	$product_keywords = array_map('trim', $product_keywords);
    	//Title + Product Key Merge
    	$title_keywords = array_merge($title_keywords, $product_keywords);
    	
    	$product['keyword_ss'] = array_unique(array_merge($title_keywords,(is_array($categoryNameArray) ? $categoryNameArray : array()),
    			(isset($product['brand']) && isset($product['brand']['name']) ? array($product['brand']['name']):array()),
    			(isset($product['supplier_id']) && isset($product['supplier']) ? array($product['supplier']):array()),
    			array($product['sku'])));
    	
    	return array_filter($product['keyword_ss']);
    } */
    
    public function generateKeyword($product,$categoryNameArray,$oldCategoryNameArray)
    {
    	$product = array_map('trim',$product);
    	$categoryNameArray = array_map('trim',$categoryNameArray);
    	$oldCategoryNameArray = array_map('trim',$oldCategoryNameArray);
    	$returnVal = array_merge(array_diff($product,$oldCategoryNameArray),$categoryNameArray);
    	return $returnVal;
    }
}