<?php

namespace OfficeBrain\Bundle\QuoteBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * QuoteProductRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class QuoteProductRepository extends EntityRepository
{
	protected $projectSetting;
	protected $instanceId;
	protected $instanceType;
	protected $cultureId;
	protected $cultureCode;
	protected $paginatorService;
	protected $projectSettingService;
	protected $userType;
	protected $userId;
	protected $userManager;
	
	public function getPaginatorService()
	{
		return $this->paginatorService;
	}
	
	public function setPaginatorService($paginatorService)
	{
		$this->paginatorService = $paginatorService;
	}
	
	public function setUserManager($userManager)
	{
		$this->userManager = $userManager;
	}
	
	public function setCoreManager($coreManager){
		$this->coreManager = $coreManager;
	}
	
	public function getProjectSetting()
	{
		return $this->paginatorService;
	}
	
	public function setProjectSetting($projectSetting)
	{
		$this->projectSetting = $projectSetting;
		$this->prepareProjectSettingData();
	}
	
	public function setProjectUserData($userData)
	{
		$this->userObj = $userData;
	}
	
	public function prepareProjectSettingData()
	{
		$this->userId = $this->projectSetting['user_id'];
		$this->userType = $this->projectSetting['user_type'];
		$this->createdUid = $this->upatedUid = $this->userId;
		$this->instanceId = $this->projectSetting['instance_id'];
		$this->instanceType = $this->projectSetting['instance_type'];
		$this->cultureId = $this->projectSetting['culture_id'];
		$this->cultureCode = $this->projectSetting['culture_code'];
	}
	
	/**
	 * @author Employee Id: 4248
	 * OB eCommerce Product - Quotelist
	 * Function created for define a common querybuilder object
	 * @param integer $userId
	 * @return number
	 */
	public function getQueryBuilder()
	{
		return $this->getEntityManager()->getRepository('OfficeBrainQuoteBundle:QuoteProduct')->createQueryBuilder('qp');
	}
	
	public function getShippinDetail($contactId){
		$queryBuilder = $this->getEntityManager()->getRepository('OfficeBrainUserBundle:ContactBook')->createQueryBuilder('cb');
		$queryBuilder ->where('cb.id  =:conatct_id ')
		->setParameter('conatct_id', $contactId);
		return $queryBuilder->getQuery()->getOneOrNullResult();
	}
	public function setQuoteProduct($productData, $itemLineObj){		
		$colorId=isset($productData['color_attr_id']) ? $productData['color_attr_id'] : "";
		if(array_key_exists('shipping_method',$productData) && $productData['shipping_method'] != 'null'){			
				
				if($productData['shipping_method']['shipping_type']=="standard"){
					$shipType=0;
				}else{
					$shipType=1;
				}
				foreach($productData['shipping_method']['shipping_detail'] as $product){
					$quoteProduct = new QuoteProduct();
					$quoteProduct->setQuoteItemLineId($itemLineObj);
					$quoteProduct->setQuoteMasterId($itemLineObj->getQuoteMasterId()->getId());
					$quoteProduct->setProductId($itemLineObj->getProductId());
					$quoteProduct->setCultureProductId($productData['culture_product_id']);
					$em = $this->getEntityManager();
					$em->persist($quoteProduct);
					$em->flush();
					// One to One
					if(isset($product['selected_address_id']) && $product['selected_address_id'] != null){
						$this->setQuoteShippingDetail($quoteProduct, $product,$em, $shipType);
					}
					// One to Many
					$this->setQuoteVariationMaster($quoteProduct, $product, $em, $colorId);
				}			
		} else { //SHIPPING DETAIL WILL BE EMPTY IF SHIPPING IS DISABLED
				$quoteProduct = new QuoteProduct();
				$quoteProduct->setQuoteItemLineId($itemLineObj);
				$quoteProduct->setQuoteMasterId($itemLineObj->getQuoteMasterId()->getId());
				$quoteProduct->setProductId($itemLineObj->getProductId());
				$quoteProduct->setCultureProductId($productData['culture_product_id']);
				$em = $this->getEntityManager();
				$em->persist($quoteProduct);
				$em->flush();
				
				$productData['color_quantity'] = $productData['color'];
				// One to Many
				$this->setQuoteVariationMaster($quoteProduct, $productData, $em, $colorId);			
		}
	}

	public function setQuoteShippingDetail($quoteProductObj, $product,$em, $shipType){
		if(($product['shipping_detail']!="null" && $product['shipping_detail']!=null) || (isset($product['selected_address_id']) && $product['selected_address_id'] != null)){
			$userContactBookObj= $this->getShippinDetail($product['selected_address_id']);
			$quoteShippingDetail = new QuoteShippingDetail();
			$quoteShippingDetail->setQuoteProductId($quoteProductObj);
			$quoteShippingDetail->setSelectedAddressId($product['selected_address_id']);
			$quoteShippingDetail->setShippingType(isset($product['shipping_detail']['shipping_carrier']) ? $product['shipping_detail']['shipping_carrier'] : '');
			$quoteShippingDetail->setServiceType(isset($product['shipping_detail']['shipping_method']) ? $product['shipping_detail']['shipping_method'] : '');
			$quoteShippingDetail->setShippingCharge(isset($product['shipping_detail']['shipping_charge']) ? $product['shipping_detail']['shipping_charge'] : '0.00');
			$quoteShippingDetail->setShipType($shipType);
			$quoteShippingDetail->setPickFrom(($product['shipping_from']=="shipping_book")? 0 : 1);
			$quoteShippingDetail->setName($userContactBookObj->getName());
			$quoteShippingDetail->setEmail($userContactBookObj->getEmail());
			$quoteShippingDetail->setStreet1($userContactBookObj->getStreet1());
			$quoteShippingDetail->setStreet2($userContactBookObj->getStreet2());
			$quoteShippingDetail->setCountryId($userContactBookObj->getCountryId());
			$quoteShippingDetail->setCountryName($userContactBookObj->getCountryName());
			$quoteShippingDetail->setStateId($userContactBookObj->getStateId());
			$quoteShippingDetail->setStateName($userContactBookObj->getStateName());
			$quoteShippingDetail->setCityId($userContactBookObj->getCityId());
			$quoteShippingDetail->setCityName($userContactBookObj->getCityName());
			$quoteShippingDetail->setZipCode($userContactBookObj->getZipcode());
			$quoteShippingDetail->setExtension($userContactBookObj->getExtension());
			$quoteShippingDetail->setPhone($userContactBookObj->getPhone());
			$quoteShippingDetail->setMobile($userContactBookObj->getMobile());
			$quoteShippingDetail->setInHandDate($product['ship_handdate']);
			$quoteShippingDetail->setFax($userContactBookObj->getFax());
			$quoteShippingDetail->setWebsite($userContactBookObj->getWebsite());
			$quoteShippingDetail->setCompanyName($userContactBookObj->getCompanyName());
			$quoteShippingDetail->setCompanyNumber($userContactBookObj->getCompanyNumber());
			$em->persist($quoteShippingDetail);
			$em->flush();
		}
	}	
	
	
   /**
	 * 4248
	 * To push all request quote variation master data in database using TCL
	 */	
	public function setQuoteVariationMaster($quoteProductObj, $productData, $em, $colorId){
		if(array_key_exists('color_quantity',$productData)){			
			if(count($productData['color_quantity'])>0){
				foreach($productData['color_quantity'] as $key=>$variationDetail){
                        $colorValueId= explode(':',$key);
        				$quoteVariationMaster = new QuoteVariationMaster();
        				$quoteVariationMaster->setQuoteProductId($quoteProductObj);
        				$quoteVariationMaster->setAttributeId($colorId);
        				$quoteVariationMaster->setAttributeValueId($colorValueId[1]);
                        if (isset($variationDetail['variation_master_erp_id'])) {
                           $quoteVariationMaster->setErpId($variationDetail['variation_master_erp_id']);
                        }
        				$em->persist($quoteVariationMaster);
        				$em->flush();
                        $quoteProductObj->addQuoteVariationMaster($quoteVariationMaster);
        				// One to One
        				$this->setQuoteVariationMapping($quoteVariationMaster, $variationDetail, $em);
				}
			}
		}
	}
	
	public function setQuoteVariationMapping($quoteVariationMaster, $variationDetail, $em)
	{
		$quoteVariationMapping = new QuoteVariationMapping();
		$quoteVariationMapping->setVariationMasterId($quoteVariationMaster);
		$em->persist($quoteVariationMapping);
		$em->flush();
        $quoteVariationMaster->setQuoteVariationMapping($quoteVariationMapping);
		// One to Many
		$this->setQuoteVariationDetail($quoteVariationMapping, $variationDetail, $em);
		$this->setQuoteVariationQuantity($quoteVariationMapping, $variationDetail, $em);
		
	}
	
	public function setQuoteVariationDetail($quoteVariationMapping, $variationDetail, $em){
		if(array_key_exists('size',$variationDetail)){
			if(count($variationDetail['size'])>0){
				foreach($variationDetail['size'] as $key=>$rqvda){
				$quoteVariationDetail = new QuoteVariationDetail();
				$quoteVariationDetail->setVariationMappingId($quoteVariationMapping);
				$quoteVariationDetail->setAttributeId(11);
				$quoteVariationDetail->setAttributeValueId($rqvda);
                if (array_key_exists('erp_id', $variationDetail)) {
               		$quoteVariationDetail->setErpId($variationDetail['erp_id'][$key]);
                }
				$em->persist($quoteVariationDetail);
				$em->flush();
                $quoteVariationMapping->addQuoteVariationDetail($quoteVariationDetail);
				}
			}
		}
	}
	
	public function setQuoteVariationQuantity($quoteVariationMapping, $variationDetail, $em){
        if(array_key_exists('quantity',$variationDetail)){
            if(count($variationDetail['quantity'])>0){
                $i = 0;
                foreach($variationDetail['quantity'] as $rqvda){
                    $quoteVariationQuantity = new QuoteVariationQuantity();
                    $quoteVariationQuantity->setVariationMappingId($quoteVariationMapping);
                    $quoteVariationQuantity->setProductQuantity($rqvda);
                    if(array_key_exists('price', $variationDetail)){
                        $quoteVariationQuantity->setUnitPrice($variationDetail['price'][$i]);
                    } else {
                        $quoteVariationQuantity->setUnitPrice(0);
                    }
                    $em->persist($quoteVariationQuantity);
                    $em->flush();
                    $quoteVariationMapping->addQuoteVariationQuantity($quoteVariationQuantity);
                    $i++;
                }
            }
        }
    }
	
	
	/*  To Remove this method after testing.
	 *  public function getQuoteProductByIdVal($productData)
	{	
		$queryBuilder = $this->getQueryBuilder();
		$queryBuilder ->where('qp.quoteItemLineId  =:quote_item_line_id AND qp.productId = :product_id ')
		->setParameter('quote_item_line_id', $productData['item_line_id'])
		->setParameter('product_id', $productData['product_id']);
		return $queryBuilder->getQuery()->getOneOrNullResult();
	} */
	
	public function removeQuoteProduct($quoteProduct)
	{
		if(count($quoteProduct)>0){
			foreach($quoteProduct as $obj){
				$this->_em->remove($obj);
			}
			$this->_em->flush();
			return 'SUCCESS';
		}
	}
	
}
