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

use OfficeBrain\Bundle\AccessManagementBundle\Manager\Extended\AccessManagementExtended;
use Symfony\Component\Form\FormError;

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

class SubSiteAccessManagementExtended 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 Sub Site Access Data
     * @return ClassInstance
    */
    public function saveAccessData($request)
    {
        $postData=$request->get('officebrain_bundle_accessmanagementbundle_instanceaccessmapping');
        $errors=array();
        if (!empty($postData['access']) && $this->isMainSiteAccessExists()) {
            $objProjectAccessMaster=$this->getSubDomianProjectAccessMasterDataByIds($postData['access']);
            
            // check for access
            if (count($postData['access'])!=count($objProjectAccessMaster)) {
                $errors['access']='Submited rights are not matched with assign rights.';
            }
            //Check Threaded Value proper selected or not
            if (!$this->validateThreaedValue($objProjectAccessMaster, $postData['access'])) {
                $errors['access']='Parent Value not selected.';
            }

            $arrInstance=array($postData['instance']);

            $objInstanceMaster=$this->getSubDomianInstanceMasterByIds($arrInstance);
            // check subdomian id
            if (count($objInstanceMaster)==0) {
                $errors['instance']='Please select valid subdomain.';
            }

            $objInstanceMaster=$objInstanceMaster[0];
            if (count($errors)==0) {
                $oldInstanceAccessMapping=$this->getInstanceAccessMappingByInstanceId($objInstanceMaster);
                $this->deleteInstanceAccessMappingByInstanceId($objInstanceMaster);
                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->entityManager->clear();
                $this->revokeUserInstanceAccessMapping($oldInstanceAccessMapping, $objProjectAccessMaster, $objInstanceMaster);
                $this->sitemapManager->setRoutesInfo($objInstanceMaster->getId());
                return true;
            }
        }
        return $errors;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for revoke User Instance Access Mapping
     * @return ClassInstance
    */
    public function revokeUserInstanceAccessMapping($oldInstanceAccessMapping, $newProjectAccessMaster, $objInstanceMaster)
    {
        $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)) {
            //Call User Revoke function
            $this->deleteInstanceUserAccessMappingByInstanceId($objInstanceMaster, $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();
        $siteid = $this->request->get('siteid', 0);
        if ($this->isMainSiteAccessExists()) {
            $data['is_site_access_available'] = false;
            /*if (!empty($_POST)) {
                $status=$this->saveAccessData($this->request);
                $postData=$this->request->get('officebrain_bundle_accessmanagementbundle_instanceaccessmapping');
                if (!empty($postData['access'])) {
                    $data['post_access']=array_fill_keys($postData['access'], 1) ;
                }
            } else {
            	if (!empty($siteid)) {
                    $siteAccess=$this->getInstanceAccessMappingArrayByinstanceId($siteid);
                    if (!empty($siteAccess)) {
                        $data['post_access']=array_fill_keys($siteAccess, 1) ;
                    }
                }
            }
            */
            
            if (!empty($siteid)) {
                $siteAccess=$this->getInstanceAccessMappingArrayByinstanceId($siteid);
                if (!empty($siteAccess)) {
                    $data['post_access']=array_fill_keys($siteAccess, 1) ;
                }
            }
            $arrProjectAccessMasters=$this->getSubDomainProjectAccessMasterThreadedData();
            //print_r($arrProjectAccessMasters);
            // Manual set proejct access master in Form.
            $data['project_access_master'] = $arrProjectAccessMasters;
            
            $objInstanceMaster=$this->getSubDomainInstanceMasterData();
            
            $objInstanceAccessMappingType=$this->getInstanceAccessMappingType($objInstanceMaster, $arrProjectAccessMasters, $siteid);
            $objInstanceAccessMapping=$this->getInstanceAccessMapping();
            
            $frmInstanceAccessMapping = $this->formManager->create($objInstanceAccessMappingType, $objInstanceAccessMapping);
            $frmInstanceAccessMapping->handleRequest($this->request);
            
            if (isset($postStatus) && $postStatus!==true) {
                foreach ($postStatus as $key => $value) {
                    $frmInstanceAccessMapping->get($key)->addError(new FormError($value));
                }
            }
            $data['form_site_access'] = $frmInstanceAccessMapping->createView();
        } else {
            $data['is_site_access_available'] = false;
        }
        $data['route_name'] = 'office_brain_accessmanagementbundle_accessmanagement_set_sub_site_access';
        return $data;
    }
    
    
    
    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - Assess Management
     * Function created to set sub site access rules from parent when new sub shop is created
     * @return ClassInstance
     */
    public function setSubSiteAccessRules($instanceId)
    {
        if (!empty($instanceId)) {
            $instanceMaster = $this->getInstanceMasterByIds(array($instanceId));
            
            foreach ($this->getMainSiteAccessRules() as $objs) {
                $objInstanceAccessMapping=$this->getInstanceAccessMapping();
                $objInstanceAccessMapping->setInstance($instanceMaster[0]);
                $objInstanceAccessMapping->setInstanceType('sub_shop');
                $objInstanceAccessMapping->setAccess($objs->getAccess());
                $objInstanceAccessMapping->setAccessValue(1);
                $objInstanceAccessMapping->setCreatedAt(new \DateTime("now"));
                $this->entityManager->persist($objInstanceAccessMapping);
            }
            $this->entityManager->flush();
        }
    }
}
