<?php

namespace OfficeBrain\Bundle\ServiceGroupBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * ServiceRuleMasterRepository.
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ServiceRuleMasterRepository 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'];
    }

    /*
     * New structured functions
     */

    public function findByCountryId($ruleType, $countryId, $searchKeywords = null)
    {
        $qb = $this->_em->createQueryBuilder()
                ->select('srm')
                ->from('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'srm')
                ->where('srm.deletedAt IS NULL')
                ->andWhere('srm.countryId = :countryId')
                ->setParameter('countryId', $countryId)
                ->andWhere('srm.ruleType = :ruleType')
                ->setParameter('ruleType', $ruleType)
                ->andWhere('srm.instanceId = :instanceId')
                ->setParameter('instanceId', $this->instanceId)
                ->andWhere('srm.instanceType = :instanceType')
                ->setParameter('instanceType', $this->instanceType);

        if ($searchKeywords && $searchKeywords != '') {
            $qb->andWhere('srm.ruleName like :searchKeywords');
            $qb->setParameter(':searchKeywords', '%'.$searchKeywords.'%');
        }

        $qb->addOrderBy('srm.updatedAt', 'DESC');

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

    /**
     * To add rule master.
     *
     * @param object $serviceRuleMasterFormObj
     *
     * @return \OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceRuleMaster
     */
    public function setServiceRuleMaster($ruleName, $ruleType, $status, $countryId)
    {
        $serviceRuleMast = new ServiceRuleMaster();

        $serviceRuleMast->setRuleName($ruleName);
        $serviceRuleMast->setRuleType($ruleType);
        $serviceRuleMast->setStatus($status);
        $serviceRuleMast->setCountryId($countryId);

        $serviceRuleMast->setInstanceId($this->instanceId);
        $serviceRuleMast->setInstanceType($this->instanceType);
        $serviceRuleMast->setCreatedAt(new \DateTime());
        $serviceRuleMast->setCreatedUid($this->userId);

        $this->_em->persist($serviceRuleMast);
        $this->_em->flush();

        return $serviceRuleMast;
    }

    /**
     * To check Rule Name exists in RuleMaster.
     *
     * @param unknown $ruleName
     *
     * @return bool
     */
    public function isRuleNameExists($ruleType, $ruleName, $countryId, $serviceRuleMasterId = null)
    {
        $serviceRuleName = strtolower(trim($ruleName));
        $qb = $this->_em->createQueryBuilder();
        $qb->select('count(srm.id)');
        $qb->from('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'srm');

        $qb->where('LOWER(srm.ruleName)=:rule_name')
            ->andWhere('srm.deletedAt IS NULL')
            ->andWhere('srm.countryId=:countryId')
            ->andWhere('srm.ruleType = :ruleType')
            ->setParameter('ruleType', $ruleType);

        if ($serviceRuleMasterId != null && $serviceRuleMasterId > 0) {
            $qb->andWhere('srm.id != :rid');
        }
        $qb->setParameter(':rule_name', $serviceRuleName);
        if ($serviceRuleMasterId != null && $serviceRuleMasterId > 0) {
            $qb->setParameter(':rid', $serviceRuleMasterId);
        }
        $qb->setParameter(':countryId', $countryId);

        $serviceRuleCount = $qb->getQuery()->getSingleScalarResult();

        if ($serviceRuleCount && $serviceRuleCount > 0) {
            return true;
        }

        return false;
    }

    /**
     * To edit rule master.
     *
     * @param object $serviceRuleMasterFormObj
     *
     * @return \OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceRuleMaster
     */
    public function editServiceRuleMaster($ruleMasterId, $ruleName, $status)
    {
        $serviceRuleMast = $this->findOneBy(array('id' => $ruleMasterId));
        if ($serviceRuleMast) {
            $em = $this->getEntityManager();
            $serviceRuleMast->setRuleName($ruleName);
            $serviceRuleMast->setStatus($status);

            $serviceRuleMast->setUpdatedAt(new \DateTime());
            $serviceRuleMast->setUpdatedUid($this->userId);

            $em->persist($serviceRuleMast);
            $em->flush();

            return $serviceRuleMast;
        }

        return;
    }

    /*
     * End structured functions
     */

    /**
     * To get list of RuleMaster.
     *
     * @param unknown $getListIncludingDeleted
     *
     * @return serviceRuleMasterObject|NULL
     */
    public function getServiceRuleMasterList($sortBy = 'id', $sortType = 'DESC', $searchKeywords = '', $getListIncludingDeleted = 0)
    {
        /*$WhereFieldAry = array();
        if ($getListIncludingDeleted != 1) {
            $WhereFieldAry = array('deletedAt' => null);
        }
        if($searchKeywords != ""){
            $WhereFieldAry['ruleName'] = $searchKeywords;
        }

        $serviceRuleMaster = $this->findBy($WhereFieldAry, array($sortBy => $sortType));
        if ($serviceRuleMaster) {
            return $serviceRuleMaster;
        }*/

        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder();
        $qb->select('rm');
        $qb->from('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'rm');

        if ($getListIncludingDeleted != 1) {
            $qb->andWhere('rm.deletedAt IS NULL');
        }

        if ($searchKeywords != '') {
            $qb->andWhere('rm.ruleName like :searchKeywords');
            $qb->setParameter(':searchKeywords', '%'.$searchKeywords.'%');
        }

        $qb->addOrderBy('rm.'.$sortBy, $sortType);
        $result = $qb->getQuery()->getResult();

        if ($result) {
            return $result;
        }

        return;
    }

    /**
     * To get list of RuleMaster by RuleType.
     *
     * @param string $ruleType
     *
     * @return serviceRuleMasterObject|NULL
     */
    public function getServiceRuleMasterByRuleTypeList($ruleType, $countryId)
    {
        $ruleType = strtolower($ruleType);
        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder();
        $qb->select('rm.id, rm.ruleName');
        $qb->from('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'rm');
        $qb->where('LOWER(rm.ruleType) = :ruleType');
        $qb->andWhere('rm.deletedAt IS NULL');
        $qb->andWhere('rm.countryId = :countryId');
        $qb->setParameter(':ruleType', $ruleType);
        $qb->setParameter(':countryId', $countryId);

        $result = $qb->getQuery()->getResult();

        return $result;
    }

    /**
     * To delete RuleMaster.
     *
     * @param unknown $ruleMasterId
     *
     * @return bool
     */
    public function deleteServiceRuleMaster($ruleMasterId)
    {
        $serviceRuleMast = $this->findOneBy(array('id' => $ruleMasterId));

        if ($serviceRuleMast) {
            $em = $this->getEntityManager();
            $serviceRuleMast->setDeletedAt(new \DateTime());
            $serviceRuleMast->setDeletedUid($this->userId);

            $em->persist($serviceRuleMast);
            $em->flush();

            return true;
        }

        return false;
    }

    /**
     * To delete RuleMaster.
     *
     * @param unknown $ruleMasterId
     *
     * @return bool
     */
    public function changeStatusServiceRuleMaster($ruleMasterId)
    {
        $serviceRuleMast = $this->findOneBy(array('id' => $ruleMasterId));

        if ($serviceRuleMast) {
            $em = $this->getEntityManager();

            if ($serviceRuleMast->getStatus() == 1) {
                $serviceRuleMast->setStatus(0);
            } else {
                $serviceRuleMast->setStatus(1);
            }

            $em->persist($serviceRuleMast);
            $em->flush();

            return true;
        }

        return false;
    }

    /**
     * To check Rule exists.
     *
     * @param int $ruleId
     *
     * @return serviceRuleMasterObject|bool
     */
    public function CheckRuleExists($id)
    {
        $WhereFieldAry = array('deletedAt' => null ,'id' => $id);
        $serviceRuleMaster = $this->findOneBy($WhereFieldAry);
        if ($serviceRuleMaster) {
            return $serviceRuleMaster;
        }

        return false;
    }

    /**
     * To get list of RuleMaster.
     *
     * @param unknown $getListIncludingDeleted
     *
     * @return serviceRuleMasterObject|NULL
     */
    public function getServiceRuleMasterListById($serviceRuleMasterId)
    {
        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder()
                ->select(['srm', 'srmc', 'sric'])
                ->from('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'srm')
                ->leftJoin('srm.serviceRuleMainConditionId', 'srmc')
                ->leftJoin('srmc.serviceRuleInnerConditionId', 'sric');
        $qb->where('srm.deletedAt IS NULL');
        $qb->andwhere('srm.id= :serviceRuleMasterId');
        $qb->setParameter(':serviceRuleMasterId', $serviceRuleMasterId);

        //$result = $qb->getQuery()->getArrayResult();
        $result = $qb->getQuery()->getArrayResult();
        if ($result) {
            return $result[0];
        }

        return $result;
    }

    /**
     * To get list of RuleMaster.
     *
     * @param unknown $serviceRuleMasterId
     *
     * @return serviceRuleMasterObject|NULL
     */
    public function getServiceRuleMasterForCopy($serviceRuleMasterId)
    {
        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder()
                ->select(['srm', 'srmc', 'sric'])
                ->from('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'srm')
                ->leftJoin('srm.serviceRuleMainConditionId', 'srmc')
                ->leftJoin('srmc.serviceRuleInnerConditionId', 'sric');
        $qb->where('srm.deletedAt IS NULL');
        $qb->andwhere('srm.id= :serviceRuleMasterId');
        $qb->setParameter(':serviceRuleMasterId', $serviceRuleMasterId);

        //$result = $qb->getQuery()->getArrayResult();
        $result = $qb->getQuery()->getResult();
        if ($result) {
            return $result[0];
        }

        return $result;
    }

    public function copyRuleMaster($ruleMaster)
    {
        $em = $this->getEntityManager();
        $em->persist($ruleMaster);
    }

    public function commit()
    {
        $em = $this->getEntityManager();
        $em->flush();
    }

    public function clear()
    {
        $em = $this->getEntityManager();
        $em->clear();
    }
}
