<?php

namespace OfficeBrain\Bundle\ProductBundle\Entity;

use Doctrine\ORM\EntityRepository;
use OfficeBrain\Bundle\ProductBundle\Entity\FeatureDetails;

/**
 * FeatureDetailsRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class FeatureDetailsRepository extends EntityRepository
{
    /**
     * To insert feature details
     * 
     * @param string $feature
     * @param integer $status
     * @param \CultureProducts $productCultureObject
     * @param \ProductMaster $productMaster
     * @param \Culture $culture
     * 
     * @return \OfficeBrain\Bundle\ProductBundle\Entity\FeatureDetails
     */
    public function add($feature, $productCultureObject,$productMaster,$culture, $featureLabel = '')
    {
    	$featureObj = $this->findOneBy(array('culture_product_id' => $productCultureObject->getId(), 'feature' => $feature, 'product_id' => $productMaster->getId()));
    	$featureObj = ($featureObj) ? $featureObj : new FeatureDetails();
        
        $featureObj->setProductId($productMaster);
        $featureObj->setCulture($culture);
        $featureObj->setCultureProductId($productCultureObject);
        $featureObj->setFeature($feature);
        $featureObj->setFeatureLabel($featureLabel);
        $featureObj->setActive(true);
        
        $this->_em->persist($featureObj);
        $this->_em->flush();
        
        return $featureObj;
    }

    /**
     * 
     * @param \CultureProducts $productCultureObject
     * 
     * @return boolean
     */
    public function removeFeatures($productCultureObject)
    {
    	if (is_object($productCultureObject)) {
    		$cultureProductId = $productCultureObject->getId();
    	} else {
    		$cultureProductId = $productCultureObject;
    	}
    	
        $featureObjs = $this->findBy(array('culture_product_id'=> $cultureProductId));
        if(!empty($featureObjs)){
            foreach($featureObjs as $obj){
                $this->_em->remove($obj);
            }
            $this->_em->flush();
            return true;
        }
    }

    /**
     * To get feature from cultureProductId and cultureId
     * 
     * @param integer $cultureProductId
     * @param integer $cultureId
     * 
     * @return multitype:
     */
    public function getFeatureDetails($cultureProductId, $cultureId) {
        
        $query = $this->_em->createQueryBuilder()
                    ->from('OfficeBrainProductBundle:featureDetails','fd')
                    ->select("fd.feature,fd.featureLabel")
                    ->where('fd.culture_product_id = :culture_product_id')
                    ->setParameter('culture_product_id', $cultureProductId)
                    ->andWhere('fd.culture = :culture_id')
                    ->setParameter('culture_id', $cultureId);
        
        return $query->getQuery()->getResult();
    }

    // For Migration
    public function getFeatureDetailsForCharges($page,$records){
    	$query = $this->_em->createQueryBuilder()
    		->select("fd.id,IDENTITY(fd.product_id) as product_id,IDENTITY(fd.culture) as culture,IDENTITY(fd.culture_product_id) as culture_product_id,fd.feature")
	    	->from('OfficeBrainProductBundle:featureDetails','fd')
	    	->innerJoin('OfficeBrainProductBundle:ProductMaster', 'pm','WITH','fd.product_id=pm.id and pm.supplier_id = 5')
	    	->where('fd.isProcessed = 0')
	    	->setFirstResult($page)
	        ->setMaxResults($records);
    	
    	return $query->getQuery()->getResult();
    }
    
    /**
     * To insert feature details
     *
     * @param string $feature
     * @param integer $status
     * @param \CultureProducts $productCultureObject
     * @param \ProductMaster $productMaster
     * @param \Culture $culture
     *
     * @return \OfficeBrain\Bundle\ProductBundle\Entity\FeatureDetails
     */
    public function addMigration($feature, $productCultureObject,$productMaster,$culture, $featureLabel = '')
    {
    	$featureObj = new FeatureDetails();
    	$featureObj->setProductId($productMaster);
    	$featureObj->setCulture($culture);
    	$featureObj->setCultureProductId($productCultureObject);
    	$featureObj->setFeature($feature);
    	$featureObj->setFeatureLabel($featureLabel);
    	$featureObj->setIsMigrated(1);
    	$featureObj->setIsProcessed(1);
    	$featureObj->setActive(true);
    
    	$this->_em->persist($featureObj);
    	$this->_em->flush();
    
    	return $featureObj;
    }
    
    public function migrationDeleteFeatureDetails($featureId){
    	$qb =  $this->_em->createQueryBuilder();
    	$q = $qb->update('OfficeBrainProductBundle:featureDetails','fd')
    	->set('fd.isProcessed', 1)
    	->where('fd.id = :feature_id')
    	->setParameter('feature_id', $featureId)
    	->getQuery();
    	$p = $q->execute();
    }
    
    public function removeProductFeature($culture_product,$featureArray)
    {
    	$em = $this->getEntityManager();
    	$queryBuilder = $em->createQueryBuilder();
    	$result = $queryBuilder->select('fd')
    	->from("OfficeBrainProductBundle:FeatureDetails", 'fd')
    	->where('fd.culture_product_id = :cProd')
    	->setParameter('cProd', $culture_product)
    	->andWhere($queryBuilder->expr()->notIn('fd.feature', $featureArray))
    	//->getQuery()->getArrayResult();
    	->getQuery()->getResult();
    
    	foreach($result as $fd){
    		$em->remove($fd);
    	}
    	$em->flush();
    
    	return true;
    }
}
