<?php

namespace OfficeBrain\Bundle\ServiceGroupBundle\Entity;

use Doctrine\ORM\EntityRepository;

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

    /**
     * To add rule mapping rules.
     *
     * @param object $serviceRuleMappingRulesFormObj
     *
     * @return \OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceRuleMappingRules
     */
    public function addServiceRuleMappingRules($ruleMappingId, $ruleMasterId)
    {
        $serviceRuleMapRules = new ServiceRuleMappingRules();

        $serviceRuleMapRules->setRuleMasterId($ruleMasterId);
        $serviceRuleMapRules->setRuleMappingId($ruleMappingId);

        $serviceRuleMapRules->setCreatedUid($this->userId);
        $serviceRuleMapRules->setCreatedAt(new \DateTime());
        $serviceRuleMapRules->setUpdatedUid($this->userId);
        $serviceRuleMapRules->setUpdatedAt(new \DateTime());

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

        return $serviceRuleMapRules;
    }

    /**
     * To edit rule mapping rules.
     *
     * @param object $serviceRuleMappingRulesFormObj
     *
     * @return \OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceRuleMappingRules
     */
    public function editServiceRuleMappingRules($id)
    {
        //$serviceRuleMapRules = new ServiceRuleMappingRules();
        $serviceRuleMapRules = $this->findOneBy(array('id' => $id));
        $em = $this->getEntityManager();

        $serviceRuleMapRules->setStartDate($startDate);
        $serviceRuleMapRules->setEndDate($endDate);

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

        return $serviceRuleMapRules;
    }

    /**
     * To edit rule mapping Master ID.
     *
     * @param object $serviceRuleMappingRulesFormObj
     *
     * @return \OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceRuleMappingRules
     */
    public function editServiceRuleMappingRulesMasterId($ids, $masterId)
    {
        foreach ($ids as $id) {
            if (is_numeric($id)) {
                $qb = $this->createQueryBuilder('u')->update()
                ->set('u.ruleMappingId', $masterId)
                ->where('u.id = :id')
                ->setParameter('id', $id)
                ->getQuery();
                $p = $qb->execute();
            }
        }
    }

    /**
     * To get Rule Mapping Rules by $id.
     *
     * @param int $id
     *
     * @return ServiceRuleMappingRulesObj|null
     */
    public function find($id, $lockMode = NULL, $lockVersion = NULL)
    {
        $serviceRuleMappingRule = $this->createQueryBuilder('rmr')
        ->select('rmr')
        ->where('rmr.id  = :id')->setParameter('id', $id)
        ->andWhere('rmr.deletedAt IS NULL')
        ->getQuery()->getOneOrNullResult();

        return $serviceRuleMappingRule;
    }

    /**
     * To get Rule Mapping Rules by $id.
     *
     * @param int $id
     *
     * @return ServiceRuleMappingRulesObj|null
     */
    public function getMappingRulesByRuleMasterId($id)
    {
        $serviceRuleMainCond = $this->createQueryBuilder('rmc')
                ->select('rmc.id,rmc.ruleMasterId,rm.ruleName,rm.ruleType')
                ->leftjoin('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'rm', 'WITH', 'rmc.ruleMasterId = rm.id')
                ->where('rmc.id  = :id')->setParameter('id', $id)
                ->andWhere('rmc.deletedAt IS NULL')
                ->getQuery()->getResult();

        if ($serviceRuleMainCond) {
            return $serviceRuleMainCond;
        }

        return;
    }

    /**
     * To get Rule Mapping Rules by $mappingMasterId.
     *
     * @param int $mappingMasterId
     *
     * @return ServiceRuleMappingRulesObj|null
     */
    public function getMappingRulesByMappingMasterId($mappingMasterId)
    {
        $serviceRuleMainCond = $this->createQueryBuilder('rmc')
        ->select('rmc.id,rmc.ruleMasterId,rm.ruleName,rm.ruleType, ra.id as actionId')
        ->leftjoin('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'rm', 'WITH', 'rmc.ruleMasterId = rm.id')
        ->leftjoin('OfficeBrainServiceGroupBundle:ServiceRuleMappingActions', 'ra', 'WITH', 'rmc.id = ra.ruleMappingRuleId')
        ->where('rmc.ruleMappingId  = :ruleMappingId')->setParameter('ruleMappingId', $mappingMasterId)
        ->andWhere('rmc.deletedAt IS NULL')
        ->getQuery()->getResult();

        if ($serviceRuleMainCond) {
            return $serviceRuleMainCond;
        }

        return;
    }

    /**
     * To get Rule Mapping Rules by $ruleId.
     *
     * @param int $ruleId
     *
     * @return ServiceRuleMappingRulesObj|null
     */
    public function getMappingRulesById($ruleId)
    {
        //$rules = $this->findOneBy(array('id'=>$ruleId));

        $rules = $this->createQueryBuilder('a')
                    ->select('c,a,d')
                    ->join('a.ruleMapRulesId', 'c')
                    ->join('c.ruleMapMainCondId', 'd')
                    ->where('a.id = :map_id')
                    ->setParameter('map_id', $ruleId)
                    ->andWhere('a.deletedAt IS NULL')
                    ->getQuery()->getArrayResult();
        if ($rules) {
            $rules = $rules[0];
        } else {
            $rules = array();
        }

        $ruleMaster = $this->createQueryBuilder('r')
                        ->select('rm.ruleName,rm.ruleType,rm.countryId')
                        ->join('OfficeBrainServiceGroupBundle:ServiceRuleMaster', 'rm', 'WITH', 'r.ruleMasterId = rm.id')
                        ->where('r.id = :map_id')
                        ->setParameter('map_id', $ruleId)
                        ->andWhere('r.deletedAt IS NULL')
                        ->getQuery()->getSingleResult();
        $rules['ruleName'] = $ruleMaster['ruleName'];
        $rules['ruleType'] = $ruleMaster['ruleType'];
        $rules['countryId'] = $ruleMaster['countryId'];

        if ($rules) {
            return $rules;
        }

        return;
    }

    /**
     * To delete RuleMapping Rules.
     *
     * @param int $ruleMappingRulesId
     *
     * @return bool
     */
    public function deleteRuleMappingRules($ruleMappingRulesId)
    {
        /*$serviceRules = $this->findOneBy(array('id' => $ruleMappingRulesId));

        if($serviceRules){
            $em = $this->getEntityManager();
            $em->remove($serviceRules);
            $em->flush();
            return true;
        }*/
        $serviceRules = $this->findOneBy(array('id' => $ruleMappingRulesId));

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

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

            return true;
        }

        return false;
    }

    public function getAllMAppingForRule($masterId)
    {
        $serviceRuleMappingRule = $this->createQueryBuilder('rmr')
        ->select('rmr')
        ->where('rmr.ruleMasterId  = :master_id')->setParameter('master_id', $masterId)
        ->groupBy('rmr.ruleMappingId')
        ->getQuery()->getResult();

        return $serviceRuleMappingRule;
    }
}
