<?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 SiteUserAccessManagementExtended extends AccessManagementExtended
{
    public function __construct($entityManager, $request, $session, $userRepo, $formManager)
    {
        parent::__construct($entityManager, $request, $session, $formManager);
        $this->setUserAccessRepositories();
        $this->setUserRepository($userRepo);
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for set Entity Repository
     * returns Users Data as Objects and Order By username
     * @return ClassInstance
    */
    public function setUserAccessRepositories()
    {
        $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 save User Access Data
     * returns True if success otherwise return Error MSG in Array
     * @return ClassInstance
    */
    public function saveAccessData($request)
    {
        $postData=$request->get('officebrain_bundle_accessmanagementbundle_instanceuseraccessmapping');
        $errors=array();
        if ($this->isMainSiteAccessExists()) {
            $instanceId=$this->instance_id;
            $objProjectAccessMaster=array();
            if (!empty($postData['instanceAccess'])) {
                $objProjectAccessMaster=$this->getUserProjectAccessMasterDataByIds($this->instance_id, $postData['instanceAccess']);
                //print_r($objProjectAccessMaster);
                // check for access
                if (count($postData['instanceAccess'])!=count($objProjectAccessMaster)) {
                    $errors['instanceAccess']='Submited rights are not matched with assign rights.';
                }
                //Check Threaded Value proper selected or not
                if (!$this->validateThreaedValue($objProjectAccessMaster, $postData['instanceAccess'])) {
                    $errors['instanceAccess']='Parent Value not selected.';
                }
            }
            $arrUser=array($postData['user']);

            $objUser=$this->getAllUserObjectByIds($instanceId, $arrUser);
            // check subdomian id
            if (empty($objUser) || count($objUser)==0) {
                $errors['user']='Please select valid user.';
            }

            if (count($errors)==0) {
                $objUser=$objUser[0];
                $oldInstanceUserAccessMapping=$this->getInstanceUserAccessMappingByUser($objUser);
                $this->deleteSelectedInstanceUserAccessMappingByUser($objUser);

                $arrInstance=array($instanceId);
                $objInstanceMaster=$this->getInstanceMasterByIds($arrInstance);
                $objInstanceMaster=$objInstanceMaster[0];

                foreach ($objProjectAccessMaster as $key => $value) {
                    $objInstanceUserAccessMapping=$this->getInstanceUserAccessMapping();

                    $objInstanceUserAccessMapping->setInstance($objInstanceMaster);
                    $objInstanceUserAccessMapping->setInstanceAccess($value);
                    $objInstanceUserAccessMapping->setUser($objUser);
                    $objInstanceUserAccessMapping->setCreatedAt(new \DateTime("now"));

                    $this->entityManager->persist($objInstanceUserAccessMapping);
                }
                $this->entityManager->flush();
                $this->entityManager->clear();

                $this->revokeSubUserInstanceAccessMapping($oldInstanceUserAccessMapping, $objProjectAccessMaster, $objUser);

                return true;
            }
        }
        return $errors;
    }

    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for revoke SubUser Instance Access Mapping
     * @return ClassInstance
    */
    public function revokeSubUserInstanceAccessMapping($oldInstanceAccessMapping, $newProjectAccessMaster, $objUser)
    {
        $oldInstanceAccessMappingArr=array();
        $newInstanceAccessMappingArr=array();
        foreach ($oldInstanceAccessMapping as $key => $value) {
            $oldInstanceAccessMappingArr[$value->getInstanceAccess()->getId()]=$value->getInstanceAccess();
        }
        foreach ($newProjectAccessMaster as $key => $value) {
            $newInstanceAccessMappingArr[$value->getId()]=$value;
        }
        $arrRevokeAccess=array_diff_key($oldInstanceAccessMappingArr, $newInstanceAccessMappingArr);
        if (count($arrRevokeAccess)) {
            //Call User Revoke function
            //$objUsers=$this->userRepo->getAllSubUserObjectByUser($objUser);
            $objUsers=$this->getAllSubUserObjectByUser($objUser);
            if (count($objUsers)>0) {
                $this->deleteInstanceUserAccessMappingByUser($objUsers, $arrRevokeAccess);
            }
        }
        //deleteInstanceUserAccessMappingByUser
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for get User Access Management by User Id
     * returns Instance Array Ids
     * @return ClassInstance
    */
    public function getInstanceUserAccessMappingArrayByUserId($userId=0)
    {
        $arrInstanceUser=array();
        $userAccessData=$this->getInstanceUserAccessMappingByUser($this->getUserObjByUserId($userId));
        if (count($userAccessData)>0) {
            foreach ($userAccessData as $key => $value) {
                $arrInstanceUser[]=$value->getInstanceAccess()->getId();
            }
        }
        return $arrInstanceUser;
    }
    
    /**
     * @author Employee Id: 4116
     * OB eCommerce Product - Assess Management
     * Function created for User Data
     * returns Users Data as Objects and Order By username
     * @return ClassInstance
    */
    public function getUserData($instanceId=0, $objCurrentUser=null)
    {
        if (!empty($objCurrentUser)) {
            return $this->userRepo->getAllSubUserObjectByUserId($objCurrentUser);
        }
        return $this->userRepo->getAllUserObjectByInstanceId($instanceId);
    }
    
    /**
     * @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();
        $userid = $this->request->get('userid', 0);
        $data['post_access']=array();
        $data['defaultAccessFlag']=0;
        if (!empty($_POST)) {
            $postData=$this->request->get('officebrain_bundle_accessmanagementbundle_instanceuseraccessmapping');
            if (!empty($postData['instanceAccess'])) {
                $data['post_access']=array_fill_keys($postData['instanceAccess'], 1) ;
            }
        } else {
            if (!empty($userid)) {
                $userObj=$this->getInstanceUserAccessMappingArrayByUserId($userid);
                if (!empty($userObj)) {
                    $data['post_access']=array_fill_keys($userObj, 1) ;
                } else {
                    $data['defaultAccessFlag']=1;
                }
            } else {
                $data['defaultAccessFlag']=1;
            }
        }
        $objUsers=$this->getUserData($this->getInstanceId(), $this->getCurrentUserLoginObject());
        $arrProjectAccessMasters=$this->getProjectUserAccessMasterThreadedData($this->project_setting['instance_id'], $this->getCurrentUserLoginObject());
        $data['project_access_master'] = $arrProjectAccessMasters;

        $objInstanceUserAccessMappingType=$this->getInstanceUserAccessMappingType($objUsers, $arrProjectAccessMasters, $userid);
        $objInstanceUserAccessMapping=$this->getInstanceUserAccessMapping();
        
        $frmInstanceUserAccessMapping = $this->getFormManager()->create($objInstanceUserAccessMappingType, $objInstanceUserAccessMapping);
        
        $frmInstanceUserAccessMapping->handleRequest($this->request);
        if (isset($postStatus) && $postStatus!==true) {
            foreach ($postStatus as $key => $value) {
                $frmInstanceUserAccessMapping->get($key)->addError(new FormError($value));
            }
        }
        $data['form_user_access'] = $frmInstanceUserAccessMapping->createView();
        return $data;
    }
}
