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

use OfficeBrain\Bundle\AccessManagementBundle\Manager\Extended\AccessManagementExtended;
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 SiteAccessManagementExtended extends AccessManagementExtended
{
    public function __construct($entityManager, $request, $session,$sitemapManager, $formManager)
    {
        parent::__construct($entityManager, $request, $session, $formManager);
        $this->setSiteAccessRepositories();
        $this->sitemapManager=$sitemapManager;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for save Site Access Data
     * @return ClassInstance
    */
    public function saveAccessData($request)
    {
        $postData=$request->get('officebrain_bundle_accessmanagementbundle_instanceaccessmapping');
        $errors=array();
        
        if ((!$this->isMainSiteAccessExists() || empty($this->project_user_setting['user_data']->getParent()))) {
            $objProjectAccessMaster=array();
            if (!empty($postData['access'])) {
                $objProjectAccessMaster=$this->getProjectAccessMasterDataByIds($postData['access']);
            }
            $arrInstance=array($postData['instance']);
            $objInstanceMaster=$this->getInstanceMasterByIds($arrInstance);
            $objInstanceMaster=$objInstanceMaster[0];
            $oldInstanceAccessMapping=$this->getInstanceAccessMappingByInstanceId($objInstanceMaster);
            $this->deleteInstanceAccessMappingByInstanceId($objInstanceMaster);
            //print_r($objInstanceMaster[0]->getDomain());
            if (count($errors)==0) {
                foreach ($objProjectAccessMaster as $key => $value) {
                    $objInstanceAccessMapping=$this->getInstanceAccessMapping();
                    $objInstanceAccessMapping->setInstance($objInstanceMaster);
                    $objInstanceAccessMapping->setInstanceType($objInstanceMaster->getInstanceType());
                    $objInstanceAccessMapping->setAccess($value);
                    $objInstanceAccessMapping->setAccessValue(1);
                    $objInstanceAccessMapping->setCreatedAt(new \DateTime("now"));
                    $this->entityManager->persist($objInstanceAccessMapping);
                }
                $this->entityManager->flush();
                
                $this->revokeInstanceANDUserInstanceAccessMapping($oldInstanceAccessMapping, $objProjectAccessMaster);
                $this->sitemapManager->setRoutesInfo($objInstanceMaster->getId());
                if(RedisCacheService::isCacheEnable())
                {
                  // Remove Cache
                  $cacheKey1 = $this->moduleCachePrefix.$this->statsh_cache_wrapper->createKey(array('ProjectMasterAccessWiseUserAccess'));
                  $cacheKey = $this->moduleCachePrefix.$this->statsh_cache_wrapper->createKey(array('InstanceAccessRoutes'));
                  $this->statsh_cache_wrapper->removeChildCacheOfProject($cacheKey);
                  $this->statsh_cache_wrapper->removeChildCacheOfProject($cacheKey1);
                }
                return true;
            }
        }

        return $errors;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for revoke Access of sub domain AND User Access Mapping
     * @return ClassInstance
    */
    public function revokeInstanceANDUserInstanceAccessMapping($oldInstanceAccessMapping, $newProjectAccessMaster)
    {
        $oldInstanceAccessMappingArr=array();
        $newInstanceAccessMappingArr=array();

        foreach ($oldInstanceAccessMapping as $key => $value) {
            $oldInstanceAccessMappingArr[$value->getAccess()->getId()]=$value->getAccess();
        }
        foreach ($newProjectAccessMaster as $key => $value) {
            $newInstanceAccessMappingArr[$value->getId()]=$value;
        }
        $arrRevokeAccess=array_diff_key($oldInstanceAccessMappingArr, $newInstanceAccessMappingArr);
        if (count($arrRevokeAccess)>0) {
            //Call User Revoke function
            $this->deleteAllSubInstanceAccessMapping($arrRevokeAccess);
            $this->deleteInstanceUserAccessMappingByAccessId($arrRevokeAccess);
        }
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for Form Create for Sub-site Access
     * @return ClassInstance
    */
    public function createForm($postStatus=null)
    {
        $data=array();
        $data['post_access']=array();
        if (!$this->isMainSiteAccessExists() || empty($this->getCurrentUserLoginObject()->getParent())) {
            $data['is_site_access_available'] = false;
            if (!empty($_POST)) {
                $postData=$this->request->get('officebrain_bundle_accessmanagementbundle_instanceaccessmapping');
                if (!empty($postData['access'])) {
                    $data['post_access']=array_fill_keys($postData['access'], 1) ;
                }
                $siteID=$postData['instance'];
            } else {
                $MainInstanceMasterObject=$this->getMainInstanceMasterObject();
                $siteID=$MainInstanceMasterObject->getId();
                $siteAccess=$this->getMainInstanceAccessMappingArrayByinstanceId();
                if (!empty($siteAccess)) {
                    $data['post_access']=array_fill_keys($siteAccess, 1) ;
                }
            }
            $arrProjectAccessMasters=$this->getProjectAccessMasterThreadedData();
            $data['project_access_master'] = $arrProjectAccessMasters;
            $objInstanceMaster[]=$this->getMainInstanceMasterObject();
            
            $objInstanceAccessMappingType=$this->getInstanceAccessMappingType($objInstanceMaster, $arrProjectAccessMasters, $siteID);
            $objInstanceAccessMapping=$this->getInstanceAccessMapping();
            $frmInstanceAccessMapping = $this->getFormManager()->create($objInstanceAccessMappingType, $objInstanceAccessMapping);
            $frmInstanceAccessMapping->handleRequest($this->request);
            $data['form_site_access'] = $frmInstanceAccessMapping->createView();
        } else {
            $data['is_site_access_available'] = true;
        }
        $data['route_name'] = 'office_brain_accessmanagementbundle_accessmanagement_set_site_access';
        return $data;
    }
}
