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

use OfficeBrain\Bundle\TaxBundle\Manager\AbstractManager\ShippingTaxAbstract;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;


class ShippingTaxRegisterExtended extends ShippingTaxAbstract
{
	public function __construct($entityManager, $request, $productDetailManager, $twig, $commonLibraryManager,$twigExtension,$userContactBookManager,$coreManager,$session,$paginatorManager)
	{
		parent::__construct($entityManager, $request, $productDetailManager, $twig, $commonLibraryManager,$twigExtension,$userContactBookManager,$coreManager,$session,$paginatorManager);
	}

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

	
	/**
	 * @author Employee Id: 4471
	 * OB eCommerce Product - tax calculation
	 * To calculate tax shipping wise
	 */
	public function calculateTaxShippingWise($dataCharges) {
		$totalQuantity=$this->request->get('total_qty');
		$taxShippingWiseResult=array();
		$productPrice=0;
		$taxShippingWise= array();
		$taxShippingWiseFinalResult = array();
		$totalCharge=0;
		$priority = $this->configurationRule['option']['shipping_tax']['option']['priority']['status'];
		$this->productId=$this->request->get('product_id');
		$productData=$this->getProductDetailById($this->productId,$this->cultureCode);
		$productCatArray= isset($productData['category']) ? $productData['category'] : array();
		$orderType=$this->request->get('order_type');
		if($orderType == 'decoration')
		{
			$orderType = 'decorative';
		}
		if(isset($productData['pricing'])){
			foreach ($productData['pricing'] as $typeKey=>$typeData){
				if($typeKey==$orderType) {
					foreach ($typeData as $priceKey=>$priceData){
						if(isset($priceData['rate'])) {
							if($priceData['to']!='' && $priceData['from']!='') {
								if($totalQuantity>=intval($priceData['from']) && $totalQuantity<=intval($priceData['to'])) {
									$productPrice=(double)$priceData['rate'];
								}else{
									if($totalQuantity>intval($priceData['to'])){
										$productPrice=(double)$priceData['rate'];
									}
								}
							} else if($priceData['from']!='') {
								if($totalQuantity>=intval($priceData['from'])) {
									$productPrice=(double)$priceData['rate'];
								}
							}
						}
					}
				}
			}
		}
		$productPrice = $this->twigExtension->priceFilter($productPrice);
		if($this->request->get('shipping_method')!==null && $this->request->get('shipping_method')['shipping_detail']!==null) {
			$shippingType=$this->request->get('shipping_method')['shipping_type'];
			for($i=0;$i<count($dataCharges);$i++) {
				$totalCharge+=(double)$dataCharges[$i]['charges_amount'];
			}
			for($i=0;$i<count($this->request->get('shipping_method')['shipping_detail']);$i++) {
				$totalChargeForCurrentSplit=0;
				$taxShippingWiseValue[$i] = 0;
				if(isset($this->request->get('shipping_method')['shipping_detail'][$i]['selected_address_id']))
				{
					//$taxShippingWise=$this->request->get('shipping_method')['shipping_detail'][$i]['tax_shipping_wise']!==null ? (double)$this->request->get('shipping_method')['shipping_detail'][$i]['tax_shipping_wise'] : 0;
					$addressId=$this->request->get('shipping_method')['shipping_detail'][$i]['selected_address_id'];
					if($addressId != null && $addressId > 0){
						$shippingTax= array();
						$Address = $this->userContactBookManager->getSingleContactBook($addressId);
						$stateCode = $this->coreManager->getStateCode($Address->getStateId());
						$stateId = $Address->getStateId();
						$countryName = $this->coreManager->getCountryName($Address->getCountryId());
						$countryId= $Address->getCountryId();
						$productCat = '';
						foreach ($productCatArray as $index=>$productCatVal)
						{
							$productCat .= $index.',';
						}
						$productCat = rtrim($productCat, ",");
						$taxShippingWiseObj = $this->getShippingTax($countryId,$stateId,$productCat,$this->productId);
						
					}
					$totalQuantityPerShipping=0;
					if(isset($this->request->get('shipping_method')['shipping_detail'][$i]['color_quantity'])) {
						foreach ($this->request->get('shipping_method')['shipping_detail'][$i]['color_quantity'] as $colorId => $colorData) {
							if(isset($colorData['size'])){
								foreach($colorData['size'] as $sizeId =>$size){
									$totalQuantityPerShipping+=intval($colorData['quantity'][$sizeId]);
								}
							}else{
								$totalQuantityPerShipping+=intval($colorData['quantity'][0]);
							}
						}
					}
					$taxShippingWiseResult[$i] = 0;
					$countTax = count($taxShippingWiseObj);
					if($countTax>0)
					{
						if($countTax == 1)
						{
							$taxShippingWiseValue[$i] = $taxShippingWiseObj[0]->getTaxId()->getTaxValue();
							$taxShippingWiseType[$i] = $taxShippingWiseObj[0]->getTaxId()->getTaxType();
							if($shippingType=="standard") {
								if($taxShippingWiseValue[$i] != 0 )
								{
									if($taxShippingWiseType[$i]=='percentage')
									{	
										$taxShippingWiseResult[$i]=(($totalQuantityPerShipping*$productPrice)+$totalCharge)*($taxShippingWiseValue[$i]/100);
									}
									else
									{
										$taxShippingWiseResult[$i]=$taxShippingWiseValue[$i];
									}
								}
							} else if($shippingType=="split") {
								if($totalCharge>0) {
									$totalChargeForCurrentSplit=(($totalCharge)/$totalQuantity)*$totalQuantityPerShipping;
								}
								if($taxShippingWiseValue[$i] != 0 )
								{
									if($taxShippingWiseType[$i]=='percentage')
									{
										$taxShippingWiseResult[$i]=(($totalQuantityPerShipping*$productPrice)+$totalChargeForCurrentSplit)*($taxShippingWiseValue[$i]/100);
									}
									else
									{
										$taxShippingWiseResult[$i]=$taxShippingWiseValue[$i];
									}
								}
							}
						}
						else
						{
							$taxShippingWiseValue = array();
							$taxShippingWiseType = array();
							$taxShippingWiseResult = array();
							$finalTaxShippingWise[$i] = 0;
							
							foreach ($taxShippingWiseObj as $index=>$taxShippingWise)
							{
								$taxShippingWiseValue[$i][$index] = $taxShippingWiseObj[$index]->getTaxId()->getTaxValue();
								$taxShippingWiseType[$i][$index] = $taxShippingWiseObj[$index]->getTaxId()->getTaxType();
								if($shippingType=="standard") {
									if($taxShippingWiseValue[$i][$index] != 0 )
									{
										if($taxShippingWiseType[$i][$index]=='percentage')
										{
											$taxShippingWiseResult[$i][$index]=(($totalQuantityPerShipping*$productPrice)+$totalCharge)*($taxShippingWiseValue[$i][$index]/100);
										}
										else
										{
											$taxShippingWiseResult[$i][$index]=$taxShippingWiseValue[$i][$index];
										}
										if($index==0)
										{
											$finalTaxShippingWise[$i] = $taxShippingWiseResult[$i][$index];
										}
										elseif($priority == 'high')
										{
											if ($finalTaxShippingWise[$i] < $taxShippingWiseResult[$i][$index] )
											{
												$finalTaxShippingWise[$i] = $taxShippingWiseResult[$i][$index];
											}
										}
										elseif ($priority == 'low')
										{
											if ($finalTaxShippingWise[$i] > $taxShippingWiseResult[$i][$index] )
											{
												$finalTaxShippingWise[$i] = $taxShippingWiseResult[$i][$index];
											}
										}
									}
								} else if($shippingType=="split") {
									if($totalCharge>0) {
										$totalChargeForCurrentSplit=(($totalCharge)/$totalQuantity)*$totalQuantityPerShipping;
									}
									if($taxShippingWiseValue[$i][$index] != 0 )
									{
										if($taxShippingWiseType[$i][$index]=='percentage')
										{
											$taxShippingWiseResult[$i][$index]=(($totalQuantityPerShipping*$productPrice)+$totalChargeForCurrentSplit)*($taxShippingWiseValue[$i][$index]/100);
										}
										else
										{
											$taxShippingWiseResult[$i][$index]=$taxShippingWiseValue[$i][$index];
										}
										if($i==0)
										{
											$finalTaxShippingWise[$i] = $taxShippingWiseResult[$i][$index];
										}
										elseif($priority == 'high')
										{
											if ($finalTaxShippingWise[$i] < $taxShippingWiseResult[$i][$index] )
											{
												$finalTaxShippingWise[$i] = $taxShippingWiseResult[$i][$index];
											}
										}
										elseif ($priority == 'low')
										{
											if ($finalTaxShippingWise[$i] > $taxShippingWiseResult[$i][$index] )
											{
												$finalTaxShippingWise[$i] = $taxShippingWiseResult[$i][$index];
											}
										}
									}
								}
							}
							$taxShippingWiseResult[$i]= $finalTaxShippingWise[$i];
						}
					}
					$taxShippingWiseFinalResult[$i]=$this->twigExtension->priceFilter($taxShippingWiseResult[$i]);
				}
			}
				
		}
		return array("tax_shipping_wise"=>$taxShippingWiseFinalResult,"currency_symbol"=>$productData['currency']['symbol'],'unit_shipping_tax'=>$taxShippingWiseValue);
	}
	
	public function getTaxMasterList ($page, $recordsPerPage)
	{
		return $this->taxMasterRepositoryManager->getTaxMasterList($page,$recordsPerPage);
	}
	
	/**
	 * @author Employee Id: 4471
	 *
	 * Description : change status of particular tax master
	 *
	 * @param 1 : tax master id
	  
	 * @return type : tax master object.
	 *
	 * @throws Exception: Null
	 */
	public function changeTaxMasterStatus($id)
	{
		return $this->taxMasterRepositoryManager->changeTaxMasterStatus($id);
	}
	
	public function deleteTaxMaster($id)
	{
		//echo $id; exit();
		$taxMapping = $this->taxMappingRepositoryManager->checkMappingTaxMasterId($id); 
		if($taxMapping>0)
		{
			$this->responseArray['status']= 'error';
		}
		else
		{
			$result = $this->taxMasterRepositoryManager->deleteTaxMaster($id);
			$this->responseArray['status']='success';
		}
		return $this->responseArray;
	}
	
	public function addTaxMaster($taxManagerObj)
	{
		$this->addTax= $this->taxMasterRepositoryManager->addTaxMaster($taxManagerObj);
		if ($this->addTax) {
            return array('status'=>'SUCCESS');
        }
        return array('status'=>'FAIL');
	}
	
	public function getActiveTaxMasterList()
	{
		return $this->taxMasterRepositoryManager->getActiveTaxMasterList();
	}
	
	public function getTaxMappingList($page,$recordsPerPage,$searchArray)
	{
		return $this->taxMappingRepositoryManager->getTaxMappingList($page,$recordsPerPage,$searchArray);
	}
	
	public function changeTaxMappingStatus($id)
	{
		return $this->taxMappingRepositoryManager->changeTaxMappingStatus($id);
	}
	
	public function deleteTaxMapping($id)
	{
		//echo $id; exit();
		$result = $this->taxMappingRepositoryManager->deleteTaxMapping($id);
		$this->responseArray['status']='success';
		return $this->responseArray;
	}
	
	public function addTaxMapping($taxMapping) {
		//print_r($taxMapping); exit();
		$confiShippingTax=$this->configurationRule['option']['shipping_tax']['option'];
		$stateTaxConfi = $confiShippingTax['state']['status'];
    	$catTaxConfi = $confiShippingTax['category']['status'];
    	$productTaxConfi = $confiShippingTax['product']['status'];
    	
    	if($stateTaxConfi == 1 && $catTaxConfi == 0 && $productTaxConfi==0)
		{
			foreach($taxMapping as $index=>$map)
			{
				$result[$index]= $this->onlyStateTax($map);
			}
		}
		else if($stateTaxConfi == 0 && $catTaxConfi == 1 && $productTaxConfi==0)
		{
			foreach($taxMapping as $index=>$map)
			{
				$result[$index]= $this->onlyCatTax($map);
			}
		}
		else if($stateTaxConfi == 0 && $catTaxConfi == 0 && $productTaxConfi==1)
		{
			foreach($taxMapping as $index=>$map)
			{
				$result[$index]= $this->onlyProductIdTax($map);
			}
		}
		else if($stateTaxConfi == 1 && $catTaxConfi == 1 && $productTaxConfi==0)
		{
			foreach($taxMapping as $index=>$map)
			{
				$stateCount = is_array($map['state'])?count($map['state']):0;
				$catCount = is_array($map['cat'])?count($map['cat']):0;
				if($stateCount >0 && $catCount > 0)
				{
					$result[$index]=$this->onlyStateCatTax($map);
				}
				else if($stateCount >0 && $catCount == 0)
				{
					$result[$index]=$this->onlyStateTax($map);
				}
				else if($stateCount == 0 && $catCount > 0)
				{
					$result[$index]=$this->onlyCatTax($map);
				}
			}
		}
		else if($stateTaxConfi == 1 && $catTaxConfi == 0 && $productTaxConfi==1)
		{
			foreach($taxMapping as $index=>$map)
			{
				$stateCount = is_array($map['state'])?count($map['state']):0;
				$productIdCount = is_array($map['productId'])?count($map['productId']):0;
				if($stateCount >0 && $productIdCount > 0)
				{
					$result[$index]=$this->onlyStateProductTax($map);
				}
				else if($stateCount >0 && $productIdCount == 0)
				{
					$result[$index]=$this->onlyStateTax($map);
				}
				else if($stateCount == 0 && $productIdCount > 0)
				{
					$result[$index]=$this->onlyProductIdTax($map);
				}
			}
		}
		else if($stateTaxConfi == 0 && $catTaxConfi == 1 && $productTaxConfi==1)
		{
			foreach($taxMapping as $index=>$map)
			{
				$catCount = is_array($map['cat'])?count($map['cat']):0;
				$productIdCount = is_array($map['productId'])?count($map['productId']):0;
				if($catCount >0 && $productIdCount > 0)
				{
					$result[$index]=$this->onlyCatProductTax($map);
				}
				else if($catCount >0 && $productIdCount == 0)
				{
					$result[$index]=$this->onlyCatTax($map);
				}
				else if($catCount == 0 && $productIdCount > 0)
				{
					$result[$index]=$this->onlyProductIdTax($map);
				}
			}
		}
		else if($stateTaxConfi == 1 && $catTaxConfi == 1 && $productTaxConfi==1)
		{
			foreach($taxMapping as $index=>$map)
			{
				$stateCount = is_array($map['state'])?count($map['state']):0;
				$catCount = is_array($map['cat'])?count($map['cat']):0;
				$productIdCount = is_array($map['productId'])?count($map['productId']):0;
				$result[$index] = 'fail';
				if($stateCount > 0 && $productIdCount > 0 && $catCount > 0)
				{
					$result[$index]=$this->stateCatProductTax($map);
				}
				elseif($stateCount > 0 && $productIdCount > 0 && $catCount == 0)
				{
					$result[$index]=$this->onlyStateProductTax($map);
				}
				elseif($stateCount > 0 && $productIdCount == 0 && $catCount > 0)
				{
					$result[$index]=$this->onlyStateCatTax($map);
				}
				elseif($stateCount == 0 && $productIdCount > 0 && $catCount > 0)
				{
					$result[$index]=$this->onlyCatProductTax($map);
				}
				elseif($stateCount > 0 && $productIdCount == 0 && $catCount == 0)
				{
					$result[$index]=$this->onlyStateTax($map);
				}
				elseif($stateCount == 0 && $productIdCount > 0 && $catCount == 0)
				{
					$result[$index]=$this->onlyProductIdTax($map);
				}
				elseif($stateCount == 0 && $productIdCount == 0 && $catCount > 0)
				{
					$result[$index]=$this->onlyCatTax($map);
				}
			}
		}
		$status = 'success';
		foreach($result as $val)
		{
			if($val=='fail')
			{
				$status = 'error';
			}
		}
		return $status;
	}
	
	public function onlyStateTax($map)
	{
		if(count($map['state'])>0)
		{
			$dummyValue = 'success';
			foreach ($map['state'] as $temp)
			{
				$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxId'],$map['country'],$temp,NULL,NULL,NULL,NULL);
				if(!isset($result))
				{
					$dummyValue= 'fail';
				}
			}
			return $dummyValue;
		}
	}
	
	public function onlyCatTax($map)
	{
		if(count($map['cat'])>0)
		{
			$dummyValue = 'success';
			foreach ($map['cat'] as $indexCat=>$temp)
			{
				$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxId'],NUll,NULL,$temp,$map['catName'][$indexCat],NULL,NULL);
				if(!isset($result))
				{
					$dummyValue= 'fail';
				}
			}
			return $dummyValue;
		}
	}
	
	public function onlyProductIdTax($map) 
	{
		if(count($map['productId'])>0)
		{
			$dummyValue = 'success';
			foreach ($map['productId'] as $indexProd=>$temp)
			{
				$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxId'],NUll,NULL,NULL,NULL,$temp,$map['productSku'][$indexProd]);
				if(!isset($result))
				{
					$dummyValue= 'fail';
				}
			}
			return $dummyValue;
		}
	}
	
	public function onlyStateCatTax($map)
	{
		$dummyValue = 'success';
		foreach ($map['state'] as $state)
		{
			foreach ($map['cat'] as $indexCat=>$cat)
			{
				$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxId'],$map['country'],$state,$cat,$map['catName'][$indexCat],NULL,NULL);
				if(!isset($result))
				{
					$dummyValue= 'fail';
				}
			}
		}
		return $dummyValue;
	}
	
	public function onlyStateProductTax($map)
	{
		$dummyValue = 'success';
		foreach ($map['state'] as $state)
		{
			foreach ($map['productId'] as $indexProduct=>$productId)
			{
				$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxId'],$map['country'],$state,NULL,NULL,$productId,$map['productSku'][$indexProduct]);
				if(!isset($result))
				{
					$dummyValue= 'fail';
				}
			}
		}
		return $dummyValue;
	}
	
	public function onlyCatProductTax($map)
	{
		$dummyValue = 'success';
		foreach ($map['cat'] as $indexCat=>$cat)
		{
			foreach ($map['productId'] as $indexProduct=>$productId)
			{
				$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxId'],NULL,NULL,$cat,$map['catName'][$indexCat],$productId,$map['productSku'][$indexProduct]);
				if(!isset($result))
				{
					$dummyValue= 'fail';
				}
			}
		}
		return $dummyValue;
	}
	
	public function stateCatProductTax($map)
	{
		$dummyValue = 'success';
		foreach ($map['state'] as $state)
		{
			foreach ($map['cat'] as $cat)
			{
				foreach ($map['productId'] as $productId)
				{
					$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxId'],$map['country'],$state,$cat['cat'],$cat['catName'],$productId['productId'],$productId['productSku']);
					if(!isset($result))
					{
						$dummyValue= 'fail';
					}
				}
			}
		}
		return $dummyValue;
	}
	
	public function EditTaxMapping($map)
	{
		if(isset($map['countryId']))
		{
			$countryId=$map['countryId'];
		}
		else
		{
			$countryId = '';
		}
		if(isset($map['stateId']))
		{
			$stateId=$map['stateId'];
		}
		else
		{
			$stateId = '';
		}
		if(isset($map['categoryId']))
		{
			$categoryId=$map['categoryId'];
		}
		else
		{
			$categoryId = '';
		}
		if(isset($map['productId']) && count($map['productId'])>0)
		{
			$productIds =$map['productId'];
		}
		else
		{
			$productIds = '';
		}
		$dummyValue = 'success';
		$this->taxMappingRepositoryManager->deleteTaxMapping($map['id']);
		
		if(is_array($productIds))
		{
			foreach ($productIds as $productIndex=>$productId)
			{
				$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxMappingId'],$countryId,$stateId,$categoryId,$map['catName'],$productId,$map['sku'][$productIndex]);
			}
		}
		else
		{
			$result = $this->taxMappingRepositoryManager->addTaxMapping($map['taxMappingId'],$countryId,$stateId,$categoryId,$map['catName'],NULL,NULL);
		}
		
		return $dummyValue;
	}
}