<?php

namespace OfficeBrain\Bundle\ServiceGroupBundle\Manager\Extended;

use OfficeBrain\Bundle\ServiceGroupBundle\Manager\AbstractManager\ServiceRuleAbstract;

/**
 * @author OfficeBrain 4589 <info@officebrain.com>
 *
 * Description : Reward rule mapping Extended Class
 */
class RewardRuleMappingExtended extends ServiceRuleAbstract
{
    public function __construct($entityManager, $request, $session, $serviceContainer, $translatorService, $countries, $languages, $coreManager, $productTagManager, $serviceGroupAPiClient, $twigExtension)
    {
        parent::__construct($entityManager, $request, $session, $serviceContainer, $countries, $languages, $coreManager, $productTagManager, $serviceGroupAPiClient, $translatorService, $twigExtension);

        $this->conditionAry = $this->getConditionArray();
        $this->conditionMutlipleValueAry = $this->getConditionMultipleValueList();
        $this->cultureList = $this->getCultureList();

        $this->actionTypes = $this->getActionTypes();
        $this->actionLimitPer = $this->getActionLimitPer();
        $this->actionRuleTypes = $this->getActionRuleTypes();
        $this->actionChargeTypes = $this->getActionChargeTypes();
        $this->actionAmountTypes = $this->getActionAmountTypes();

        $this->translatorService = $translatorService;
    }

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

        return array($ruleMappingMaster,$ruleMappingRules);

        /*$serviceRuleMappingRepository = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster');
        $rewardRuleMappingMaster = $serviceRuleMappingRepository->findById($id);

        return $rewardRuleMappingMaster;*/
    }

    /**
     * @author Employee Id: 4589
     * Description : Add new rule master
     *
     * @param 1 : form object $form
     *
     * @return array
     * */
    public function setRuleMapping($form, $culture_id)
    {
        $ruleMappingRepo = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster');
        $ruleMappingRepo->setProjectSetting($this->projectSetting);

        $rulesError = null;

        $dataAry = $this->request->request->all();

        if (!isset($dataAry['mapping_rule_id']) || !is_array($dataAry['mapping_rule_id']) || count($dataAry['mapping_rule_id']) <= 0) {
            $rulesError = array('rules' => 'Please add at-least one Rule.');
        }

        if ($form->isValid() && $rulesError === null) {
            $data = array();

            $cultureId = $form->get('cultureId')->getData();
            $isReward = $form->get('isReward')->getData();
            $status = $form->get('isActive')->getData();
            $rulesIdAry = $dataAry['mapping_rule_id'];

            $groupId = null;
            $serviceId = null;

            if ($cultureId) {
                $ruleMasterObj = $ruleMappingRepo->addServiceRuleMappingMaster($cultureId, $groupId, $serviceId, $status, $isReward);

                if ($ruleMasterObj == null) {
                    return array('error_message' => $this->translatorService->trans('admin.service_group_management.rule_master.rule_master_blank'));
                } else {
                    if ($rulesIdAry && is_array($rulesIdAry) && count($rulesIdAry) > 0) {
                        $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingRules')
                        ->editServiceRuleMappingRulesMasterId($rulesIdAry, $ruleMasterObj->getId());
                    }

                    return true;
                }
            } else {
                return array('error_message' => $this->translatorService->trans('admin.service_group_management.rule_mapping.blank_data'));
            }
        } else {
            return $rulesError;
        }
    }

    public function copyRuleMappingMaster()
    {
        $id = $this->request->get('service_group_id');
        if ($id) {
            $serviceRuleMappingMaster = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster')->find($id);
            if ($serviceRuleMappingMaster) {
                $make_copy_country = $this->request->request->get('make_copy_country');
                $make_copy_status = $this->request->request->get('make_copy_status');

                foreach ($make_copy_country as $countryId => $value) {
                    if (isset($make_copy_status[$countryId])) {
                        $this->makeCopyRuleMappingMaster(clone $serviceRuleMappingMaster, $countryId, true);
                    } else {
                        $this->makeCopyRuleMappingMaster(clone $serviceRuleMappingMaster, $countryId, false);
                    }
                }

                // commit persist objects if any
                $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster')->commit();
            }

            return true;
        }

        return false;
    }

    public function makeCopyRuleMappingMaster($serviceRuleMappingMaster, $countryId, $isActive)
    {
        $serviceRuleMappingMaster->setId(null);

        if ($countryId) {
            $serviceRuleMappingMaster->setIsActive($isActive);
            $serviceRuleMappingMaster->setCultureId($countryId);
            $serviceRuleMappingMaster->setGroupId(null);
            $serviceRuleMappingMaster->setServiceId(null);

            $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster')->copyRuleMappingMaster($serviceRuleMappingMaster);
        }
    }

    /**
     * @author Employee Id: 4589
     * Description : Update rule mapping
     *
     * @param 1 : form object $form
     *
     * @return array
     * */
    public function updateRuleMapping($form, $id, $culture)
    {
        $ruleMappingRepo = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster');
        $ruleMappingRepo->setProjectSetting($this->projectSetting);
        $rulesError = null;

        $dataAry = $this->request->request->all();

        if (!isset($dataAry['mapping_rule_id']) || !is_array($dataAry['mapping_rule_id']) || count($dataAry['mapping_rule_id']) <= 0) {
            $rulesError = array('rules' => $this->translatorService->trans('admin.service_group_management.rule_mapping.rule_condition_blank_error'));
        }

        if ($form->isValid() && $rulesError === null) {
            $data = array();

            $cultureId = $form->get('cultureId')->getData();
            $groupId = null;
            $serviceId = null;
            $status = $dataAry['service_group_data']['isActive'];
            $rulesIdAry = $dataAry['mapping_rule_id'];

            if ($id) {
                $ruleMasterObj = $ruleMappingRepo->editServiceRuleMappingMaster($id, $groupId, $serviceId, $status);

                if ($ruleMasterObj == null) {
                    return array('error_message' => $this->translatorService->trans('admin.service_group_management.rule_master.rule_master_blank'));
                } else {
                    if ($rulesIdAry && is_array($rulesIdAry) && count($rulesIdAry) > 0) {
                        $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingRules')
                        ->editServiceRuleMappingRulesMasterId($rulesIdAry, $ruleMasterObj->getId());
                    }

                    return true;
                }
            } else {
                return array('error_message' => $this->translatorService->trans('admin.service_group_management.rule_mapping.blank_data'));
            }
        } else {
            return $rulesError;
        }
    }

    public function setRuleCondition($masterIdObj, $ruleArray, $condOp, $parentId = 0, &$counter = 0)
    {

        //*** Add into rule_main_condition
        $ruleMasterMainCondObj = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMainConditions')
                                                ->addServiceRuleMappingMainCondition($masterIdObj, $parentId, $condOp);

        foreach ($ruleArray as $rule) {
            if (isset($rule['rules'])) {
                $this->setRuleCondition($masterIdObj, $rule['rules'], $rule['condition'], $ruleMasterMainCondObj->getId(), $counter);
            } else {
                ++$counter;

                    //*** Add into rule_inner_condition
                    $ruleMasterInnerCond = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingInnerConditions')
                                                            ->addServiceRuleMappingInnerCondition($ruleMasterMainCondObj, $rule['field'], $rule['operator'], $rule['value'], $counter);
            }
        }
    }

    /**
     * @author Employee Id: 4589
     * Description :
     *
     * @param 1 : int $id
     *
     * @return array
     * */
    public function deleteRuleMapping($id)
    {
        $ruleMappingRepo = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceRuleMappingMaster');
        $ruleMappingRepo->setProjectSetting($this->projectSetting);

        return $ruleMappingRepo->deleteRuleMappingMaster($id);
    }
}
