<?php
namespace OfficeBrain\Bundle\RequestInfoBundle\Manager\AbstractManager;

abstract class RequestInfoAbstract
{
	protected $entityManager;
	protected $request;
	protected $twigManager;
	protected $sessionManager;
	protected $productDetailManager;
	protected $paginatorManager;
	protected $userManager;
	protected $projectSetting;
	protected $emailManager;
	protected $configurationRule;
	protected $inlineViewProductMaxLimit;
	
    /**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * Initialize the required variable on class load
	*/
	public function __construct($entityManager, $request, $twigManager, $sessionManager, $productDetailManager, $userDetailManager, $emailManager, $paginatorManager)
	{
		$this->entityManager = $entityManager;
		$this->request = $request;
		$this->twigManager = $twigManager;
		$this->sessionManager = $sessionManager;
		$this->productDetailManager = $productDetailManager;
		$this->paginatorManager = $paginatorManager;
		$this->userManager = $userDetailManager;
		$this->emailManager = $emailManager;
		
		$this->projectSetting = $this->request->get('project_setting');
		$this->userId = $this->projectSetting['user_id'];
		$this->configurationRule = $this->projectSetting['configuration_rule']['transaction']['request_info'];
		$this->continueProdDetailUrlSessionKey = 'request-info-continue-url-'.$this->projectSetting['culture_code'];
		$this->requestInfoSetting = $this->projectSetting['configuration_rule']['transaction']['request_info'];
		$this->inlineViewProductMaxLimit = $this->configurationRule['list_admin']['option']['no_of_product'];
		
		$this->requestInfoRepositoryManager = $this->entityManager->getRepository('OfficeBrainRequestInfoBundle:RequestInfo');
		$this->requestInfoRepositoryManager->setProjectSetting( $this->projectSetting );
		$this->requestInfoRepositoryManager->setPaginatorService($this->paginatorManager);
		
	}
	
	public function __destruct()
	{
		unset($this->entityManager);
		unset($this->request);
		unset($this->sessionManager);
		unset($this->productDetailManager);
		unset($this->twig);
		unset($this->paginatorManager);
		unset($this->projectSetting);
		unset($this->configurationRule);
		unset($this->inlineViewProductMaxLimit);
		unset($this->requestInfoRepositoryManager);
		unset($this->emailManager);
		unset($this->userManager);
	}
	
	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * To get the product detail By slug
	 * @param srting productSlug 
	 * @param srting culture
	 * return productDetailManager array
	 */
	public function getProductDetailBySlug($productSlug,$culture)
	{
		return $this->productDetailManager->getProductDetailBySlug($productSlug,$culture);
	}
	
	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * To get the product detail By Id
	 * @param integer productId
	 * @param srting culture
	 * return productDetailManager array
	 */
	public function getProductDetailById($productId,$culture)
	{
		return $this->productDetailManager->getProductDetailById($productId, $culture);
	}
	
	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * This abstract method force to add this method in their extended class
	 */
	public abstract function setRequestInfo($data);
	
	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * This abstract method force to add this method in their extended class
	 */
	public abstract function setGuestInfo($data);
	
	
	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * To get the request info list in admin panel
	 */
	public function getRequestInfoAdminList($page, $recordsPerPage)
	{
		return $this->requestInfoRepositoryManager->getRequestInfoAdminList($page, $recordsPerPage);
	}
	
	/**
	 * @author Employee Id: 4203
	 * OB eCommerce Product - Requestinfo
	 * To get the all request info list in admin panel
	 */
	public function getTotalCountUserWiseAdmin()
	{
	    $adminUser = $this->userManager->findIsAdmin();
        $flag = 'user';
        if ($adminUser) {
            $flag = 'admin';
        }
		return $this->requestInfoRepositoryManager->getTotalCountUserWise($flag);
	}
	
	public function getUserDetail($userId, $userType)
	{ 
		if ($userType == "guest") {
			return $this->requestInfoRepositoryManager->getGuestUser($userId);
		} else {
			
			return $this->userManager->getUserById($userId);
		}
	}

	public function deleteRequestInfoDetailById($requestInfoId="")
	{
		if ($requestInfoId > 0) {
			$infoId = $requestInfoId;
		} else {
			$infoId = $this->request->get('request_info_id');
		}
		$isDeleted['data'] = $this->requestInfoRepositoryManager->deleteRequestInfo($infoId);
		if ($isDeleted) {
			$isDeleted['status'] = "SUCCESS";
			return $isDeleted;
		}
		$isDeleted['status']= 'ERROR_NOT_FOUND';
		return $isDeleted;
	}
	
	public function updateRequestInfo($requestInfoObject)
	{
		$requestInfoObject->setUpatedUid($this->userId);
        $this->requestInfo = $this->requestInfoRepositoryManager->editRequestInfo($requestInfoObject);
        if ($this->requestInfo) {
            return array('status'=>'SUCCESS','data'=>$this->requestInfo);
        }
        return array('status'=>'FAIL');
	}
	
	public function sendRequestInfoEmail($data)
	{ 
		$userType = 'guest';
		if ($data->getUserId() > 0) {
			$userId = $data->getUserId();
			$userType = 'user';
		} else { 
			$userId = $data->getGuestId();
		}
		
		$userObj = $this->getUserDetail($userId, $userType);
		$productId =  $data->getProductInfoRequest()[0]->getProductId();
		$variationPricingString =  $data->getProductInfoRequest()[0]->getVariationPricing();
		if($variationPricingString != ''){
			$variationPricingArray = unserialize($variationPricingString);
		}
		else{
			$variationPricingArray = array();
		}
		$productDetail = $this->getProductDetailById($productId, $this->request->getLocale());
		//$toEmail = $userObj->getEmail();dump($variationPricingArray);exit;
		$requestInfoDetailHTML = $this->twigManager->render ( 'OfficeBrainRequestInfoBundle:RequestInfo:emailRequestInfo.html.twig', array('data' => $data,'variationPricing' => $variationPricingArray,'userData' =>$userObj,'item'=>$productDetail[$productId]));
		//print_r($requestInfoDetailHTML);exit;
		$templateParams = array('send_request_info_mail_template' => $requestInfoDetailHTML);
		$eventKey = 'request_info';
		return $message = $this->emailManager->sendMail($eventKey, $toEmail, $templateParams);//, $culture=null, $fromEmail);
	}
	
	public function getContinueProdDetailURL()
	{
		if ($this->sessionManager->has($this->continueProdDetailUrlSessionKey)) {
			$redirectUrl = $this->sessionManager->get($this->continueProdDetailUrlSessionKey);
			$this->sessionManager->remove($this->continueProdDetailUrlSessionKey);
			return $redirectUrl;
		} else {
			return $this->requestInfoSetting['default_countinue_url'];
		}
	}
	
	public function setContinueProdDetailURL($refererUrlRouteName, $refererUrl)
	{
		if ($refererUrl != '' && $refererUrlRouteName != 'office_brain_requestinfobundle_requestinfo_thankupage') {
			$this->sessionManager->set($this->continueProdDetailUrlSessionKey, $refererUrl);
		} else {
			$this->sessionManager->remove($this->continueProdDetailUrlSessionKey);
		}
	}
	
	public function getProductPricingArray($price_type, $pricingArray)
	{
		if($price_type=="regular") {
			if((array_key_exists("decorative",$pricingArray))){
				$usedKey = 'decorative';
			}else{
				$usedKey = 'blank';
			}
			$productPricingArray= $pricingArray[$usedKey];
		}elseif($price_type=="call_for_price"){
			if(isset($pricingArray['decorative'])){
				$productPricingArray = $pricingArray['decorative'];
			}elseif(isset($pricingArray['blank'])){
				$productPricingArray = $pricingArray['blank'];
			}
		} else{
			$productPricingArray= $pricingArray['price'];
		}
		return $productPricingArray;	
	}
}
