<?php

namespace OfficeBrain\CustomBundle\ProductBundle\Manager\Extended;

use OfficeBrain\CustomBundle\ProductBundle\Manager\AbstractManager\SkuMaskingAbstract as SkuMaskingAbstract;
use OfficeBrain\CustomBundle\ProductBundle\Entity\SkuMasking;

class SkuMaskingExtended extends SkuMaskingAbstract
{
    public function __construct($entityManager, $request, $paginatorManager, $countries, $languages)
    {
        parent::__construct($entityManager, $request, $paginatorManager, $countries, $languages);
    }

    public function __destruct()
    {
        parent::__destruct();
    }

    /**
     * @author Employee Id: 5497
     * Description : get all sku
     *
     * @return object
     * */
    public function getSkuMaskingList()
    {
        $data = array();

        $skuMasking = $this->skuMaskingRepository->findAll();
        if (count($skuMasking) > 0) {
            $data['pagination'] = $this->paginatorManager->paginate($skuMasking, $this->request->get('page'), $this->recordsPerPage, array(), count($skuMasking));
        }

        $data['records_per_page'] = $this->recordsPerPage;
        $data['page'] = $this->request->get('page');

        return $data;
    }
    
    public function getAllSkuList()
    {
    	$skuMasking = $this->skuMaskingRepository->findAll();
    	return $skuMasking;
    }

    public function getMaskingBySku($sku='')
    {
        $data = array();
        if($sku == ''){
        	$sku = $this->request->get('sku');
        }

        $skuMasking = $this->skuMaskingRepository->findBySku($sku);
        
        if (empty($skuMasking)) {
            $data['error'] = "PAGE_NOT_FOUND";
        } 
        else {
            $data = $skuMasking[0];
        }
        
        return $data;
    }
    
    public function getMaskingBySkuAndSupplier($sku='', $supplier='')
    {
    	$data = array();
    	if($sku == ''){
    		$sku = $this->request->get('sku');
    	}
    	if($supplier == ''){
    		$supplier = $this->request->get('supplier_id');
    	}
    
    	$skuMasking = $this->skuMaskingRepository->findBySkuAndSupplier($sku, $supplier);
    
    	if (empty($skuMasking)) {
    		$data['error'] = "PAGE_NOT_FOUND";
    	}
    	else {
    		$data = $skuMasking[0];
    	}
    
    	return $data;
    }
    
    public function getMaskingByNewSku($sku='')
    {
    	$data = array();
    	    
    	$skuMasking = $this->skuMaskingRepository->findByMaskingSku($sku);
    
    	if (empty($skuMasking)) {
    		$data['error'] = "PAGE_NOT_FOUND";
    	}
    	else {
    		$data = $skuMasking[0];
    	}
    
    	return $data;
    }

    /**
     * @author Employee Id: 5497
     * Description : Save sku data to database
     *
     * @return object
     * */
    public function setSkuMasking()
    {
    	$id = $this->request->get('id');
    	$productId = $this->request->get('product_id');
    	$supplierId = $this->request->get('supplier_id');
    	$sku = $this->request->get('sku');
    	$maskingSku = $this->request->get('masking_sku');
    	$instanceId = $this->projectSetting['instance_id'];
    	$instanceType = $this->projectSetting['instance_type'];
    	
    	if( isset($id) && $id > 0 ){
    		if($maskingSku == ''){
    			$this->removeSkuMasking();
    			$data['msg'] = 'SKU_CLEARED_SUCCESSFULLY';
    			$data['id'] = '';
    			$data['status'] = 'success';
    			return $data;
    		}else{
    			$mode = 'edit';
    			$skuMasking = $this->getSkuMaskingById($id);
    			$data['msg'] = 'SKU_UPDATED_SUCCESSFULLY';
    			$data['status'] = 'success';
    		}
    	
    	}else{
    		if($maskingSku == ''){
    			$data['status'] = 'error';
    			$data['msg'] = 'PLEASE_INSERT_NEW_SKU';
    			$data['id'] = '';
    			return $data;
    		}else{
    			$mode = 'add';
    			$skuMasking = new SkuMasking();
    			$data['msg'] = 'SKU_ADDED_SUCCESSFULLY';
    			$data['status'] = 'success';
    		}
    	}
    	
    	$supplierSkuMasking = $this->skuMaskingRepository->getMaskingSkuBySupplierId($supplierId, $maskingSku);
    	
    	if (count($supplierSkuMasking) > 0 && isset($supplierSkuMasking[0])) {

    		if (($mode == 'edit' && $id != $supplierSkuMasking[0]->getId()) || ($mode == 'add' && $maskingSku == $supplierSkuMasking[0]->getMaskingSku())) {
    			$data['status'] = 'error';
    			$data['msg'] = 'PLEASE_INSERT_UNIQUE_NEW_SKU';
    			$data['id'] = $id;
    			return $data;
    		}
    	}
    	
    	$skuMasking->setProductId($productId);
    	$skuMasking->setSupplierId($supplierId);
    	$skuMasking->setSku($sku);
    	$skuMasking->setMaskingSku($maskingSku);
    	$skuMasking->setInstanceId($instanceId);
    	$skuMasking->setInstanceType($instanceType);
    	
    	
    	$skuMaskingId = $skuMasking->getId();
        $sku = $skuMasking->getSku();
        
        $cnt = $this->skuMaskingRepository->findCountBySku($supplierId, $sku);
                 
        if (($cnt > 0) && $mode!="edit") { // duplicate sku
        	$data['status'] = 'error';
    		$data['msg'] = 'ERROR_CODE_ALREADY_EXISTS';
    		$data['id'] = '';
        }
             
        $skuMasking = $this->skuMaskingRepository->set($skuMasking);
        $skuMaskingId = $skuMasking->getId();
        $data['id'] = $skuMaskingId;
        return $data;
    }
    
    /**
     * @author Employee Id: 5497
     * Description : Save sku data to database
     *
     * @return object
     * */
    public function setSupplierSkuMasking($productChunkData)
    {   
		set_time_limit(0);
    	$supplier_id = $this->request->get('supplier_id','');
    	//$supplierMaskSku = $this->request->get('supplier_mask_sku','');
    	$maskRecords = $this->skuMaskingRepository->getMaskingBySupplierId($supplier_id);
    	foreach($productChunkData as $productChunkDataArray)
    	{
            foreach($productChunkDataArray as $productData)
            { 
    			$productId = $productData['product_master_id'];	
    			$maskCount = $this->skuMaskingRepository->findOneBy(array('supplierId' => $supplier_id,'productId' => $productId));
    			if(count($maskCount)>0)
    			{
    				$skuMasking = $this->getSkuMaskingById($maskCount->getId());
    			}
    			else
    			{
    			$skuMasking = new SkuMasking();
    			}
    			
    			//echo $supplierMaskSku;
    			
    			$supplierId = $supplier_id;
    			$sku = $productData['sku_number'];
    			//$maskingSku = $supplierId."".$supplierMaskSku;
                $maskingSku = $sku."-".$supplierId;
    			$instanceId = $this->projectSetting['instance_id'];
    			$instanceType = $this->projectSetting['instance_type'];
    			$skuMasking->setProductId($productId);
    			$skuMasking->setSupplierId($supplierId);
    			$skuMasking->setSku($sku);
    			$skuMasking->setMaskingSku($maskingSku);
    			$skuMasking->setInstanceId($instanceId);
    			$skuMasking->setInstanceType($instanceType);
    			$skuMasking = $this->skuMaskingRepository->set($skuMasking);
    			//$supplierMaskSku++;
            }   
    	}
    	$skuMaskingId = $skuMasking->getId();
    	$data['id'] = $skuMaskingId;
    	return $data;
    }
    /**
     * @author Employee Id: 5633
     * Description : Save sku data to database
     *
     * @return object
     * */
    public function setSkuMaskingImport($skuMasking, $mode)
    {
    	$skuMaskingId = $skuMasking->getId();
    	$sku = $skuMasking->getSku();
    	$supplierId = $skuMasking->getSupplierId();
    	$maskingSku = $skuMasking->getMaskingSku();
    	$id = $skuMasking->getId();
    	
    	$supplierSkuMasking = $this->skuMaskingRepository->getMaskingSkuBySupplierId($supplierId, $maskingSku);
    	 
    	if (count($supplierSkuMasking) > 0 && isset($supplierSkuMasking[0])) {
    	
    		if (($mode == 'edit' && $id != $supplierSkuMasking[0]->getId()) || ($mode == 'add' && $maskingSku == $supplierSkuMasking[0]->getMaskingSku())) {
    			$data['status'] = 'error';
    			$data['msg'] = 'PLEASE_INSERT_UNIQUE_NEW_SKU';
    			$data['id'] = $id;
    			return $data;
    		}
    	}

    	$cnt = $this->skuMaskingRepository->findCountBySku($supplierId, $sku);

    	if (($cnt > 0) && $mode!="edit") { // duplicate sku
    		$data['status'] = 'error';
    		$data['msg'] = 'ERROR_CODE_ALREADY_EXISTS';
    		$data['id'] = $id;
    		return $data;
    	}

    	$skuMasking = $this->skuMaskingRepository->set($skuMasking);
    	$skuMaskingId = $skuMasking->getId();
    	
    	$data['msg'] = 'SKU_CLEARED_SUCCESSFULLY';
    	$data['id'] = $skuMaskingId;
    	$data['status'] = 'success';
    	return $data;
    
    }
    
    /**
     * @author Employee Id: 5633
     * Description : Upload sku file
     *
     * @return object
     * */
    public function setSkuFileUpload()
    {
    		$uploadImportFilePath = $this->container->getParameter('tmp_image_upload_path');;
    		$allwedImportFileMimeType = $this->container->getParameter('allowed_import_file_mime_type');
    		$translator = $this->get('translator');
    	
    		/*if(!IS_DIR($uploadImportFilePath)){
    		 mkdir($uploadImportFilePath,0777,true);
    		 }*/
    	
    		$importFileName = '';
    		$error = false;
    		$supplierId = $this->request->get('supplier_id','');
    		$skuArray = array();
    		$projectId = $this->projectSetting['project_id'];
    		$instanceId = $this->projectSetting['instance_id'];
    		$instanceType = $this->projectSetting['instance_type'];
    		 
    		if(!empty($_FILES) && $supplierId>0 && $projectId>0){
    			foreach($_FILES as $file)
    			{
    				$extensionArr = explode('.', $file['name']);
    				$extension = $extensionArr[count($extensionArr)-1];
    				//if(!in_array($file['type'],$allwedImportFileMimeType)){
    				if($extension != 'xls'){
    					$error = true;
    					$error_message = $translator->trans('product_import_export.allowed_import_file_type');
    				}
    	
    				if(!$error){
    					$ext = end((explode(".", basename($file['name']))));
    					$importFileName = "import_supplierid_".$supplierId."_countryid_".$country."_cultureid_".$activeCulture."_".time().".".$ext;
    					$uploadImportFile = $uploadImportFilePath.$importFileName;
    					$file_moved = @move_uploaded_file($file['tmp_name'], $uploadImportFile);
    						
    					if($file_moved){
    						$phpExcelObject = $this->get('phpexcel')->createPHPExcelObject($uploadImportFile);
    						foreach ($phpExcelObject->getWorksheetIterator() as $worksheet){
    							$highestRow         = $worksheet->getHighestRow(); // e.g. 10
    							$highestColumn      = $worksheet->getHighestColumn(); // e.g 'F'
    							$highestColumnIndex = ord($highestColumn) - 64;
    							for ($row = 2; $row <= $highestRow; ++ $row) {
    								for ($col = 0; $col < $highestColumnIndex; ++ $col) {
    									$cell = $worksheet->getCellByColumnAndRow($col, $row);
    									$val = $cell->getValue();
    									$skuArray[$row-2][$col] = $val;
    								}
    							}
    						}
    							
    						if(count($skuArray) > 0){
    							foreach($skuArray as $sa){
    								$id = '';
    								$productId = 0;
    								$sku = $sa[0];
    								$maskingSku = $sa[1];
    									
    								$skuMasking = $this->skuMasking->getMaskingBySku($sku);
    								if(is_array($skuMasking) && isset($skuMasking['error'])){ //record not found
    									$mode = 'add';
    									$skuMasking = new SkuMasking();
    	
    									$product = $this->container->get("office_brain_product_detail_manager")->getProductDetailsBySku($sku);
    									if($product){
    										$productId = $product['product_id'];
    										$product_supplier_id = $product['supplier_id'];
    									}
    									$skuMasking->setProductId($productId);
    									$skuMasking->setSupplierId($supplierId);
    									$skuMasking->setSku($sku);
    									$skuMasking->setInstanceId($instanceId);
    									$skuMasking->setInstanceType($instanceType);
    								}else{
    									$mode = 'edit';
    								}
    									
    								$skuMasking->setMaskingSku($maskingSku);
    								
    								$skuMasking = $this->setSkuMaskingImport($skuMasking, $mode);
    								//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($productId,$localization_to_update,$projectId,$env,$instanceId,'update');
    								}
    								//SOLR SYNC CODE END
    							}
    						}
    							
    						if(file_exists($uploadImportFile)){
    							@unlink($uploadImportFile);
    						}
    							
    						$error = false;
    						$success_message = $translator->trans('product_import_export.import_process_done');
    					}else{
    						$error = true;
    						$error_message = $translator->trans('product_import_export.file_upload_error_message');
    					}
    				}
    			}
    		}else{
    			$error = true;
    			$error_message = $translator->trans('product.file_not_found');   //"Please select file" ;
    		}
    	
    		if(!$error){
    			$return = array (
    					'status' => 'success',
    					'success_message'=> $success_message,
    			);
    		} else {
    			$return = array (
    					'status' => 'error',
    					'error_message' => $error_message);
    		}
    	
    		return new JsonResponse($return);
    	
    }


    /**
     * @author Employee Id: 5497
     * Description : Find sku of object
     *
     * @return object
     * */
    public function getSkuMaskingById($id = 0)
    {
    	if ($id == 0) {
    		$id = $this->request->get('id');
    	}

        return $this->skuMaskingRepository->getMaskingById($id);
    }

    /**
     * @author Employee Id: 5497
     * Description : Update sku data to database
     *
     * @return object
     * */
    public function updateSkuMasking($skuMasking)
    {
        //return $this->setSkuMasking($skuMasking, "edit");
    }


    /**
     * @author Employee Id: 5497
     * Description : Soft delete of sku
     *
     * @return object
     * */
    public function deleteSkuMasking()
    {
        $pageObj = $this->skuMaskingRepository->getMaskingById($this->request->get('id'));

        if (is_object($pageObj)) {
            $pageObj->setMaskingSku(null);

            return $this->skuMaskingRepository->set($pageObj);
        }
    }
    
    public function removeSkuMasking()
    {
    	$pageObj = $this->skuMaskingRepository->getMaskingById($this->request->get('id'));
    	return $this->skuMaskingRepository->removeRecord($pageObj);
    }


    public function searchSkuMasking()
    {
        $data = array();
        $option = $this->request->get('option');
        $keyword = $this->request->get('keyword');

        $skuMasking = $this->skuMaskingRepository->findByOption($option, $keyword);

        if (count($skuMasking) > 0) {
            $data['pagination'] = $this->paginatorManager->paginate($skuMasking, $this->request->get('page'), $this->recordsPerPage, array(), count($skuMasking));
        }

        $data['records_per_page'] = $this->recordsPerPage;
        $data['page'] = $this->request->get('page');

        return $data;
    }
    
    /**
     * @author Employee Id: 5497
     * Description : for site-search
     *
     * */
    public function siteSearch($request)
    {
    	$siteSearch['page']  =  $request->query->get('page', 1);
    	$siteSearch['search'] = $request->get('search','');
    	
    	return $siteSearch;
    }
    
    /**
     * @author Employee Id: 5497
     * Description : list of site-search
     *
     * */
    public function getSiteSearchList($request)
    {

    	$siteSearchList = $this->skuMaskingRepository->getSiteSearchList($request->get('search'));
    	
    	$siteSearchListArray['totalCount'] = count($siteSearchList);
    	
    	$siteSearchListArray['pagination'] =  $this->paginatorManager->paginate($siteSearchList, $request->get('page', '1'), $this->recordsPerPage, array(), count($siteSearchList));
    	
    	unset($siteSearchList);
    	
    	return $siteSearchListArray;
    }
    

    /**
     * @author Employee Id: 5497
     * Description : get all sku in key value format
     *
     * @return object
     * */
    public function getSkuMaskingListKeyVal()
    {
    	$data = array();
    
    	$skuMasking = $this->skuMaskingRepository->findAll();
    	foreach ($skuMasking as $key => $val) {
    		$data[$val->getSku()] = $val->getMaskingSku();
    	}
    
    	return $data;
    }
    
    public function getMaskingByProduct($productId,$instance="")
    {
        $response = array();
        $data = $this->skuMaskingRepository->getMaskingByproductId($productId);
        
        if(!empty($instance))
        {
        	$instanceId = $instance;
        }
        else{
        	$instanceId = $this->projectSetting['instance_id'];
        }
        
        if(isset($data) && $data->getId()>0)
        {
            $this->data = $this->entityManager->getRepository('OfficeBrainCustomBundleSubShopBundle:ColorAttributes')->findByMakAndInstance($data->getId(),$instanceId);
            $response['image'] = $this->entityManager->getRepository('OfficeBrainCustomBundleSubShopBundle:ThumbImage')->findByMakAndInstance($data->getId(),$instanceId);
            if(count($this->data) > 0)
            {
                foreach($this->data as $data){
                    $response['color_ids'][] = $data->getAttributeValue();
                    //change by LP
                    $response['color_ids_available'][] = $data->getAttributeValueAvailable(true);
                    if(!empty($data->getFullColorDefaultAttributeValue())){
                        $response['full_color_default_attribute_value'][$data->getAttributeValue()] = $data->getFullColorDefaultAttributeValue();
                    }
                }
            }
        }
        return $response;
    }
    
    public function getAndDeleteColorImageByProduct($productId,$instance="")
    {
    	$response = array();
    	$data = $this->skuMaskingRepository->getMaskingByproductId($productId);
    	
    	if(!empty($instance))
    	{
    		$instanceId = $instance;
    	}
    	else{
    		$instanceId = $this->projectSetting['instance_id'];
    	}
    
    	if(isset($data) && $data->getId()>0)
    	{
    		$maskId = $data->getId();
    		$this->data = $this->entityManager->getRepository('OfficeBrainCustomBundleSubShopBundle:ColorAttributes')->findByMakAndInstance($data->getId(),$instanceId);
    		$response['image'] = $this->entityManager->getRepository('OfficeBrainCustomBundleSubShopBundle:ThumbImage')->findByMakAndInstance($data->getId(),$instanceId);
    
    		if(count($this->data) > 0)
    		{
    			foreach($this->data as $data){
    				$response['color_ids'][] = $data->getAttributeValue();

                    //change by LP
                    $response['color_ids_available'][] = $data->getAttributeValueAvailable(true);
    			}
    		}
    		
    		/*if(isset($response['color_ids']) && count($response['color_ids'])>0)
    		{
    			$this->entityManager->getRepository('OfficeBrainCustomBundleSubShopBundle:ColorAttributes')->deleteColors($maskId,$instanceId);
    		}
    		if(isset($response['image']) && count($response['image'])>0)
    		{
    			$this->entityManager->getRepository('OfficeBrainCustomBundleSubShopBundle:ThumbImage')->deleteImage($maskId,$instanceId);
    		}*/
    	}
    }
    
    /**
     * @author Employee Id: 5412
     * Description : get mapped sku
     *
     * @return object
     * */
    public function getMappedSku($product_id,$sku)
    {
    	$skuMasking = $this->skuMaskingRepository->getMaskingByproductId($product_id);
    	if($skuMasking){
    		return $skuMasking->getMaskingSku();
    	}
    	else{
    		return $sku;
    	}
    	
    }
    public function findBySubshopByStatus($userId=''){
    	$subshop = $this->entityManager->getRepository('OfficeBrainSubShopBundle:SubShop');
    	return $subshop->customfindByStatus($userId);
    }
    
    /**
     * @author Employee Id: 4571
     * Description : get old sku from newly masked sku
     *
     * @return object
     * */
    public function getSkuFromMaskedSku($skuNew,$suppId)
    {
    	//$data = array();
    	$skuOld = 'NOT_FOUND_IN_RESULT';
    
    	$skuOldCount = $this->skuMaskingRepository->findOldSkuCount($skuNew,$suppId); // checking count 
    	
    	if($skuOldCount > 0){
    		$skuOld = $this->skuMaskingRepository->findOldSku($skuNew,$suppId); // return old sku if count > 0 
    	}    	 
    
    	return $skuOld;
    }
    
    /**
     * @author Employee Id: 5668
     * Description : Return only masked SKU from SKU
     *
     * @return object
     * */
    public function getMaskedSkuFromSku($sku,$suppId)
    {
    	$maskedSku = 'NOT_FOUND_IN_RESULT';
    	
    	$skuOldCount = $this->skuMaskingRepository->findCountBySku($suppId,$sku);
    	if($skuOldCount > 0){
    		$maskedSku = $this->skuMaskingRepository->findMaskedSku($sku,$suppId); // return old sku if count > 0
    	}
    	return $maskedSku;
    }
    
}
