<?php
namespace OfficeBrain\Bundle\AccessManagementBundle\Manager\Extended;

use OfficeBrain\Bundle\AccessManagementBundle\Manager\AbstractManager\AccessManagementAbstract;
use Symfony\Component\Form\FormError;
use OfficeBrain\Bundle\CoreBundle\Cache\RedisCacheService;

/**
 * @author OfficeBrain 4116 <info@officebrain.com>
 *
 * Description : This will manage user level Access.
 *
 **/

class AccessManagementExtended extends AccessManagementAbstract
{
    public function __construct($entityManager, $request, $session, $formManager=null)
    {
        parent::__construct($entityManager, $request, $session,$formManager);
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for set Site Access Repositories
     * @return ClassInstance
    */
    public function setSiteAccessRepositories()
    {
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'InstanceMaster');
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'ProjectAccessMaster');
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'InstanceAccessMapping');
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'InstanceUserAccessMapping');
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Project Access Master Threaded Data
     * returns Array Objects
     * @return ClassInstance
    */
    public function getProjectAccessMasterThreadedData()
    {
        $arrprojectAccessMasters=array();
        $objProjectAccessMaster=$this->getProjectAccessMasterData();
        $arrprojectAccessMasters=self::getThreaedProejctAccessMaster($objProjectAccessMaster, null);
        //echo "<!-- <pre>";print_r($arrprojectAccessMasters);echo "</pre> -->";
        return $arrprojectAccessMasters;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Project Access Master Threaded Data besed on prority of Access its check first User Level Acces if availabel then this Access given.
     * returns Array Objects
     * @return ClassInstance
    */
    public function getProjectUserAccessMasterThreadedData($instanceId=0, $objUser=null)
    {
        $arrprojectAccessMasters=array();
        $objProjectAccessMaster=array();

        // Get Current Or Parent User Access
        if (!empty($objUser)) {
            $objProjectAccessMaster=$this->getParentProjectAccessMasterDataByUserId($objUser);
        }

        // Get Current Instance Or Parent Instance Access
        if (count($objProjectAccessMaster)==0 && !empty($instanceId)) {
            $objProjectAccessMaster=$this->getProjectAccessMasterDataByInstanceId($instanceId);
        }

        if (count($objProjectAccessMaster)==0) {
            $mainInstanceObj=$this->getMainInstanceMasterObject();
            $objProjectAccessMaster=$this->getProjectAccessMasterDataByInstanceId($mainInstanceObj->getId());
        }

        $arrprojectAccessMasters=self::getThreaedProejctAccessMaster($objProjectAccessMaster, null);
        //echo "<pre>";print_r($arrprojectAccessMasters);echo "</pre>";
        return $arrprojectAccessMasters;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Main Instance Master Object
     * returns Instance Master Object
     * @return ClassInstance
    */
    public function getMainInstanceMasterObject()
    {
        if (!empty($this->mainInstanceMaster) && is_object($this->mainInstanceMaster)) {
            return $this->mainInstanceMaster;
        }

        $arrObj=$this->instanceMasterRepo->getMainInstanceMasterObject();
        $arrObj=$arrObj[0];
        return $this->mainInstanceMaster=$arrObj;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get SubDomain Project Access Master ThreadedData
     * returns Project Access Master Object Array
     * @return ClassInstance
    */
    public function getSubDomainProjectAccessMasterThreadedData()
    {
        $arrprojectAccessMasters=array();
        $objProjectAccessMaster=$this->getSubDomianProjectAccessMasterData();
        $arrprojectAccessMasters=self::getThreaedProejctAccessMaster($objProjectAccessMaster, null);
        //echo "<pre>";print_r($arrprojectAccessMasters);echo "</pre>";
        return $arrprojectAccessMasters;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Threaed Proejct Access Master
     * returns Project Access Master Object Array
     * @return ClassInstance
    */
    public static function getThreaedProejctAccessMaster(&$elements, $parent=null)
    {
        $projectAccessMaster = array();
        foreach ($elements as $key=>$element) {
            $elementParentValue=!empty($element->getParent())?$element->getParent()->getId():null;
            if ($elementParentValue==$parent) {
                $projectAccessMaster[$element->getId()]=array('name'=>$element->getAccessName(),'parent'=>!empty($element->getParent())?$element->getParent()->getId():0);
                $children=self::getThreaedProejctAccessMaster($elements, $element->getId());
                if ($children) {
                    $projectAccessMaster[$element->getId()]['child']= $children;
                }
                unset($elements[$key]);
            }
        }
        return $projectAccessMaster;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for All Sub User Object
     * @return ClassInstance
    */
    protected function getAllSubUserObjectByUser($objUser)
    {
        $objUsers=$this->userRepo->getAllSubUserObjectOfParentByUserId($objUser);
        $objThreaedUsers=self::getThreaedUsers($objUsers, $objUser->getId());
        $userObjs=$this->getExtractUserListByUserID($objThreaedUsers);
        return $userObjs;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Threaed Proejct Access Master
     * returns Project Access Master Object Array
     * @return ClassInstance
    */
    public function getExtractUserListByUserID($objThreaedUsers)
    {
        $objUsers = array();
        foreach ($objThreaedUsers as $key=>$element) {
            $objUsers[]=$element['userObj'];
            if (isset($element['child']) && count($element['child'])>0) {
                $children=$this->getExtractUserListByUserID($element['child']);
                $objUsers=array_merge($objUsers, $children);
            }
        }
        return $objUsers;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Threaed Proejct Access Master
     * returns Project Access Master Object Array
     * @return ClassInstance
    */
    public static function getThreaedUsers(&$elements, $parent=null)
    {
        $objUsers = array();
        foreach ($elements as $key=>$element) {
            $elementParentValue=!empty($element->getParent())?$element->getParent()->getId():null;
            if ($elementParentValue==$parent) {
                $objUsers[$element->getId()]=array('userObj'=>$element->getId(),'parent'=>$element->getParent()->getId());
                $children=self::getThreaedUsers($elements, $element->getId());
                if ($children) {
                    $objUsers[$element->getId()]['child']= $children;
                }
                unset($elements[$key]);
            }
        }
        return $objUsers;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Instance Access Mapping Array By instance Id
     * @return ClassInstance
    */
    public function getInstanceAccessMappingArrayByinstanceId($instanceId=0)
    {
        $arrInstanceMaster=array();
        if (!empty($instanceId)) {
            $objInstanceMaster=$this->getInstanceMasterByIds(array($instanceId));
            $objInstanceMaster=$objInstanceMaster[0];
            $instanceAccessMappingData=$this->getInstanceAccessMappingByInstanceId($objInstanceMaster);
            if (count($instanceAccessMappingData)>0) {
                foreach ($instanceAccessMappingData as $key => $value) {
                    $arrInstanceMaster[]=$value->getAccess()->getId();
                }
            }
        }
        return $arrInstanceMaster;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Main Instance Access Mapping Array By instance Id
     * @return ClassInstance
    */
    public function getMainInstanceAccessMappingArrayByinstanceId()
    {
        $arrInstanceMaster=array();
        $objInstanceMaster=$this->getMainInstanceMasterObject();
        $instanceAccessMappingData=$this->getInstanceAccessMappingByInstanceId($objInstanceMaster);
        if (count($instanceAccessMappingData)>0) {
            foreach ($instanceAccessMappingData as $key => $value) {
                $arrInstanceMaster[]=$value->getAccess()->getId();
            }
        }
        return $arrInstanceMaster;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for validateThreaedValue
     * @return ClassInstance
    */
    protected function validateThreaedValue($objProjectAccessMaster, $selectedValue=array())
    {
        foreach ($objProjectAccessMaster as $key => $value) {
            if (!empty($value->getParent()) && $value->getParent()->getId()>0 && !in_array($value->getParent()->getId(), $selectedValue)) {
                return false;
            }
        }
        return true;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for User have Access of Action
     * @return ClassInstance
    */
    public function getUserAccessRoutes($userObj, $instanceId)
    {
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'InstanceMaster');
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'ProjectAccessMaster');

        $arrprojectAccessMasters=array();
        $objProjectAccessMaster=array();

        $objProjectAccessMaster=$this->getHierarchyWiseUserAccess($userObj, $instanceId);
        
        $arrUserAccessRoute=array();

        foreach ($objProjectAccessMaster as $key => $value) {
            $route=trim($value->getAccessRouteName());
            if (empty($route)) {
                continue;
            }

            $tmpArrayUserAccessRoute=explode(",", $value->getAccessRouteName());
            $arrUserAccessRoute=array_merge($arrUserAccessRoute, $tmpArrayUserAccessRoute);
        }
        return $arrUserAccessRoute;
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for User have Access of Action
     * @return ClassInstance
    */
    public function getInstanceAccessRoutes($instanceId)
    {
        $cacheKey=RedisCacheService::generateKey($this->statsh_cache_wrapper,array('InstanceAccessRoutes',$instanceId),$this->moduleCachePrefix);
        $cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
        if($cacheData) {
            return $cacheData[0];
        }
        
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'InstanceMaster');
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'ProjectAccessMaster');

        $arrprojectAccessMasters=array();
        $objProjectAccessMaster=array();
        
        $userObj=null;
        // We need to generate Only Instance Access
        $objProjectAccessMaster=$this->getHierarchyWiseUserAccess($userObj=null, $instanceId);
        
        $arrInstanceAccessRoute=array();

        foreach ($objProjectAccessMaster as $key => $value) {
            $route=trim($value->getAccessRouteName());
            if (empty($route)) {
                continue;
            }

            $tmpArrayUserAccessRoute=explode(",", $value->getAccessRouteName());
            $arrInstanceAccessRoute=array_merge($arrInstanceAccessRoute, $tmpArrayUserAccessRoute);
        }
        
        RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$arrInstanceAccessRoute);
        
        return $arrInstanceAccessRoute;
    }

    private function getHierarchyWiseUserAccess($userObj, $instanceId)
    {
        $objProjectAccessMaster=array();
        $currentUser=$userObj;
        // Get Current
        if (!empty($currentUser)) {
            $objProjectAccessMaster=$this->getParentProjectAccessMasterDataByUserId($currentUser);
        }

        // Get Current Or Parent User Access
        if (count($objProjectAccessMaster)==0 && !empty($currentUser) && method_exists($currentUser, 'getParent') && !empty($currentUser->getParent())) {
            $objProjectAccessMaster=$this->getParentProjectAccessMasterDataByUserId($currentUser->getParent());
        }

        // Get Current Instance Or Parent Instance Access
        if (count($objProjectAccessMaster)==0 && !empty($instanceId)) {
            $objProjectAccessMaster=$this->getProjectAccessMasterDataByInstanceId($instanceId);
        }

        if (count($objProjectAccessMaster)==0) {
            $mainInstanceObj=$this->getMainInstanceMasterObject();
            $objProjectAccessMaster=$this->getProjectAccessMasterDataByInstanceId($mainInstanceObj->getId());
        }
        
        return $objProjectAccessMaster;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for User have Access of Action
     * @return ClassInstance
    */
    public function getProjectMasterAccessWiseUserAccess($userObj, $instanceId)
    {
        $cacheKey=RedisCacheService::generateKey($this->statsh_cache_wrapper,array('ProjectMasterAccessWiseUserAccess',$instanceId,($userObj)?$userObj->getId():0),$this->moduleCachePrefix);
        $cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
        if($cacheData) {
            return $cacheData;
        }
        
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'InstanceMaster');
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'ProjectAccessMaster');

        $arrUserAccessIds=array();
        $allProjectMaster=array();
        $objProjectAccessMaster=array();

        $objProjectAccessMaster=$this->getHierarchyWiseUserAccess($userObj, $instanceId);
        
        $arrUserAccessRoute=array();
        
        foreach ($objProjectAccessMaster as $key => $value) {
            $arrUserAccessIds[$value->getId()]=$value->getId();
        }
        $allProjectMaster=$this->getProjectAccessMasterData();
        $allProjectMaster=self::getProjectSettingThreaedProejctAccessMaster($allProjectMaster, 0, $arrUserAccessIds);
        
        RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$allProjectMaster);
        
        return $allProjectMaster;
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Threaed Proejct Access Master
     * returns Project Access Master Object Array
     * @return ClassInstance
    */
    public static function getProjectSettingThreaedProejctAccessMaster(&$elements, $parent=0, $arrUserAccessIds=array())
    {
        $projectAccessMaster = array();
        foreach ($elements as $key=>$element) {
            $elementParentValue=!empty($element->getParent())?$element->getParent()->getId():null;
            
            if ($elementParentValue==$parent) {
                $status=0;
                if (in_array($element->getId(), $arrUserAccessIds)) {
                    $status=1;
                }
                $projectAccessMaster[$element->getAccessName()]=array('status'=>$status);
                $children=self::getProjectSettingThreaedProejctAccessMaster($elements, $element->getId(), $arrUserAccessIds);
                if ($children) {
                    $projectAccessMaster[$element->getAccessName()]['option']= $children;
                }
                unset($elements[$key]);
            }
        }
        
        return $projectAccessMaster;
    }
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for User have Access of Action
     * @return ClassInstance
    */
    public function getProjectMasterAccessWiseInstance($instanceId)
    {
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for User have Access of Action
     * @return ClassInstance
    */
    public function getProjectMasterConfigurations()
    {
        $cacheKey=RedisCacheService::generateKey($this->statsh_cache_wrapper,array('ProjectMasterConfigurations',$this->instance_id),$this->moduleCachePrefix);
        $cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
        if($cacheData) {
            return $cacheData;
        }
        
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'ProjectConfigurationMaster');
        $arrUserAccessIds=array();
        $allProjectMaster=array();
        $objProjectAccessMaster=array();

        $objProjectAccessMaster=$this->getAllConfigurationMasterData();
        
        if (count($objProjectAccessMaster>0)) {
            $masterConfigurations=array();
            foreach ($objProjectAccessMaster as $key => $value) {
                $configuration= (array) json_decode($value->getSettings(), true);
                if (!empty($configuration) && is_array($configuration)) {
                    $masterConfigurations=array_merge($masterConfigurations, $configuration);
                }
            }
        }
        
        RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$masterConfigurations);
        
        return $masterConfigurations;
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for User have Access of Action
     * @return ClassInstance
    */
    public function getInatanceConfigurations()
    {
        $cacheKey=RedisCacheService::generateKey($this->statsh_cache_wrapper,array('InatanceConfigurations',$this->instance_id),$this->moduleCachePrefix);
        $cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
        if($cacheData) {
            return $cacheData;
        }
        
        $this->setAccessManagementRepository('OfficeBrainAccessManagementBundle', 'InstanceConfiguration');
        $arrUserAccessIds=array();
        $allProjectMaster=array();
        $objProjectAccessMaster=array();

        $objProjectAccessMaster=$this->getAllConfigurationInstanceData();
        
        if (count($objProjectAccessMaster>0)) {
            $masterConfigurations=array();
            foreach ($objProjectAccessMaster as $key => $value) {
                $configuration= (array) json_decode($value->getSettings(), true);
                if (!empty($configuration) && is_array($configuration)) {
                    $masterConfigurations=array_merge($masterConfigurations, $configuration);
                }
            }
        }
        RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$masterConfigurations);
        
        return $masterConfigurations;
    }
    
    public function saveAccessData($request)
    {
        // this is simple save Access Data Method which Override Site Extened Class
    }
    
    public function insertAccessMasterList()
    {
        /* Project Access Rules Start */
        $search_access_rule = (array) json_decode('{"search":{"status":1, "option":{"search_by_name": {"status":1}, "search_by_sku": {"status":1}, "search_by_category": {"status":1}, "search_by_brand_name": {"status":0}, "search_by_supplier_name": {"status":1}, "advance_search":{"status": 1 , "option":{"advance_search": {"status":1}, "advance_recent_search": {"status":1}, "advance_brand_name": {"status":1}, "advance_category": {"status":1}, "advance_min_price": {"status":1}, "advance_max_price": {"status":1}, "advance_qty": {"status":1}, "advance_currency": {"status":1}, "advance_price_valid_up_to": {"status":1}, "advance_catalog_year": {"status":1}, "advance_supplier_name": {"status":1} }}, "search_filter":{"status": 1 ,  "option":{"filter_color": {"status":1}, "filter_master_color": {"status":1}, "filter_master_color_type": {"status":1}, "filter_actual_color": {"status":1}, "filter_price": {"status":1}, "filter_brand": {"status":1}, "filter_attributes": {"status":1}, "filter_tags": {"status":1}, "filter_category": {"status":1}, "filter_rating": {"status":1}, "filter_supplier": {"status":1}, "filter_currency": {"status":1}, "filter_quantity": {"status":1} }}, "search_sort":{"status": 1 ,  "option":{"sorting_price": {"status":1}, "sorting_name": {"status":1}, "sorting_rating": {"status":1}, "sorting_currency": {"status":1}, "sorting_supplier_name": {"status":1}, "sorting_relevance": {"status":1}, "sorting_country": {"status":1}, "sorting_new_arrival": {"status":1}, "sorting_sku": {"status":1}}} }}}', true);
        $transaction_access_rule =(array) json_decode('{"transaction":{"status":1,"option":{"quote":{"status":1,"option":{"add_custom_product":{"status":1},"search":{"status":1},"search_filter":{"status":1}}},"compare_product":{"status":1},"request_quote":{"status":1},"wish_list":{"status":1},"quick_quote":{"status":1},"shopping_cart":{"status":1},"request_info":{"status":1},"manage_order":{"status":1,"option":{"re_order":{"status":1},"copy_order":{"status":1}}}}}}', true);
        $user_access_rule = (array) json_decode('{"user":{"status":1,"option":{"user":{"status":1,"option":{"button_add_user":{"status":1,"option":{"button_add_supplier":{"status":1},"button_add_distributor":{"status":1},"button_add_enduser":{"status":1}}},"button_access_user":{"status":1},"button_conatct_book":{"status":1},"button_view_user":{"status":1,"option":{"button_edit_user":{"status":1},"button_change_sub_user_password":{"status":1},"button_search_user":{"status":1},"button_deactivate_user":{"status":1}}}}},"contact_book":{"status":1,"option":{"button_add_contact_book":{"status":1},"button_view_contact_book":{"status":1,"option":{"button_edit_contact_book":{"status":1},"button_search_contact_book":{"status":1},"button_deactivate_contact_book":{"status":1}}}}},"company":{"status":1,"option":{"button_add_company":{"status":1},"button_view_company":{"status":1,"option":{"button_edit_company":{"status":1},"button_search_company":{"status":1},"button_deactivate_company":{"status":1},"button_employee":{"status":1},"button_branch":{"status":1}}}}},"branch":{"status":1,"option":{"button_add_branch":{"status":1},"button_view_branch":{"status":1,"option":{"button_edit_branch":{"status":1},"button_search_branch":{"status":1},"button_deactivate_branch":{"status":1},"button_employee":{"status":1}}}}},"company_employee":{"status":1,"option":{"button_add_employee":{"status":1},"button_view_employee":{"status":1,"option":{"button_edit_employee":{"status":1},"button_search_employee":{"status":1},"button_deactivate_employee":{"status":1}}}}},"branch_employee":{"status":1,"option":{"button_add_employee":{"status":1},"button_view_employee":{"status":1,"option":{"button_edit_employee":{"status":1},"button_search_employee":{"status":1},"button_deactivate_employee":{"status":1}}}}},"service_group":{"status":1,"option":{"button_add_service_group":{"status":1},"button_view_service_group":{"status":1,"option":{"button_edit_service_group":{"status":1},"button_search_service_group":{"status":1},"button_deactivate_service_group":{"status":1}}}}},"address_book":{"status":1,"option":{"button_add_address_book":{"status":1},"button_view_address_book":{"status":1,"option":{"button_edit_address_book":{"status":1},"button_search_address_book":{"status":1},"button_deactivate_address_book":{"status":1}}}}}}}}', true);
        //$site_management_access_rule = (array) json_decode('{"site_management":{"status":1,"option":{"feedback":{"status":1,"option":{"admin_feedback":{"status":1,"option":{"list":{"status":1},"view":{"status":1},"delete":{"status":1}}},"myaccount_feedback_list":{"status":1,"option":{"add":{"status":1},"list":{"status":1},"view":{"status":1}}}}},"site_feedback":{"status":1},"banner":{"status":1,"option":{"banner_type":{"status":1,"option":{"banner_type_list":{"status":1},"banner_type_add_edit":{"status":1},"banner_delete":{"status":1}}},"banner":{"status":1,"option":{"banner_list":{"status":1},"banner_add_edit":{"status":1},"banner_preview":{"status":1},"banner_delete":{"status":1}}}}},"sub_shop":{"status":1,"option":{"sub_shop_instance":{"status":1,"option":{"sub_shop_list":{"status":1},"sub_shop_add":{"status":1},"sub_shop_edit":{"status":1},"sub_shop_delete":{"status":1},"sub_shop_search":{"status":1},"sub_shop_design":{"status":1},"sub_shop_setting":{"status":1}}},"sub_shop_theme":{"status":1,"option":{"sub_shop_theme_list":{"status":1},"sub_shop_theme_add":{"status":1},"sub_shop_theme_edit":{"status":1},"sub_shop_theme_delete":{"status":1},"sub_shop_theme_search":{"status":1}}},"sub_shop_inquiry":{"status":1,"option":{"sub_shop_inquiry_add":{"status":1},"sub_shop_inquiry_list":{"status":1},"sub_shop_inquiry_approve":{"status":1},"sub_shop_inquiry_reject":{"status":1},"sub_shop_inquiry_onhold":{"status":1},"sub_shop_inquiry_delete":{"status":1},"sub_shop_inquiry_search":{"status":1},"sub_shop_inquiry_view":{"status":1}}}}},"email":{"status":1,"option":{"event":{"status":1,"option":{"event_list":{"status":1},"event_add":{"status":1},"event_edit":{"status":1},"event_delete":{"status":1}}},"template":{"status":1,"option":{"template_list":{"status":1},"template_add":{"status":1},"template_edit":{"status":1},"template_delete":{"status":1},"template_preview":{"status":1},"template_search":{"status":1}}},"template_header":{"status":1,"option":{"header_list":{"status":1},"header_add":{"status":1},"header_edit":{"status":1},"header_delete":{"status":1}}},"view_sent_emails":{"status":1,"option":{"resend_email":{"status":1},"search_by_emai_id":{"status":1},"search_by_date":{"status":1},"search_by_customer_name":{"status":1}}},"export_user":{"status":1,"option":{"registered_user":{"status":1},"subscribed_user":{"status":1}}}}},"cms":{"status":1,"option":{"search_criteria":{"status":1,"option":{"search_criteria_list":{"status":1},"search_criteria_add_edit":{"status":1},"search_criteria_delete":{"status":1}}},"media_library":{"status":1,"option":{"list":{"status":1},"add":{"status":1},"delete":{"status":1},"download":{"status":1}}},"menu":{"status":1,"option":{"add":{"status":1},"edit":{"status":1},"delete":{"status":1}}}}}}}}', true);
        $site_management_access_rule = (array) json_decode('{"site_management":{"status":1,"option":{"feedback":{"status":1,"option":{"admin_feedback":{"status":1,"option":{"list":{"status":1},"view":{"status":1},"delete":{"status":1}}},"myaccount_feedback_list":{"status":1,"option":{"add":{"status":1},"list":{"status":1},"view":{"status":1}}}}},"site_feedback":{"status":1},"banner":{"status":1,"option":{"banner_type":{"status":1,"option":{"banner_type_list":{"status":1},"banner_type_add_edit":{"status":1},"banner_delete":{"status":1}}},"banner":{"status":1,"option":{"banner_list":{"status":1},"banner_add_edit":{"status":1},"banner_preview":{"status":1},"banner_delete":{"status":1}}}}},"sub_shop":{"status":1,"option":{"sub_shop_instance":{"status":1,"option":{"sub_shop_list":{"status":1},"sub_shop_add":{"status":1},"sub_shop_edit":{"status":1},"sub_shop_delete":{"status":1},"sub_shop_search":{"status":1},"sub_shop_design":{"status":1},"sub_shop_setting":{"status":1}}},"sub_shop_theme":{"status":1,"option":{"sub_shop_theme_list":{"status":1},"sub_shop_theme_add":{"status":1},"sub_shop_theme_edit":{"status":1},"sub_shop_theme_delete":{"status":1},"sub_shop_theme_search":{"status":1}}},"sub_shop_inquiry":{"status":1,"option":{"sub_shop_inquiry_add":{"status":1},"sub_shop_inquiry_list":{"status":1},"sub_shop_inquiry_approve":{"status":1},"sub_shop_inquiry_reject":{"status":1},"sub_shop_inquiry_onhold":{"status":1},"sub_shop_inquiry_delete":{"status":1},"sub_shop_inquiry_search":{"status":1},"sub_shop_inquiry_view":{"status":1}}}}},"email":{"status":1,"option":{"event":{"status":1,"option":{"event_list":{"status":1},"event_add":{"status":1},"event_edit":{"status":1},"event_delete":{"status":1}}},"template":{"status":1,"option":{"template_list":{"status":1},"template_add":{"status":1},"template_edit":{"status":1},"template_delete":{"status":1},"template_preview":{"status":1},"template_search":{"status":1}}},"template_header":{"status":1,"option":{"header_list":{"status":1},"header_add":{"status":1},"header_edit":{"status":1},"header_delete":{"status":1}}},"view_sent_emails":{"status":1,"option":{"resend_email":{"status":1},"search_by_emai_id":{"status":1},"search_by_date":{"status":1},"search_by_customer_name":{"status":1}}},"export_user":{"status":1,"option":{"registered_user":{"status":1},"subscribed_user":{"status":1}}}}},"cms":{"status":1,"option":{"third_party_setting":{"status":1,"option":{"payment":{"status":1},"shipment":{"status":1}}},"search_criteria":{"status":1,"option":{"search_criteria_list":{"status":1},"search_criteria_add_edit":{"status":1},"search_criteria_delete":{"status":1}}},"media_library":{"status":1,"option":{"list":{"status":1},"add":{"status":1},"delete":{"status":1},"download":{"status":1}}},"menu":{"status":1,"option":{"add":{"status":1},"edit":{"status":1},"delete":{"status":1}}}}}}}}', true);
        $promo_discount_access_rule = (array) json_decode('{"promo_discount":{"status":1,"option":{"markup":{"status":1,"option":{"markup_list":{"status":1},"markup_view":{"status":1},"markup_delete":{"status":1},"markup_add":{"status":1,"option":{"markup_on_category":{"status":1},"markup_on_product":{"status":1}}},"markup_edit":{"status":1,"option":{"markup_on_category":{"status":1},"markup_on_product":{"status":1}}}}},"discount":{"status":1,"option":{"discount_list":{"status":1},"discount_view":{"status":1},"discount_delete":{"status":1},"discount_add":{"status":1,"option":{"discount_on_category":{"status":1},"discount_on_product":{"status":1}}},"discount_edit":{"status":1,"option":{"discount_on_category":{"status":1},"discount_on_product":{"status":1}}}}},"product_tag_private":{"status":1,"option":{"product_tag_private_list":{"status":1},"product_tag_private_view":{"status":1},"product_tag_private_delete":{"status":1},"product_tag_private_add":{"status":1,"option":{"product_tag_private_on_product":{"status":1}}},"product_tag_private_edit":{"status":1,"option":{"product_tag_private_on_product":{"status":1}}}}},"product_tag_public":{"status":1,"option":{"product_tag_public_list":{"status":1},"product_tag_public_view":{"status":1},"product_tag_public_delete":{"status":1},"product_tag_public_add":{"status":1,"option":{"product_tag_public_on_product":{"status":1}}},"product_tag_public_edit":{"status":1,"option":{"product_tag_public_on_product":{"status":1}}}}},"service":{"status":1,"option":{"service_list":{"status":1},"service_view":{"status":1},"service_add":{"status":1},"service_edit":{"status":1},"service_delete":{"status":1}}},"service_discount":{"status":1,"option":{"service_discount_list":{"status":1},"service_discount_view":{"status":1},"service_discount_add":{"status":1},"service_discount_edit":{"status":1},"service_discount_delete":{"status":1}}},"rule_master":{"status":1,"option":{"rule_master_list":{"status":1},"rule_master_view":{"status":1},"rule_master_add":{"status":1},"rule_master_edit":{"status":1},"rule_master_delete":{"status":1}}},"rule_mapping":{"status":1,"option":{"rule_mapping_list":{"status":1},"rule_mapping_view":{"status":1},"rule_mapping_add":{"status":1},"rule_mapping_edit":{"status":1},"rule_mapping_delete":{"status":1}}},"coupon":{"status":1,"option":{"coupon_list":{"status":"1"},"coupon_view":{"status":"1"},"coupon_add":{"status":"1","option":{"coupon_on_category":{"status":1},"coupon_on_product":{"status":1}}},"coupon_edit":{"status":"1","option":{"coupon_on_category":{"status":1},"coupon_on_product":{"status":1}}},"coupon_delete":{"status":1,"option":[]}}},"reward_referral":{"status":1,"option":{"reward_point_by_referral":{"status":1,"option":{"reward_point_by_referral_edit":{"status":1}}}}},"flyer":{"status":1,"option":{"flyer_list":{"status":1},"flyer_add_edit":{"status":1},"flyer_delete":{"status":1},"flyer_view":{"status":1}}},"ecatalogue":{"status":1,"option":{"button_add_ecatalogue":{"status":1},"ecatalogue_add":{"status":1},"ecatalogue_list":{"status":1},"button_view_ecatalogue":{"status":1},"button_make_copy_ecatalogue":{"status":1},"search_ecatalogue":{"status":1,"option":{"search_keyword":{"status":1},"search_supplier":{"status":1}}},"prioritize_ecatalogue":{"status":1},"button_edit_ecatalogue":{"status":1},"button_delete_ecatalogue":{"status":1}}},"prioritize_supplier":{"status":1,"option":{"search":{"status":1},"move_up":{"status":1},"move_down":{"status":1},"move_top":{"status":1},"move_bottom":{"status":1}}}}}}', true);
        $virtual_access_rule = (array) json_decode('{"virtual":{"status":1,"option":{"logo_everything":{"status":1}}}}', true);
        $product_management_access_rule = (array) json_decode('{"product_management":{"status":1,"option":{"category":{"status":1,"option":{"add":{"status":1},"edit":{"status":1},"delete":{"status":1},"country_status":{"status":1}}},"brand":{"status":1,"option":{"add":{"status":1}}},"attribute":{"status":1,"option":{"add":{"status":1},"add_value":{"status":1}}},"product":{"status":1,"option":{"add":{"status":1},"edit":{"status":1},"delete":{"status":1},"view":{"status":1},"update_status":{"status":1}}}}}}', true);
        $report_access_rule = (array) json_decode('{"report":{"status":1,"option":{"admin_report":{"status":1,"option":{"visitor":{"status":1},"action":{"status":1},"site_search":{"status":1},"ecommerce":{"status":1}}}}}}', true);
        
        $access_rule = array_merge($search_access_rule, $transaction_access_rule, $user_access_rule, $site_management_access_rule, $promo_discount_access_rule, $virtual_access_rule, $product_management_access_rule, $report_access_rule);
        //echo json_encode($access_rule);exit;
        //$access_rule=(array) json_decode('{"search":{"status":1,"option":{"search_by_name":{"status":1},"search_by_sku":{"status":1},"search_by_category":{"status":1},"search_by_brand_name":{"status":0},"search_by_supplier_name":{"status":1},"advance_search":{"status":1,"option":{"advance_search":{"status":1},"advance_recent_search":{"status":1},"advance_brand_name":{"status":1},"advance_category":{"status":1},"advance_min_price":{"status":1},"advance_max_price":{"status":1},"advance_qty":{"status":1},"advance_currency":{"status":1},"advance_price_valid_up_to":{"status":1},"advance_catalog_year":{"status":1},"advance_supplier_name":{"status":1}}},"search_filter":{"status":1,"option":{"filter_color":{"status":1},"filter_master_color":{"status":1},"filter_master_color_type":{"status":1},"filter_actual_color":{"status":1},"filter_price":{"status":1},"filter_brand":{"status":1},"filter_attributes":{"status":1},"filter_tags":{"status":1},"filter_category":{"status":1},"filter_rating":{"status":1},"filter_supplier":{"status":1},"filter_currency":{"status":1},"filter_quantity":{"status":1}}},"search_sort":{"status":1,"option":{"sorting_price":{"status":1},"sorting_name":{"status":1},"sorting_rating":{"status":1},"sorting_currency":{"status":1},"sorting_supplier_name":{"status":1},"sorting_relevance":{"status":1},"sorting_country":{"status":1},"sorting_new_arrival":{"status":1},"sorting_sku":{"status":1}}}}},"transaction":{"status":1,"option":{"quote":{"status":1,"option":{"add_custom_product":{"status":1},"search":{"status":1},"search_filter":{"status":1}}},"compare_product":{"status":1},"wish_list":{"status":1},"quick_quote":{"status":1},"shopping_cart":{"status":1},"request_info":{"status":1},"manage_order":{"status":1,"option":{"re_order":{"status":1},"copy_order":{"status":1}}}}},"user":{"status":1,"option":{"user":{"status":1,"option":{"button_add_user":{"status":1,"option":{"button_add_supplier":{"status":1},"button_add_distributor":{"status":1},"button_add_enduser":{"status":1}}},"button_access_user":{"status":1},"button_conatct_book":{"status":1},"button_view_user":{"status":1,"option":{"button_edit_user":{"status":1},"button_change_sub_user_password":{"status":1},"button_search_user":{"status":1},"button_deactivate_user":{"status":1}}}}},"contact_book":{"status":1,"option":{"button_add_contact_book":{"status":1},"button_view_contact_book":{"status":1,"option":{"button_edit_contact_book":{"status":1},"button_search_contact_book":{"status":1},"button_deactivate_contact_book":{"status":1}}}}},"company":{"status":1,"option":{"button_add_company":{"status":1},"button_view_company":{"status":1,"option":{"button_edit_company":{"status":1},"button_search_company":{"status":1},"button_deactivate_company":{"status":1},"button_employee":{"status":1},"button_branch":{"status":1}}}}},"branch":{"status":1,"option":{"button_add_branch":{"status":1},"button_view_branch":{"status":1,"option":{"button_edit_branch":{"status":1},"button_search_branch":{"status":1},"button_deactivate_branch":{"status":1},"button_employee":{"status":1}}}}},"company_employee":{"status":1,"option":{"button_add_employee":{"status":1},"button_view_employee":{"status":1,"option":{"button_edit_employee":{"status":1},"button_search_employee":{"status":1},"button_deactivate_employee":{"status":1}}}}},"branch_employee":{"status":1,"option":{"button_add_employee":{"status":1},"button_view_employee":{"status":1,"option":{"button_edit_employee":{"status":1},"button_search_employee":{"status":1},"button_deactivate_employee":{"status":1}}}}},"service_group":{"status":1,"option":{"button_add_service_group":{"status":1},"button_view_service_group":{"status":1,"option":{"button_edit_service_group":{"status":1},"button_search_service_group":{"status":1},"button_deactivate_service_group":{"status":1}}}}},"address_book":{"status":1,"option":{"button_add_address_book":{"status":1},"button_view_address_book":{"status":1,"option":{"button_edit_address_book":{"status":1},"button_search_address_book":{"status":1},"button_deactivate_address_book":{"status":1}}}}}}},"site_management":{"status":1,"option":{"feedback":{"status":1,"option":{"admin_feedback":{"status":1,"option":{"list":{"status":1},"view":{"status":1},"delete":{"status":1}}},"myaccount_feedback_list":{"status":1,"option":{"add":{"status":1},"list":{"status":1},"view":{"status":1}}}}},"banner":{"status":1,"option":{"banner_type":{"status":1,"option":{"banner_type_list":{"status":1},"banner_type_add_edit":{"status":1},"banner_delete":{"status":1}}},"banner":{"status":1,"option":{"banner_list":{"status":1},"banner_add_edit":{"status":1},"banner_preview":{"status":1},"banner_delete":{"status":1}}}}},"sub_shop":{"status":1,"option":{"sub_shop_instance":{"status":1,"option":{"sub_shop_list":{"status":1},"sub_shop_add":{"status":1},"sub_shop_edit":{"status":1},"sub_shop_delete":{"status":1},"sub_shop_search":{"status":1},"sub_shop_design":{"status":1},"sub_shop_setting":{"status":1}}},"sub_shop_theme":{"status":1,"option":{"sub_shop_theme_list":{"status":1},"sub_shop_theme_add":{"status":1},"sub_shop_theme_edit":{"status":1},"sub_shop_theme_delete":{"status":1},"sub_shop_theme_search":{"status":1}}},"sub_shop_inquiry":{"status":1,"option":{"sub_shop_inquiry_add":{"status":1},"sub_shop_inquiry_list":{"status":1},"sub_shop_inquiry_approve":{"status":1},"sub_shop_inquiry_reject":{"status":1},"sub_shop_inquiry_onhold":{"status":1},"sub_shop_inquiry_delete":{"status":1},"sub_shop_inquiry_search":{"status":1},"sub_shop_inquiry_view":{"status":1}}}}},"email":{"status":1,"option":{"event":{"status":1,"option":{"event_list":{"status":1},"event_add":{"status":1},"event_edit":{"status":1},"event_delete":{"status":1}}},"template":{"status":1,"option":{"template_list":{"status":1},"template_add":{"status":1},"template_edit":{"status":1},"template_delete":{"status":1},"template_preview":{"status":1},"template_search":{"status":1}}},"template_header":{"status":1,"option":{"header_list":{"status":1},"header_add":{"status":1},"header_edit":{"status":1},"header_delete":{"status":1}}},"view_sent_emails":{"status":1,"option":{"resend_email":{"status":1},"search_by_emai_id":{"status":1},"search_by_date":{"status":1},"search_by_customer_name":{"status":1}}},"export_user":{"status":1,"option":{"registered_user":{"status":1},"subscribed_user":{"status":1}}}}},"cms":{"status":1,"option":{"search_criteria":{"status":1,"option":{"search_criteria_list":{"status":1},"search_criteria_add_edit":{"status":1},"search_criteria_delete":{"status":1}}},"media_library":{"status":1,"option":{"list":{"status":1},"add":{"status":1},"delete":{"status":1},"download":{"status":1}}},"menu":{"status":1,"option":{"add":{"status":1},"edit":{"status":1},"delete":{"status":1}}}}}}},"promo_discount":{"status":1,"option":{"markup":{"status":1,"option":{"markup_list":{"status":1},"markup_view":{"status":1},"markup_delete":{"status":1},"markup_add":{"status":1,"option":{"markup_on_category":{"status":1},"markup_on_product":{"status":1}}},"markup_edit":{"status":1,"option":{"markup_on_category":{"status":1},"markup_on_product":{"status":1}}}}},"discount":{"status":1,"option":{"discount_list":{"status":1},"discount_view":{"status":1},"discount_delete":{"status":1},"discount_add":{"status":1,"option":{"discount_on_category":{"status":1},"discount_on_product":{"status":1}}},"discount_edit":{"status":1,"option":{"discount_on_category":{"status":1},"discount_on_product":{"status":1}}}}},"product_tag_private":{"status":1,"option":{"product_tag_private_list":{"status":1},"product_tag_private_view":{"status":1},"product_tag_private_delete":{"status":1},"product_tag_private_add":{"status":1,"option":{"product_tag_private_on_product":{"status":1}}},"product_tag_private_edit":{"status":1,"option":{"product_tag_private_on_product":{"status":1}}}}},"product_tag_public":{"status":1,"option":{"product_tag_public_list":{"status":1},"product_tag_public_view":{"status":1},"product_tag_public_delete":{"status":1},"product_tag_public_add":{"status":1,"option":{"product_tag_public_on_product":{"status":1}}},"product_tag_public_edit":{"status":1,"option":{"product_tag_public_on_product":{"status":1}}}}},"service":{"status":1,"option":{"service_list":{"status":1},"service_view":{"status":1},"service_add":{"status":1},"service_edit":{"status":1},"service_delete":{"status":1}}},"service_discount":{"status":1,"option":{"service_discount_list":{"status":1},"service_discount_view":{"status":1},"service_discount_add":{"status":1},"service_discount_edit":{"status":1},"service_discount_delete":{"status":1}}},"rule_master":{"status":1,"option":{"rule_master_list":{"status":1},"rule_master_view":{"status":1},"rule_master_add":{"status":1},"rule_master_edit":{"status":1},"rule_master_delete":{"status":1}}},"rule_mapping":{"status":1,"option":{"rule_mapping_list":{"status":1},"rule_mapping_view":{"status":1},"rule_mapping_add":{"status":1},"rule_mapping_edit":{"status":1},"rule_mapping_delete":{"status":1}}},"coupon":{"status":1,"option":{"coupon_list":{"status":"1"},"coupon_view":{"status":"1"},"coupon_add":{"status":"1","option":{"coupon_on_category":{"status":1},"coupon_on_product":{"status":1}}},"coupon_edit":{"status":"1","option":{"coupon_on_category":{"status":1},"coupon_on_product":{"status":1}}},"coupon_delete":{"status":1,"option":[]}}},"reward_referral":{"status":1,"option":{"reward_point_by_referral":{"status":1,"option":{"reward_point_by_referral_edit":{"status":1}}}}},"flyer":{"status":1,"option":{"flyer_list":{"status":1},"flyer_add_edit":{"status":1},"flyer_delete":{"status":1},"flyer_view":{"status":1}}},"ecatalogue":{"status":1,"option":{"button_add_ecatalogue":{"status":1},"ecatalogue_add":{"status":1},"ecatalogue_list":{"status":1},"button_view_ecatalogue":{"status":1},"button_make_copy_ecatalogue":{"status":1},"search_ecatalogue":{"status":1,"option":{"search_keyword":{"status":1},"search_supplier":{"status":1}}},"button_edit_ecatalogue":{"status":1},"button_delete_ecatalogue":{"status":1}}}}},"virtual":{"status":1,"option":{"logo_everything":{"status":1}}}}',true);
        /* Project Access Rules End */
        
        $getProjectAccessMasterRepo=$this->getProjectAccessMasterRepo();
        $maxId=$getProjectAccessMasterRepo->getMaxIdfromAccessMaster();
        if (empty($maxId)) {
            $arrAccessMaster=array();
            $maxId=1;
            self::readThreadedAccessMasterJSonData($access_rule, $maxId, $arrAccessMaster, $parentId=0);
            foreach ($arrAccessMaster as $key => $value) {
                $getProjectAccessMasterParent=null;
                if (!empty($value['parent_id'])) {
                    $getProjectAccessMasterParent=$getProjectAccessMasterRepo->getProjectAccessMasterDataById($value['parent_id']);
                }
                $getProjectAccessMaster=$this->getProjectAccessMaster();
                $getProjectAccessMaster->setId($value['id']);
                $getProjectAccessMaster->setAccessName($value['name']);
                $getProjectAccessMaster->setParent($getProjectAccessMasterParent);
                $this->entityManager->persist($getProjectAccessMaster);
                $this->entityManager->flush();
            }
        }
        exit;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get Threaed Proejct Access Master
     * returns Project Access Master Object Array
     * @return ClassInstance
    */
    public static function readThreadedAccessMasterJSonData($elements, &$maxId, &$arrAccessMaster, $parentId=0)
    {
        foreach ($elements as $key=>$element) {
            $arrAccessMaster[]=array('id'=>$maxId,'name'=>$key,'parent_id'=>$parentId);
            $maxId++;
            if (isset($element['option']) && is_array($element['option'])) {
                self::readThreadedAccessMasterJSonData($element['option'], $maxId, $arrAccessMaster, $maxId-1);
            }
        }
    }
}
