<?php
namespace OfficeBrain\Bundle\RequestQuoteBundle\Manager\Extended;

use OfficeBrain\Bundle\RequestQuoteBundle\Manager\AbstractManager\RequestQuoteAbstract;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class RequestQuoteRegisteredExtended extends RequestQuoteAbstract
{

	public function __construct($entityManager, $request, $twigManager, $sessionManager,$productDetailManager, $userManager, $emailManager, $userContactBookManager, $coreManager,$paginatorManager,$commonLibraryManager,$cmsMediaLib,$productApi, $serviceRuleApi)
    {
        parent::__construct($entityManager, $request, $twigManager, $sessionManager,$productDetailManager, $userManager, $emailManager, $userContactBookManager, $coreManager,$paginatorManager,$commonLibraryManager,$cmsMediaLib,$productApi, $serviceRuleApi);
    }

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



	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get the request quote list in front My Account
	 */
	public function getRequestQuoteList($page,$recordsPerPage)
	{
		return $this->requestQuoteMasterRepositoryManager->getRequestQuoteList($this->userId,$page,$recordsPerPage);
	}

	/**
	 * @author Employee Id: 4217
	 * OB eCommerce Product - RequestQuote
	 * To get single record by id from Request Quote
	 * @param null
	 * return array object data of request quote
	 */
	public function getRequestQuoteDetailById($requestQuoteId=0)
	{
		if($requestQuoteId!=0){
			$quoteId=$requestQuoteId;
		}else{
			$quoteId=$this->request->get('request_quote_id');
		}
		return $this->requestQuoteMasterRepositoryManager->getRequestQuoteDetailById($quoteId);
	}

	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get the request quote Comments
	 */
	public function getCommentRequestQuoteList()
	{
		return $this->requestQuoteCommentRepositoryManager->getCommentRequestQuoteDetailById($this->requestQuoteId);
	}
	
	public function getInquiryDetailById($id)
	{
		return $this->requestQuoteMasterRepositoryManager->getRequestQuoteDetailById($id);
	}
	
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To set the request quote Comments
	 */
	public function setCommentRequestQuote($data)
	{
		return $this->requestQuoteCommentRepositoryManager->setRequestQuoteComment($data, $this->projectSetting);
	}


	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get All the shipping Address from ContactBook of user
	 */
	public function getUserShippingAddressFromContactBook($searchIn=array(), $isAllField= true)
	{
		$userId = $this->projectSetting['user_id'];
		return $this->userContactBookManager->getAllContactBook($userId, $this->shippingAddressType, $searchIn, $isAllField);
	}

	public function getUserShippingAddresByEmail($userId)
	{	
	$email = $this->request->get('email');
	$Address = $this->userContactBookManager->getContactBookByEmailSingle($email,$userId);	
	return $Address;
	}

	public function getUserBillingAddresByUserId($userId)
	{	
	$Address = $this->userContactBookManager->getUserBillingAddresByUserId($userId);	
	return $Address;
	}


	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get Address From ContactBook/AddressBook with searching term
	 */
	public function getUserShippingAddresByEmailOrName()
	{
		$shippingFrom = $this->request->get('shipping_from');
		$term = $this->request->get('term');
		$searchIn = array('email'=>$term,'name'=>$term);

		if($shippingFrom == 'shipping_book'){
			$Address = $this->getUserShippingAddressFromShippingBook($searchIn,false);
		}else if($shippingFrom == 'contact_book'){
			$Address = $this->getUserShippingAddressFromContactBook($searchIn,false);
		}
		return $Address;
	}



	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get
	 */
	public function getBlankColorQuantityValue($productAttributes)
	{
		$productAttributes['config']['shipping_type'] = $this->request->get('shipping_type');
    	$colorId = $productAttributes['attribute_value_id'];
    	$qty = array();
    	if($productAttributes['config']['allow_size'] && isset($productAttributes['attributes'][$productAttributes['config']['size_attribute_id']])){
    		foreach ( $productAttributes['attributes'][$productAttributes['config']['size_attribute_id']]['values'] as $sizeId=>$size){
    			$qty['quantity'][] = 0;
    			$qty['size'][] = $sizeId;
    		}
    	}else{
    		$qty['quantity'][] = 0;
    	}

    	return array('config'=>$productAttributes['config'],'Qty'=> $qty, 'colorId' => $colorId,'product_attributes'=>$productAttributes['attributes']);

	}
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get Address From ContactBook/AddressBook By Id
	 */
	public function getUserShippingAddresById()
	{
		$contactBookId = $this->request->get('contact_id',null);
		$counter = $this->request->get('counter',0);
		$Address = null; $otherData = null;
		if($contactBookId != null && $contactBookId > 0){
			$Address = $this->userContactBookManager->getSingleContactBook($contactBookId);

			$otherData['cityName'] = $this->coreManager->getCityName($Address->getCityId());
			$otherData['stateName'] = $this->coreManager->getStateName($Address->getStateId());
			$otherData['countryName'] = $this->coreManager->getCountryName($Address->getCountryId());
			$otherData['counter'] = $counter;
		}

		return array('address_data'=>$Address,'other_data'=>$otherData);
	}

	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To get All the shipping Address from Address Book of user
	 */
	public function getUserShippingAddressFromShippingBook($searchIn=array(), $isAllField = true)
	{
		$userId = $this->projectSetting['user_id'];
		return $this->userContactBookManager->getAllAddressBook($userId, $this->shippingAddressType, $searchIn, $isAllField);
	}
	
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - AddToRequestQuote
	 * To set the request quote product into the preAddtoRequestQuote table
	 * Mobile API
	 */
	
	public function setPreAddToRequesQuote()
	{
		$productId = $this->request->get('product_id',null);
		$productSlug = $this->request->get('product_slug',null);
		$cultureProductId = $this->request->get('culture_product_id',null);
		$productData = $this->request->request->all();
		
		if($productId == null || $productSlug == null || $cultureProductId == null )return 'NO_PRODUCT_FOUND';
		
		$this->totalProduct = $this->getTotalRequestQuoteCount();
	
		if ($this->totalProduct >= $this->requestQuoteProductMaxLimit) {
			return 'ERROR_MAX_LIMIT_REACHED';
		}
		
		$isRQExists = $this->preRequestQuoteRepositoryManager->isRequestQuoteExists($productId, $cultureProductId);
		if ($isRQExists && $this->byPass == 0){
			
			return 'ERROR_PRODUCT_ALREADY_EXISTS';
		}else{			
			
			if ($this->byPass == 1){
				$this->deleteAllRequestQuote();
			}
			
			$productDetailConfiguration = serialize($productData);
			$this->preRequestQuoteRepositoryManager->addToRequestQuote($productId, $cultureProductId, $productSlug, $productDetailConfiguration);			
		}
		return 'SUCCESS';
	}
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * Mobile API
	 */
	public function getPreRequestQuote()
	{
		return $this->preRequestQuoteRepositoryManager->getRequestQuote();
	}
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * Mobile API
	 */
	public function getPreRequestQuoteList()
	{
		$requestQuote = $productIds = null;
		$preRequestQuoteData = $this->getPreRequestQuote();
		
		foreach ($preRequestQuoteData as $preRequestQuote){
			$thisPreRequestQuote = unserialize($preRequestQuote['productDetailConfiguration']);
			$requestQuote[$preRequestQuote['productId']] = $thisPreRequestQuote;
			$productIds[] = $preRequestQuote['productId'];
		}
		
		if(!$requestQuote || count($requestQuote)<=0) return null;
		
		$apiProductArray = $this->getPreRequestQuoteProductDetail($productIds);
		return $this->prepareQuoteList($requestQuote, $apiProductArray);
	}
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * Mobile API
	 */
	public function getPreRequestQuoteProductDetail($productIds)
	{		
		return $this->getProductDetailByIds(json_encode($productIds), $this->cultureCode);		
	}
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * Mobile API
	 */
	public function getTotalRequestQuoteCount()
	{
		$this->totalProduct = $this->preRequestQuoteRepositoryManager->getTotalCountUserWise();
		return $this->totalProduct;
	}
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * Mobile API
	 */
	public function deleteAllRequestQuote()
	{
		$isDeleted = $this->preRequestQuoteRepositoryManager->deleteAllRequestQuote();
		if ($isDeleted) {
			$this->totalProduct = null;
			return 'SUCCESS';
		}
		return 'ERROR_NOT_FOUND';
	}
	
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * Mobile API
	 */
	public function deletePreRequestQuote()
	{
		$productId = $this->request->get('product_id', null);
		$cultureProductId = $this->request->get('culture_product_id', null);
		$isDeleted = $this->preRequestQuoteRepositoryManager->deleteRequestQuote($productId, $cultureProductId);
		if ($isDeleted) {
			return 'SUCCESS';
		}
		return 'ERROR_NOT_FOUND';
	}
	
	/**
	 * @author Employee Id: 410175
	 * OB eCommerce Product - RequestQuote
	 * To add all the product into request quote related table : Mobile API
	 */
	public function addRequestQuoteToDB()
	{
		$status = array();
		$saveData = array();

		$billingDetail 	= 	$this->userContactBookManager->getAllAddressBook( $this->userId, 1 );
		if ( count( $billingDetail ) <=  0 ) {
			$result['status'] = 'error';
			$result['error'] = 'billing_address_missing';
			return $result;
		}
		
		$saveData['request_quote']['user_id']		= $this->userId;
		$saveData['request_quote']['user_type']		= $this->projectSetting['user_type'];
		$saveData['request_quote']['created_uid']	= $this->userId;
		$saveData['request_quote']['instance_type']	= $this->projectSetting['instance_type'];		
		$saveData['request_quote']['instance_id']	= $this->projectSetting['instance_id'];
		$saveData['request_quote']['guest_id']		= 0;
		$saveData['request_quote']['note'] = NULL;
		$saveData['request_quote']['culture'] = $this->projectSetting['culture_code'];
		$saveData['request_quote']['preffered_state'] = NULL;
		$saveData['request_quote']['preffered_distributor_id'] = NULL;
		$saveData['request_quote']['zip_code'] = NULL;
		$saveData['request_quote']['on_hand_date'] = '2015-08-31 13:22:13';//#TODO : this is fixed date, we need to change it
		$saveData['request_quote']['coupon_id'] = '0';
		$saveData['request_quote']['is_mail_sent'] = '0';
		$saveData['request_quote']['secret_key'] = NULL;
		$saveData['request_quote']['quote_id'] = '0';
	
		$count = 0;
		$requestQuoteProducts = $this->getPreRequestQuote();
		
		foreach ($requestQuoteProducts as $products){
			
			if($products['productDetailConfiguration'] == '' || $products['productDetailConfiguration'] == null)continue;
			
			$productId = $products['productId'];
			$requestQuoteDetail = unserialize($products['productDetailConfiguration']);
			$productDetail  = $this->getProductDetailById($productId, $this->projectSetting['culture_code']);
			
			if(!$productDetail)continue;
			
			$unitPrice = $this->getUnitPriceOfProduct($requestQuoteDetail,$productDetail['pricing']);
			$attributeIdArray = $this->getattributeIdRequestQuote($requestQuoteDetail,$productDetail);
	
			// To set Item line product array
			$saveData['request_quote_item_line'][$count]['product_id']			=	$productDetail['product_id'];
			$saveData['request_quote_item_line'][$count]['culture_product_id']	=	$productDetail['culture_product_id'];
			$saveData['request_quote_item_line'][$count]['supplier_id']			=	$productDetail['supplier']['supplier_id'];
			$saveData['request_quote_item_line'][$count]['catalog_year']		=	$productDetail['basic_information']['catalog_year'];
			$saveData['request_quote_item_line'][$count]['currency_id']			=	$productDetail['currency']['id'];
			$saveData['request_quote_item_line'][$count]['currency_name']		=	$productDetail['currency']['name'];
			$saveData['request_quote_item_line'][$count]['currency']			=	$productDetail['currency']['currency'];
			$saveData['request_quote_item_line'][$count]['currency_symbol']		=	$productDetail['currency']['symbol'];
			$saveData['request_quote_item_line'][$count]['product_name']		=	$productDetail['basic_information']['title'];
			$saveData['request_quote_item_line'][$count]['product_sku']			=	$productDetail['basic_information']['sku_number'];
			$saveData['request_quote_item_line'][$count]['product_slug']		=	$productDetail['basic_information']['slug'];
			$saveData['request_quote_item_line'][$count]['product_thumb_image']	=	$productDetail['basic_information']['default_image_url'];
			$saveData['request_quote_item_line'][$count]['product_image']		=	$productDetail['basic_information']['default_image_url'];
			$saveData['request_quote_item_line'][$count]['product_note']		=	$requestQuoteDetail['special_instruction'];	
			$saveData['request_quote_item_line'][$count]['line_id']				=	$productDetail['brand']['id'];
			$saveData['request_quote_item_line'][$count]['line_name']			=	$productDetail['brand']['name'];
			$saveData['request_quote_item_line'][$count]['is_send_review_link']	=	'';
			$saveData['request_quote_item_line'][$count]['is_feedback_posted']	=	'0';
			$saveData['request_quote_item_line'][$count]['isComplete']			=	'1';
			$saveData['request_quote_item_line'][$count]['order_type']			=	'';
			$saveData['request_quote_item_line'][$count]['price_unit']			=	$productDetail['price_unit'];
	
			// To set the item line supplier data array
			$saveData['request_quote_item_line'][$count]['supplier']['supplier_id']=$productDetail['supplier']['supplier_id'];
			$saveData['request_quote_item_line'][$count]['supplier']['supplier_name']=$productDetail['supplier']['name'];
			$saveData['request_quote_item_line'][$count]['supplier']['code']=(isset($productDetail['supplier']['code'])  && $productDetail['supplier']['code']!='') ? $productDetail['supplier']['code']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['email_address']=(isset($productDetail['supplier']['email_address'])  && $productDetail['supplier']['email_address']!='') ? $productDetail['supplier']['email_address']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['website']=(isset($productDetail['supplier']['website'])  && $productDetail['supplier']['website']!='') ? $productDetail['supplier']['website']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['image']=(isset($productDetail['supplier']['image'])  && $productDetail['supplier']['image']!='') ? $productDetail['supplier']['image']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['fax']=(isset($productDetail['supplier']['contact_information']['fax'])  && $productDetail['supplier']['contact_information']['fax']!='') ? $productDetail['supplier']['contact_information']['fax']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['mobile']=(isset($productDetail['supplier']['contact_information']['mobile'])  && $productDetail['supplier']['contact_information']['mobile']!='') ? $productDetail['supplier']['contact_information']['mobile']: NULL;
			$saveData['request_quote_item_line'][$count]['supplier']['telephone']=(isset($productDetail['supplier']['contact_information']['telephone'])  && $productDetail['supplier']['contact_information']['telephone']!='') ? $productDetail['supplier']['contact_information']['telephone']: NULL;
				
			// To set the charges applies on this
			$saveData['request_quote_item_line'][$count]['charges']=$this->getAllAppliedCharges($requestQuoteDetail,$productDetail);
	
			// To set the imprint area and artwork and text and selected color applies on this
			$saveData['request_quote_item_line'][$count]['imprint_area']=$this->prepareImprintArray($requestQuoteDetail);
	
			// To set the all split item line product at variation wise and shipping detail of each line.
			$saveData['request_quote_item_line'][$count]['product']=$this->prepareProductArray($requestQuoteDetail,$unitPrice,$attributeIdArray);
	
			// To set Billing information
			$saveData['request_quote_billing_detail']['contactbook_id']         =   $billingDetail[0]['id'];
			$saveData['request_quote_billing_detail']['name']					=	$billingDetail[0]['name'];
			$saveData['request_quote_billing_detail']['email']					=	$billingDetail[0]['email'];
			$saveData['request_quote_billing_detail']['street1']				=	$billingDetail[0]['street1'];
			$saveData['request_quote_billing_detail']['street2']				=	$billingDetail[0]['street2'];
			$saveData['request_quote_billing_detail']['country_id']				=	$billingDetail[0]['countryId'];
			$saveData['request_quote_billing_detail']['country_name']			=	$billingDetail[0]['countryName'];
			$saveData['request_quote_billing_detail']['state_id']				=	$billingDetail[0]['stateId'];
			$saveData['request_quote_billing_detail']['state_name']				=	$billingDetail[0]['stateName'];
			$saveData['request_quote_billing_detail']['city_id']				=	$billingDetail[0]['cityId'];
			$saveData['request_quote_billing_detail']['city_name']				=	$billingDetail[0]['cityName'];
			$saveData['request_quote_billing_detail']['zip_code']				=	$billingDetail[0]['zipcode'];
			$saveData['request_quote_billing_detail']['extension']				=	$billingDetail[0]['extension'];
			$saveData['request_quote_billing_detail']['phone']					=	$billingDetail[0]['phone'];
			$saveData['request_quote_billing_detail']['fax']					=	$billingDetail[0]['fax'];
			$saveData['request_quote_billing_detail']['website']				=	$billingDetail[0]['website'];
			$saveData['request_quote_billing_detail']['company_name']			=	$billingDetail[0]['companyName'];
			$saveData['request_quote_billing_detail']['company_number']			=	$billingDetail[0]['companyNumber'];
			
			$count++;
			
			$status = $this->entityManager->getRepository('OfficeBrainRequestQuoteBundle:RequestQuoteMaster')->setRequestQuoteSingleRecord($saveData, $this->projectSetting['user_id']);
			$requestQuoteObj = $status['data'];
			$this->sendMailForRequestQuote($requestQuoteObj);
		}
		return $status;
	}
	
	private function checkInArray($item , $array){
	    return preg_match('/'.$item.'/i' , json_encode($array));
	}
	
	public function checkForAttribute($colorAttr){
		$attrIds = $this->productDetailManager->getAttributeIds();
		$data = array();
		if($this->checkInArray($attrIds["trim_color_id"], $colorAttr)){
			$data['is_trim_color'] = 1; 
			$data['trim_color_id'] = $attrIds["trim_color_id"];
		}else{
			$data['is_trim_color'] = 0; 
			$data['trim_color_id'] = $attrIds["trim_color_id"];
		}
			
		if($this->checkInArray($attrIds["ink_color_id"], $colorAttr)){
			$data['is_ink_color'] = 1; 
			$data['ink_color_id'] = $attrIds["ink_color_id"];
			
		}else{
			$data['is_ink_color'] = 0; 
			$data['ink_color_id'] = $attrIds["ink_color_id"];
		}
			
		if($this->checkInArray($attrIds["barrel_color_id"], $colorAttr)){
			$data['is_barrel_color'] = 1; 
			$data['barrel_color_id'] = $attrIds["barrel_color_id"];
		}else{
			$data['is_barrel_color'] = 0; 
			$data['barrel_color_id'] = $attrIds["barrel_color_id"];
		}
		if($this->checkInArray($attrIds["std_color_id"], $colorAttr)){
			$data['is_standard_color'] = 1; 
			$data['std_color_id'] = $attrIds["std_color_id"];
		}else{
			$data['is_standard_color'] = 0; 
			$data['std_color_id'] = $attrIds["std_color_id"];
		}
		$data['color_attr_id'] = $attrIds['color_attr_id'];
		//$data['std_color_id'] = $attrIds['std_color_id'];
		return $data;
	}
	
	public function mergeAttributeArray($colrInfo,$attribute){
    	$result = array();
		$fullColorArray = array();
		$inkColorArray = array();
		$trimColorArray = array();
		$barrelColorArray = array();
		
		foreach($attribute as $key=>$val){
			if($val['id'] == $colrInfo['trim_color_id']){
				$trimColorArray = $val['values'];
			}
			if($val['id'] == $colrInfo['ink_color_id']){
				$inkColorArray = $val['values'];
			}
			if($val['id'] == $colrInfo['barrel_color_id']){
				$barrelColorArray = $val['values'];
			}
			if($val['id'] == 10){
				$fullColorArray = $val['values'];
			}
		}
		foreach ($fullColorArray as $k=>$v){
			$v2 = preg_quote($v, '/');
			if(preg_grep( "/^".$v2."$/i" , $trimColorArray )) {	
				$result['trim_color_val'][$k] = $v;  
			}
			if(preg_grep( "/^".$v2."$/i" , $inkColorArray )) {
				$result['ink_color_val'][$k] = $v;  
			}
			if(preg_grep( "/^".$v2."$/i" , $barrelColorArray )) {	
				$result['barrel_color_val'][$k] = $v;  
			}
		}
		
		return $result;
		
    }
	
	
}