<?php

namespace OfficeBrain\Bundle\ServiceGroupBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * ServiceRuleProductPriceRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ServiceRuleProductPriceRepository extends EntityRepository
{
    protected $projectSetting;
    protected $instanceId;
    protected $instanceType;
    protected $cultureId;
    protected $cultureCode;
    protected $userId;

    public function setProjectSetting($projetSetting)
    {
        $this->projectSetting = $projetSetting;
        $this->prepareProjectSettingData();

        return $this;
    }

    public function getProjectSetting()
    {
        return $this->projetSetting;
    }

    public function prepareProjectSettingData()
    {
        $this->instanceId = $this->projectSetting['instance_id'];
        $this->instanceType = $this->projectSetting['instance_type'];
        $this->userId = $this->projectSetting['user_id'];
        $this->cultureId = $this->projectSetting['culture_id'];
        $this->cultureCode = $this->projectSetting['culture_code'];
    }

    public function getQueryBuilder()
    {
        return $this->getEntityManager()->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleProductPrice')->createQueryBuilder('srpp');
    }

    public function set($serviceRuleProductPrice)
    {
        $serviceRuleProductPrice->setInstanceId($this->instanceId);
        $serviceRuleProductPrice->setInstanceType($this->instanceType);
        $serviceRuleProductPrice->setCreatedAt(new \DateTime());
        $serviceRuleProductPrice->setCreatedUid($this->userId);

        $this->_em->persist($serviceRuleProductPrice);
    }

    public function removeProductByPriority($priority, $productId=null)
    {
        $queryBulder = $this->createQueryBuilder('srpp')
            ->delete('OfficeBrainServiceGroupBundle:ServiceRuleProductPrice', 'srpp');
        $queryBulder
            ->where('srpp.priority = :priority')
            ->setParameter(':priority', $priority);

        if ($productId!=null) {
            $queryBulder
                ->andWhere('srpp.productId = :productId')
                ->setParameter(':productId', $productId);
        }

        $queryBulder
            ->andWhere('srpp.instanceId = :instanceId')
            ->setParameter(':instanceId', $this->instanceId)

            ->andWhere('srpp.instanceType = :instanceType')
            ->setParameter(':instanceType', $this->instanceType);

        return $queryBulder->getQuery()->execute();
    }

    public function removeByProductId($productId, $serviceGroupId)
    {
        $queryBulder = $this->createQueryBuilder('srpp')
                        ->delete('OfficeBrainServiceGroupBundle:ServiceRuleProductPrice', 'srpp');
        $queryBulder
            ->where('srpp.productId = :productId')
            ->setParameter(':productId', $productId)

            ->andWhere('srpp.serviceGroupId = :serviceGroupId')
            ->setParameter(':serviceGroupId', $serviceGroupId)

            ->andWhere('srpp.instanceId = :instanceId')
            ->setParameter(':instanceId', $this->instanceId)

            ->andWhere('srpp.instanceType = :instanceType')
            ->setParameter(':instanceType', $this->instanceType);

        return $queryBulder->getQuery()->execute();
    }

    public function findByProductId($productId)
    {
        $queryBulder = $this->getQueryBuilder();

        $queryBulder
            ->where('srpp.productId = :productId')
            ->setParameter(':productId', $productId)

            ->andWhere('srpp.instanceId = :instanceId')
            ->setParameter(':instanceId', $this->instanceId)

            ->andWhere('srpp.instanceType = :instanceType')
            ->setParameter(':instanceType', $this->instanceType)
            ->addOrderBy("srpp.serviceGroupId", 'ASC')
            ->addOrderBy("srpp.fromQty", 'ASC');

        return $queryBulder->getQuery()->getResult();
    }

    public function findByProductIdAndGroupId($productId, $serviceGroupId, $instanceId)
    {
        $queryBulder = $this->getQueryBuilder();

        $queryBulder
        ->where('srpp.productId = :productId')
        ->setParameter(':productId', $productId);

        if (isset($serviceGroupId)) {
            $queryBulder->andWhere('srpp.serviceGroupId = :serviceGroupId')
          ->setParameter(':serviceGroupId', $serviceGroupId);
        }

        if ((int) $instanceId <= 0) {
            $instanceId = $this->instanceId;
        }

        $queryBulder->andWhere('srpp.instanceId = :instanceId')
        ->setParameter(':instanceId', $instanceId)

        ->andWhere('srpp.instanceType = :instanceType')
        ->setParameter(':instanceType', $this->instanceType)
        ->addOrderBy("srpp.serviceGroupId", 'ASC')
        ->addOrderBy("srpp.fromQty", 'ASC');

        return $queryBulder->getQuery()->getResult();
    }

    public function countByProductIdAndGroupLowPriority($productId, $serviceGroupId, $priority)
    {
        $queryBulder = $this->getQueryBuilder();

        $queryBulder
        ->select("count(srpp.id)")
        ->where('srpp.productId = :productId')
        ->setParameter(':productId', $productId)

        ->andWhere('srpp.serviceGroupId = :serviceGroupId')
        ->setParameter(':serviceGroupId', $serviceGroupId)

        ->andWhere('srpp.instanceId = :instanceId')
        ->setParameter(':instanceId', $this->instanceId)

        ->andWhere('srpp.priority <= :priority')
        ->setParameter(':priority', $priority)

        ->andWhere('srpp.instanceType = :instanceType')
        ->setParameter(':instanceType', $this->instanceType)
        ->addOrderBy("srpp.serviceGroupId", 'ASC')
        ->addOrderBy("srpp.fromQty", 'ASC');

        return $queryBulder->getQuery()->getSingleScalarResult();
    }

    public function countByProductIdAndGroupHeighPriority($productId, $serviceGroupId, $priority)
    {
        $queryBulder = $this->getQueryBuilder();

        $queryBulder
        ->select("count(srpp.id)")
        ->where('srpp.productId = :productId')
        ->setParameter(':productId', $productId)

        ->andWhere('srpp.serviceGroupId = :serviceGroupId')
        ->setParameter(':serviceGroupId', $serviceGroupId)

        ->andWhere('srpp.instanceId = :instanceId')
        ->setParameter(':instanceId', $this->instanceId)

        ->andWhere('srpp.priority > :priority')
        ->setParameter(':priority', $priority)

        ->andWhere('srpp.instanceType = :instanceType')
        ->setParameter(':instanceType', $this->instanceType)
        ->addOrderBy("srpp.serviceGroupId", 'ASC')
        ->addOrderBy("srpp.fromQty", 'ASC');

        return $queryBulder->getQuery()->getSingleScalarResult();
    }


    public function getAllProductsByRuleMappingPriority($ruleMappingPriority)
    {
        $serviceRuleMapping = $this->createQueryBuilder('srpp')
        ->select('srpp.productId')
        ->where('srpp.priority = :priority')
        ->setParameter(':priority', $ruleMappingPriority)
        ->groupBy("srpp.productId");

        $productArrayForMapping =  $serviceRuleMapping->getQuery()->getArrayResult();
        $removePrice = $this->removeProductByPriority($ruleMappingPriority);
        //echo '<pre>'; print_r($productArrayForMapping); die;
        return $productArrayForMapping;
    }

    public function commit()
    {
        $this->_em->flush();
    }

    public function clear()
    {
        $this->_em->clear();
    }
}
