<?php

namespace OfficeBrain\Bundle\RequestInfoBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * RequestInfoRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class RequestInfoRepository extends EntityRepository
{
	
	protected $projectSetting;
	protected $paginatorService;
	protected $projectSettingService;
	
	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 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'];
	}
	/**
	 * To get the request object
	 */
	public function getRequestObj(){
		return $this->request;
	}
	
	/**
	 * To set the request object
	 */
	public function setRequestObj($request){
		$this->request=$request;
	}
	
	/*
	 * 
	 */
	public function getQueryBuilder()
	{
		return $this->getEntityManager()->getRepository('OfficeBrainRequestInfoBundle:RequestInfo')->createQueryBuilder('r');
	}
	
	
	/**
	 * To push all request info data in database using TCL
	 */
	public function setRequestInfoSingleRecord($saveData,$user)
	{
		$em=$this->getEntityManager();
		if($user==0){
		$guest= new GuestUser();
		$guest->setFirstName($saveData['form_data']['first_name']);
		$guest->setEmail($saveData['form_data']['email']);
		$guest->setPhone($saveData['form_data']['phone']);
		$guest->setZipcode($saveData['form_data']['zipcode']);
		$guest->setCompanyName($saveData['form_data']['companyName']);
		$guest->setInstanceId($saveData['form_data']['instance_id']);
		$guest->setInstanceType($saveData['form_data']['instance_type']);
		$guest->setCreatedUid(0);
		}
		 $em->getConnection()->beginTransaction();
		try {
			if($user==0){
				$em->persist($guest);
				$em->flush();
				$guestId=$guest->getId();
				$saveData['request_info']['guest_id']=$guestId;
				$requestInfo=$this->addRequestInfo($saveData['request_info'],$em);
			}else{
				$guestId=0;
				$userId=$user;
				$requestInfo=$this->addRequestInfo($saveData['request_info'],$em);
			}
			
			$productId=$this->addProductRequestInfo($saveData['product_info'],$requestInfo,$em);
			$this->addProductRequestInfoSupplier($saveData['supplier_info'],$productId,$em);
			$this->addProductRequestInfoQuantity($saveData['product_pricing'],$productId,$em);
			$this->addProductRequestInfoAttributes($saveData['product_attribute'],$productId,$em);
			$requestInfo->addProductInfoRequest($productId);
			$em->getConnection()->commit();
		} catch (\Exception $e) {
			$em->getConnection()->rollback();
			$em->close();
			throw $e;
		} 
		return array("status"=>"ADD_RECORD_SUCCESSFULLY","data"=>$requestInfo);
	}
	
	/**
	 * To save data in database and return object of request info
	 */
	public function addRequestInfo($saveData,$em){
		$requestInfo= new RequestInfo();
		$requestInfo->setGuestId($saveData['guest_id']);
		$requestInfo->setUserId($saveData['user_id']);
		$requestInfo->setNote($saveData['note']);
        $requestInfo->setErpId($saveData['erp_id']);
		$requestInfo->setCreatedUid($saveData['created_uid']);
		$requestInfo->setUpatedUid($saveData['created_uid']);
		$requestInfo->setInstanceId($saveData['instance_id']);
		$requestInfo->setInstanceType($saveData['instance_type']);
		$requestInfo->setState($saveData['state']);
        $requestInfo->setCulture($saveData['culture']);
		$requestInfo->setDistributor($saveData['distributor']);
		$em->persist($requestInfo);
		$em->flush();
		return $requestInfo;//=$requestInfo->getId();
	}
	
	/**
	 * To save data in database and return object of product request info
	 */
	public function addProductRequestInfo($saveData,$requestInfo,$em){
		$productInfo= new ProductRequestInfo();
		$productInfo->setRequestId($requestInfo);
		$productInfo->setProductId($saveData['product_id']);
		$productInfo->setProductSlug($saveData['product_slug']);
		
		$productInfo->setCultureProductId($saveData['culture_product_id']);
		$productInfo->setLineId($saveData['line_id']);
		$productInfo->setLineName($saveData['line_name']);
		$productInfo->setCurrencyId($saveData['currency_id']);
		$productInfo->setCurrencyName($saveData['currency_name']);
		$productInfo->setCurrency($saveData['currency']);
		$productInfo->setCurrencySymbol($saveData['currency_symbol']);
		
		$productInfo->setProductName($saveData['product_name']);
		$productInfo->setProductSku($saveData['product_sku']);
		$productInfo->setProductDescription($saveData['product_description']);
		$productInfo->setProductThumbImage($saveData['product_thumb_image']);
		$productInfo->setProductImage($saveData['product_image']);
		$productInfo->setProductSupplierId($saveData['product_supplier_id']);
		$productInfo->setCreatedUid($saveData['created_uid']);
		$productInfo->setUpatedUid($saveData['created_uid']);
		$productInfo->setInstanceId($saveData['instance_id']);
		$productInfo->setInstanceType($saveData['instance_type']);
		$productInfo->setPriceUnit($saveData['price_unit']);
		$productInfo->setVariationPricing($saveData['variation_pricing']);
		$em->persist($productInfo);
		$em->flush();
		return $productInfo;
	}
	
	/**
	 * To save data in database and return object of supplier request info
	 */
	public function addProductRequestInfoSupplier($saveData,$productId,$em){
		$productSupplier= new ProductSupplierRequestInfo();
		$productSupplier->setProductRequestInfoId($productId);
		$productSupplier->setSupplierId($saveData['supplier_id']);
		$productSupplier->setSupplierName($saveData['supplier_name']);
		$productSupplier->setCode($saveData['code']);
		$productSupplier->setEmailAddress($saveData['email_address']);
		$productSupplier->setWebsite($saveData['website']);
		$productSupplier->setImage($saveData['image']);
		$productSupplier->setFax($saveData['fax']);
		$productSupplier->setMobile($saveData['mobile']);
		$productSupplier->setTelephone($saveData['telephone']);
		$em->persist($productSupplier);
		$em->flush();
	}
	
	public function addProductRequestInfoQuantity($productData,$productId,$em){
		if(count($productData['quantity'])>0) {
			foreach($productData['quantity'] as $key=>$saveData){
				$productQuantity= new ProductQuantityRequestInfo();
				$productQuantity->setProductRequestInfoId($productId);
				$productQuantity->setQuantity($saveData['from']);
				$productQuantity->setProductPrice($saveData['rate']);
				$productQuantity->setDiscountCode($saveData['code']);
				$productQuantity->setCreatedUid($productData['created_uid']);
				$productQuantity->setUpatedUid($productData['created_uid']);
				$productQuantity->setInstanceId($productData['instance_id']);
				$productQuantity->setInstanceType($productData['instance_type']);
				$em->persist($productQuantity);
				$em->flush();
				$productId->addProductQuantityRequestInfo($productQuantity);
			}
		}
		//return $productQuantity;
	}
	
	public function addProductRequestInfoAttributes($productData,$productId,$em){
		if(count($productData['attribute'])>0) {
			foreach($productData['attribute'] as $key=>$saveData){
				if(count($saveData['values'])>0){
					foreach($saveData['values'] as $attrVlaueId=>$attrVlaueName){
						$productAttribute= new ProductAttributeRequestInfo();
						$productAttribute->setProductRequestInfoId($productId);
						$productAttribute->setAttributeId($saveData['id']);
						$productAttribute->setAttributeName($saveData['label']);
						$productAttribute->setAttributeValueId($attrVlaueId);
						$productAttribute->setAttributeValue($attrVlaueName);
						$productAttribute->setCreatedUid($productData['created_uid']);
						$productAttribute->setUpatedUid($productData['created_uid']);
						$productAttribute->setInstanceId($productData['instance_id']);
						$productAttribute->setInstanceType($productData['instance_type']);
						$em->persist($productAttribute);
						$em->flush();
						$productId->addProductAttributeRequestInfo($productAttribute);
					}
				}
			}
		}
		//return $productAttribute;
	}
	

	/**
	 * To get Guest user detail
	 */
	public function getGuestUser($userId){
		$query = $this->getEntityManager()->getRepository('OfficeBrainRequestInfoBundle:GuestUser')->createQueryBuilder('g');
		$query->where('g.id = :user')
		->setParameter('user', $userId);
		return $query->getQuery()->getSingleResult();
	} 
	
	/**
	 * To get request info list
	 */
	public function getRequestInfoList( $userId,$page,$recordsPerPage)
	{
		
		$query = $this->getEntityManager()->getRepository('OfficeBrainRequestInfoBundle:RequestInfo')->createQueryBuilder('r');
			$query->where('r.userId = :user')
			->andWhere('r.deletedAt IS NULL')
			->andWhere('r.instanceId = :instanceId')
			->setParameter('instanceId', $this->instanceId)
			->setParameter('user', $userId)
			->orderBy('r.id', 'DESC');
			//->setMaxResults(5);
			return $this->paginatorService->paginate($query, $page, $recordsPerPage);
			//return $query->getQuery()->getResult();
	}
	
	/**
	 * To get request info detail by id
	 */
	public function getRequestInfoDetailById($infoId)
	{
		$queryBuilder = $this->getQueryBuilder();
		$queryBuilder->where('r.id = :infoId');
		$queryBuilder->setParameter('infoId', $infoId);
		return $queryBuilder->getQuery()->getSingleResult();
	}
	
	/**
	 * To get request Info product data for particular user
	 */
	public function getRequestInfoAdminList($page,$recordsPerPage)
	{
		$queryBuilder = $this->getQueryBuilder();
		$queryBuilder->where('r.deletedAt IS NULL')
		->andWhere('r.instanceId = :instanceId')
		->setParameter('instanceId', $this->instanceId)
		->andWhere('r.distributor = :disributorId')
		->setParameter('disributorId', $this->userId);
		$queryBuilder->orderBy('r.id', 'DESC');
		return $this->paginatorService->paginate($queryBuilder, $page, $recordsPerPage);
	}
	
	/**
	 * To get request Info product data for particular user
	 */
	public function getTotalCountUserWise($flag)
	{
		$queryBuilder = $this->getQueryBuilder();
		$queryBuilder->select('count(r.id)');
		$queryBuilder->where('r.deletedAt IS NULL AND r.instanceId = :instanceId')
		->setParameter('instanceId', $this->instanceId);
        if ($flag == 'user') {
            $queryBuilder->andWhere('r.userId = :userId')
                ->setParameter('userId', $this->userId);
        }else{
        	$queryBuilder->andWhere('r.distributor = :disributorId')
        	->setParameter('disributorId', $this->userId);
        }
		return $queryBuilder->getQuery()->getSingleScalarResult();
	}

	/**
	 * Todelete request info  product data of particular user
	 */
	public function deleteRequestInfo($requestInfoId)
	{
		$em=$this->getEntityManager();
		$requestInfo = $this->getRequestInfoDetailById($requestInfoId);
		$requestInfo->setDeletedAt(new \DateTime());
		$em->persist($requestInfo);
		$em->flush();
		return $requestInfo;
	}
	
	/**
	 * To update request info  
	 */
	function editRequestInfo($requestInfoObject)
	{
		$this->getEntityManager()->persist($requestInfoObject);
        $this->getEntityManager()->flush();
        return $requestInfoObject;
	}

	public function getRequestSampleList($userId,$page,$recordsPerPage)
    {  
       $query = $this->getEntityManager()->getRepository('OfficeBrainProductBundle:OrderSample')->createQueryBuilder('r');
            $query->where('r.userId = :user')
            ->andWhere('r.deletedAt IS NULL')
             ->andWhere('r.comment IS NULL')
            ->andWhere('r.instanceId = :instanceId')
            ->setParameter('instanceId', $this->instanceId)
            ->setParameter('user', $userId)
            ->orderBy('r.id', 'DESC');
            // echo "<pre>";
             //\Doctrine\Common\Util\Debug::dump($query->getQuery()->getResult());exit;
            //print_r($query->getQuery()->getResult());exit;
            return $this->paginatorService->paginate($query, $page, $recordsPerPage);
           
    }

    public function getAskQuestionList($userId,$page,$recordsPerPage)
    {  
       $query = $this->getEntityManager()->getRepository('OfficeBrainProductBundle:OrderSample')->createQueryBuilder('r');
            $query->where('r.userId = :user')
            ->andWhere('r.deletedAt IS NULL')
            ->andWhere('r.comment IS NOT NULL')
            ->andWhere('r.instanceId = :instanceId')
            ->setParameter('instanceId', $this->instanceId)
            ->setParameter('user', $userId)
            ->orderBy('r.id', 'DESC');
            // echo "<pre>";
             //\Doctrine\Common\Util\Debug::dump($query->getQuery()->getResult());exit;
            //print_r($query->getQuery()->getResult());exit;
            //->setMaxResults(5);
            return $this->paginatorService->paginate($query, $page, $recordsPerPage);
            //return $query->getQuery()->getResult();
    }

     public function getRequestAdminSampleList($page,$recordsPerPage)
    {  
       $query = $this->getEntityManager()->getRepository('OfficeBrainProductBundle:OrderSample')->createQueryBuilder('r');
            $query->Where('r.deletedAt IS NULL')
            ->andWhere('r.comment IS NULL')
            ->andWhere('r.instanceId = :instanceId')
            ->setParameter('instanceId',$this->instanceId)
            ->orderBy('r.id', 'DESC');
            // echo "<pre>";
             //\Doctrine\Common\Util\Debug::dump($query->getQuery()->getResult());exit;
            //print_r($query->getQuery()->getResult());exit;
           return $this->paginatorService->paginate($query, $page, $recordsPerPage);
           
    }

    public function getAdminAskQuestionList($page,$recordsPerPage)
    {  
       $query = $this->getEntityManager()->getRepository('OfficeBrainProductBundle:OrderSample')->createQueryBuilder('r');
            $query->Where('r.deletedAt IS NULL')
            ->andWhere('r.comment IS NOT NULL')
            ->andWhere('r.instanceId = :instanceId')
            ->setParameter('instanceId', $this->instanceId)
            ->orderBy('r.id', 'DESC');
             //echo "<pre>";
             //\Doctrine\Common\Util\Debug::dump($query->getQuery()->getResult());exit;
            //print_r($query->getQuery()->getResult());exit;
            //->setMaxResults(5);
            return $this->paginatorService->paginate($query, $page, $recordsPerPage);
            //return $query->getQuery()->getResult();
    }
	
}
