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

use OfficeBrain\Bundle\ActivityBundle\Manager\AbstractManager\ActivityLogAbstract;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Doctrine\ODM\MongoDB\DocumentManager;
use OfficeBrain\Bundle\ActivityBundle\Document\ActivityLog;
use OfficeBrain\Bundle\ActivityBundle\Document\SearchLog;
use OfficeBrain\Bundle\ActivityBundle\Document\KeywordBannerLog;

/**
* @author OfficeBrain 4160 <info@officebrain.com>
*
* Description :  Activity Log Extended Class
*
**/
class ActivityLogExtended extends ActivityLogAbstract
{
    protected $request;
    protected $session;
    protected $logconfig;
    public function __construct(Request $request, Session $session, $dm,$logconfig)
    {
        $this->request = $request;
        $this->session = $session;
        $this->dm = $dm;
        $this->logconfig=$logconfig;
        $this->repository = $this->dm->getRepository('OfficeBrainActivityBundle:ActivityLog');
    }
    
    /**
    * @author Employee Id: 4160
    * Description :
    * entityActivityLog method to log activity on entity events in mongodb
    *
    * @param 1 : object lifecycleEventArgs
    * @param 2 : object logParameters
    * @param 3 : object eventMethod
    *
    * @return
    *
    **/
    public function entityActivityLog($lifecycleEventArgs, $logParameters, $eventMethod)
    {
        $entity = $lifecycleEventArgs->getEntity();
        $entityManager = $lifecycleEventArgs->getEntityManager();
        $entityName = $entityManager->getClassMetadata(get_class($entity))->getName();
        $moduleName = $this->getModuleName($entity);
        
        $bundle = null;
        $log = false;
        $logData = array();
        if (array_key_exists($moduleName, $logParameters)) {
            $moduleParameters = $logParameters[$moduleName];
            if (in_array($entity, $moduleParameters['entities'])) {
                $log = $moduleParameters['log'];
                if ($log == 'enable') {
                    $bundle = $moduleParameters['bundle'];
                    if (array_key_exists('dataFields', $moduleParameters)) {
                        foreach ($moduleParameters['dataFields'] as $key => $value) {
                            $getMethod = null;
                            if ($value) {
                                $getMethod = 'get'.$value;
                            }
                            $logData[$key] = $getMethod ? $entity->$getMethod() : null;
                        }
                    }
                }
            }
        }
        
        if ($log == 'enable') {
            $activityLog = new ActivityLog();
            
            $activityLog->setRequestInfo($this->request);
            $activityLog->setActionName($eventMethod);
            $activityLog->setArgs($logData);
            $activityLog->setBundleName($bundle);
            $activityLog->setEntityName($entityName);
            
            $this->repository->save($activityLog);
        }
    }
    
    /**
    * @author Employee Id: 4160
    * Description :
    * viewActivityLog method to log activity on controller action in mongodb
    *
    * @param 1 : object controller
    * @param 2 : object logParameters
    * @param 3 : object eventMethod
    *
    * @return
    *
    **/
    public function viewActivityLog($controller, $logParameters, $eventMethod)
    {
        $moduleName = $this->getModuleName($controller[0]);
        $controllerName = get_class($controller[0]);
        $actionName = $controller[1];
        
        if (array_key_exists($moduleName, $logParameters)) {
            $moduleParameters = $logParameters[$moduleName];
            if ($moduleParameters['log'] == 'enable' && array_key_exists($controllerName, $moduleParameters['controllers'])  && in_array($actionName, $moduleParameters['controllers'][$controllerName])) {
                $activityLog = new ActivityLog();
                $arrRequest['Request'] = $_REQUEST;
                //$arrRequest['Request'] = $this->request->attributes->all();        
                unset($arrRequest['Request']['project_setting']);
                unset($arrRequest['Request']['project_user_setting']);
                $searchData['Data']=$this->request->query->all();
//                 unset($arrRequest['Request']['project_setting']);
                $activityLog->setArgs($arrRequest['Request']);
                $activityLog->setRequestInfo($this->request);
                $activityLog->setActionName($eventMethod);
                $activityLog->setBundleName($moduleParameters['bundle']);
                $activityLog->setData($searchData['Data']);
//                 $activityLog->setEntityName($entityClass);
                $this->repository->save($activityLog);
            }
        }
    }
    /**
    * @author Employee Id: 4160
    * Description :
    * getModuleName method to get name of Module/Bundle
    *
    * @param 1 : string path path of controller or entity
    *
    * @return string
    *
    **/
    public function getModuleName($path)
    {
        $className =  get_class($path);
        $classPath = explode('\\', $className);
        $bundle = explode('Bundle', $classPath[2]);
        return $bundle[0];
    }
    /**
    * @author Employee Id: 4488
    * Description :
    * setSearchLog method to set Search keyword Data
    *
    * @param 1 : string logparameter <request>
    * @param 1 : array $searchCriteria <array("mainFilter"="all")>
    * @param 1 : string $searchKeyword <search_query>
    *
    **/
    public function setSearchLog($logParameter, $searchCriteria, $searchKeyword='')
    {
    	if($this->logconfig['Search']['log']=='disable' || empty($searchKeyword))
    		return false;
    	$this->setRepository($this->dm->getRepository('OfficeBrainActivityBundle:SearchLog'));
        return $this->insertLog($logParameter, $searchCriteria, $searchKeyword);
    }
    /**
     * @author Employee Id: 4488
     * Description :
     * setKeywordBannerLog method to set keyword Banner Data
     *
     * @param 1 : string $request <request>
     * @param 1 : array $searchCriteria <array("mainFilter"="all")>
     * @param 1 : string $searchKeyword <search_query>
     *
     **/
    public function setKeywordBannerLog($requestParameter, $bannerCriteria)
    {
    	
    	if($this->logconfig['BannerKeyword']['log']=='disable' || empty($bannerCriteria)){
    		return false;
    	}
    	$this->setRepository($this->dm->getRepository('OfficeBrainActivityBundle:KeywordBannerLog'));
    	return $this->insertKeywordBannerLog($requestParameter, $bannerCriteria);
    }
    
    
}
