<?php

namespace OfficeBrain\Bundle\ServiceGroupBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * ServiceGroupRepository.
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ServiceGroupRepository extends EntityRepository
{
    public $apiClient;
    public $container;

    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'];
    }

    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - getServiceContainer
     * Function created to get Project Service Container
     */
    public function getServiceContainer()
    {
        return $this->serviceContainer;
    }

    /**
     * @author Employee Id: 4273
     * OB eCommerce Product - getServiceContainer
     * Function created to get Project Service Container
     */
    public function setServiceContainer($serviceContainer)
    {
        $this->serviceContainer = $serviceContainer;
    }

    public function init()
    {
        // global $kernel;
        $this->container = $this->serviceContainer;
        $this->apiClient = $this->container->get('office_brain_api_client');
    }

    public function findAllActive($countryId, $languageId)
    {
        $em = $this->getEntityManager();
        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');
        $query->select('sg.id, sgl.groupName');

        $query->leftJoin('sg.languageMapping', 'sgl');

        $query->where('sg.countryId = :countryId');
        $query->setParameter('countryId', $countryId);

        $query->andwhere('sgl.languageId = :languageId');
        $query->setParameter('languageId', $languageId);

        $query->andWhere('sg.deletedAt IS NULL');
        $query->andWhere('sg.status = 1');

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

    public function getServiceGroupRules($culture, $id = null)
    {
        $ruleMappingMasterList = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster')->listServiceRuleMapping();

        $returnAry = array();
        if (!empty($ruleMappingMasterList)) {
            if ($id === null) {
                foreach ($ruleMappingMasterList as $recordKey => $recordValue) {
                    $culture == $recordValue['cultureName'] ? $returnAry[] = $recordValue : '';
                }
            } else {
                foreach ($ruleMappingMasterList as $recordKey => $recordValue) {
                    #$culture == $recordValue['cultureName'] && ($id == $recordValue['id']) ? $returnAry = $recordValue : '';
                    $culture == $recordValue['cultureName'] && ($id == $recordValue['groupId']) ? $returnAry[] = $recordValue : '';
                }
            }
        }

        return $returnAry;
    }

    public function getRulesFromGroup($id, $groupId = null)
    {
        $ruleMapping = array();

        $ruleMappingMaster = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster')->getServiceRuleMappingById($id);
        $ruleMappingRules = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingRules')->getMappingRulesByMappingMasterId($id);

        return array($ruleMappingMaster,$ruleMappingRules);
    }

    public function getSelectedCultures()
    {
        $em = $this->getEntityManager();
        $cultureList = $em->getRepository('OfficeBrainServiceGroupBundle:Service')->getCultureWithIdList($this->apiClient);

        $options = $this->container->getParameter('admin.culture.options');
        $newCultureList = null;
        if ($cultureList && count($cultureList) > 0) {
            foreach ($cultureList as $key => $culture) {
                if (key_exists($culture, $options)) {
                    $newCultureList[$key] = $options[$culture];
                }
            }
        }

        return $newCultureList;
    }

    public function getRuleById($id)
    {
        return $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingRules')->getMappingRulesById($id);
    }

    public function getDefaultGroup($culture_id)
    {
        $groups = $this->getServiceGroupByCultureList($culture_id);
        $groupId = null;
        foreach ($groups as $k => $v) {
            if ($v['group_name'] == 'Regular') {
                $groupId = $v['id'];
            }
        }

        return $groupId;
    }

    public function getAllGroupName($countryId)
    {
        $groups = $this->getServiceGroupList($countryId);
        foreach ($groups as $group) {
            $groupAry[$group['id']] = $group['languageMapping'][0]['group_name'];
        }

        return $groupAry;
    }

    public function getGroupNameById($groupId)
    {
        $groupName = null;
        $groups = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->findOneBy(array('id' => $groupId));
        if ($groups['group_name']) {
            $groupName = $groups['group_name'];
        }

        return $groupName;
    }

    /*
     * ===================================================
     *
     */

    /**
     * Method to implement as per need
     * Get list of serviceGroup.
     *
     * @return Ambigous <\Doctrine\ORM\Query, \Doctrine\ORM\Query>|boolean
     */

    /**
     * To get Group list by culture.
     *
     * @param unknown $culture
     *
     * @return unknown|NULL
     */
    public function getServiceGroupByCultureList($cultureId)
    {
        $serviceGroup = $this->findBy(array('deletedAt' => null, 'status' => 1, 'culture' => $cultureId), array('id' => 'DESC'));
        if ($serviceGroup) {
            return $serviceGroup;
        } else {
            return array();
        }
    }

    public function importServiceGroup($culture, $serviceGroupName)
    {
        $serviceGroup = $this->findOneBy(array('deletedAt' => null, 'status' => 1, 'culture' => $culture->getId(), 'groupName' => $serviceGroupName));
        if ($serviceGroup) {
            return $serviceGroup;
        } else {
            return $this->addServiceGroup($serviceGroupName, '', 1, $culture);
        }
    }

    /**
     * To get list by culture.
     *
     * @param unknown $culture
     * @param unknown $offset
     * @param unknown $recordsPerPage
     *
     * @return unknown|NULL
     */
    public function getServiceGroupList($countryId, $languageId = null, $searchQuery = '')
    {
        $em = $this->getEntityManager();
        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');
        $query->select(['sg', 'sgl']);

        $query->leftJoin('sg.languageMapping', 'sgl');
        $query->where('sg.countryId = :countryId');
        $query->setParameter('countryId', $countryId);
        $query->andwhere('sg.instanceId = :instanceId');
        $query->setParameter('instanceId', $this->instanceId);
        $query->andwhere('sg.instanceType = :instanceType');
        $query->setParameter('instanceType', $this->instanceType);
        if ($languageId) {
            $query->andwhere('sgl.languageId = :languageId');
            $query->setParameter('languageId', $languageId);
        }

        if ($searchQuery != '') {
            $query->andWhere('sgl.groupName like :searchQuery');
            $query->setParameter(':searchQuery', '%'.$searchQuery.'%');
        }

        $query->andWhere('sg.deletedAt IS NULL');

        return $query->getQuery()->getArrayResult();
    }

    /**
     * To get list by culture.
     *
     * @param int $id
     *
     * @return array
     */
    public function getServiceGroupById($id)
    {
        $em = $this->getEntityManager();
        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');

        $query->select(['sg', 'sgl']);

        $query->leftJoin('sg.languageMapping', 'sgl');

        $query->where('sg.id = :serviceGroupId');
        $query->setParameter('serviceGroupId', $id);
        $query->andWhere('sg.deletedAt IS NULL');

        return $query->getQuery()->getArrayResult();
    }

    /**
     * To add.
     *
     * @param object $serviceGroupFormObj
     *
     * @return \OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceGroup
     */
    public function addServiceGroup($serviceGroup, $loggedInUserId = null, $id = null)
    {
        $em = $this->getEntityManager();

        /*if ($id && $id != null) {
            //$serviceGroup = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->find($id);
        } else {
            //$serviceGroup = new ServiceGroup();
        }*/
        if (!$id) {
            $serviceGroup->setCreatedAt(new \DateTime());
        }
        if ($loggedInUserId) {
            $serviceGroup->setCreatedUid($loggedInUserId);
        }

        $em->persist($serviceGroup);
//         $em->flush();

        return $serviceGroup;
    }

    /**
     * To edit.
     *
     * @param object $serviceGroupFormObj
     *
     * @return \OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceGroup
     */
    public function editServiceGroup($groupName, $id)
    {
        $serviceGroup = $this->findOneBy(array('id' => $id));
        if ($serviceGroup) {
            $em = $this->getEntityManager();
            $serviceGroup->setGroupName($groupName);
            $serviceGroup->setUpdatedAt(new \DateTime());
            $em->persist($serviceGroup);
            $em->flush();

            return $serviceGroup;
        }
    }

    /**
     * To remove.
     *
     * @param unknown $id
     *
     * @return Ambigous <object, NULL>
     */
    public function deleteServiceGroup($serviceGroup)
    {
        if ($serviceGroup) {
            $serviceGroup->setDeletedUid($this->userId);
            $this->_em->persist($serviceGroup);
            $this->commit();
            $this->_em->remove($serviceGroup);
            $this->commit();
            return $serviceGroup;
        }
    }

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

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

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

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

            return true;
        }

        return false;
    }

    /**
     * To update status.
     *
     * @param unknown $id
     * @param unknown $status
     *
     * @return Ambigous <object, NULL>
     */
    public function updateStatusServiceGroup($id, $status)
    {
        $serviceGroup = $this->findOneBy(array('id' => $id));
        if ($serviceGroup) {
            $em = $this->getEntityManager();
            $serviceGroup->setStatus($status);
            $serviceGroup->setUpdatedAt(new \DateTime());
            $em->persist($serviceGroup);
            $em->flush();

            return $serviceGroup;
        }
    }

    public function getCountServiceGroupExist($groupName, $cultureId = '', $serviceGroupId = '')
    {
        $em = $this->getEntityManager();
        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');
        $query->select('COUNT(sg)');
        $query->where('sg.groupName = :groupName');
        $query->setParameter('groupName', $groupName);
        if ($cultureId) {
            $query->andWhere('sg.culture = :culture');
            $query->setParameter('culture', $cultureId);
        }
        if ($serviceGroupId) {
            $query->andWhere('sg.id != :id');
            $query->setParameter('id', $serviceGroupId);
        }
        /* $query->andWhere('sg.deletedAt = :deletedAt');
            $query->setParameter('deletedAt', NULL); */
        $query->andWhere('sg.deletedAt IS NULL');
        $result = $query->getQuery()->getResult();
        //echo "<p>".$groupName."<p>".$query->getQuery()->getSql();
        if ($result[0][1] > 0) {
            return $result[0][1];
        }

        return;
    }

    public function getAllServiceGroup()
    {
        $em = $this->getEntityManager();
        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');
        $query->select(['sg', 'sgl']);

        $query->leftJoin('sg.languageMapping', 'sgl');

        $query->andWhere('sg.deletedAt IS NULL');

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


    /**
     * To get service Group drop down
     **/
    public function getServiceGroupData($countryId, $languageId = null)
    {
        $em = $this->getEntityManager();
        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');
        $query->select(['sg.id', 'sgl.groupName']);
        $query->leftJoin('sg.languageMapping', 'sgl');
        $query->where('sg.countryId = :countryId');
        $query->setParameter('countryId', $countryId);
        $query->andwhere('sg.instanceId = :instanceId');
        $query->setParameter('instanceId', $this->instanceId);
        $query->andwhere('sg.instanceType = :instanceType');
        $query->setParameter('instanceType', $this->instanceType);
        $query->andWhere('sg.deletedAt IS NULL');
        $query->andWhere('sg.status = 1');

        if ($languageId) {
            $query->andwhere('sgl.languageId = :languageId');
            $query->setParameter('languageId', $languageId);
        }

        return $query->getQuery()->getArrayResult();
    }


    /**
     * To get Service Group Name For Filter
     */
    public function getServiceGroupName($serviceGroupId)
    {
        $query=$this->createQueryBuilder('sg')
                    ->select('sgl.groupName')
                    ->leftJoin('sg.languageMapping', 'sgl')
                    ->andWhere('sg.id =:id')->setParameter('id', $serviceGroupId);
        return $query->getQuery()->getArrayResult();
    }

    public function getServiceDefaultGroupData($countryId, $instanceId=0, $instanceType='')
    {
        if ($instanceId==0) {
            $instanceId = $this->instanceId;
        }
        if ($instanceType=='') {
            $instanceType = $this->instanceType;
        }

        $em = $this->getEntityManager();

        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');
        $query->select('sg');

        $query->where('sg.countryId = :countryId');
        $query->setParameter('countryId', $countryId);

        $query->andwhere('sg.instanceId = :instanceId');
        $query->setParameter('instanceId', $instanceId);

        $query->andwhere('sg.instanceType = :instanceType');
        $query->setParameter('instanceType', $instanceType);

        $query->andWhere('sg.deletedAt IS NULL AND sg.isDefault = 1 AND sg.status=1');

        return $query->getQuery()->getOneOrNullResult();
    }

    public function getAllActiveServiceGroup($countryId, $isFromSolr=false)
    {
        $em = $this->getEntityManager();

        $query = $em->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup')->createQueryBuilder('sg');
        $query->select('sg');

        if (!$isFromSolr) {
            $query->where('sg.countryId = :countryId');
            $query->setParameter('countryId', $countryId);
        }

        $query->andwhere('sg.instanceId = :instanceId');
        $query->setParameter('instanceId', $this->instanceId);

        $query->andwhere('sg.instanceType = :instanceType');
        $query->setParameter('instanceType', $this->instanceType);

        $query->andWhere('sg.deletedAt IS NULL AND sg.status=1');

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

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

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

    public function set($serviceGroup)
    {
        $this->_em->persist($serviceGroup);
        $this->_em->flush();

        return $serviceGroup;
    }
}
