<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 *
 *
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author           Raymond Benc
 * @package          Module_Admincp
 * @version          $Id: process.class.php 2228 2010-12-02 21:02:59Z Raymond_Benc $
 */
class Admincp_Service_Block_Process extends Phpfox_Service
{
    /**
     * Class constructor
     */
    public function __construct()
    {
        $this->_sTable = Phpfox::getT('block');
    }
    
    /**
     * @param array $aVals
     * @param bool  $bIsUpdate
     *
     * @return bool
     */
    public function add($aVals, $bIsUpdate = false)
    {
        if (!$aVals['type_id'] && empty($aVals['component'])) {
            return Phpfox_Error::set(_p('select_component'));
        }
        
        // Find the user groups we disallowed
        $aDisallow = [];
        $aUserGroups = User_Service_Group_Group::instance()->get();
        if (isset($aVals['allow_access'])) {
            foreach ($aUserGroups as $aUserGroup) {
                if (!in_array($aUserGroup['user_group_id'], $aVals['allow_access'])) {
                    $aDisallow[] = $aUserGroup['user_group_id'];
                }
            }
        } else {
            foreach ($aUserGroups as $aUserGroup) {
                $aDisallow[] = $aUserGroup['user_group_id'];
            }
        }
        
        if ($aVals['type_id'] == '5') {
            $aVals['module_id'] = '_app';
            
        } else {
            if (!$aVals['type_id']) {
                $aParts = explode('|', $aVals['component']);
                $aVals['component'] = isset($aParts[1])?$aParts[1]:null;
                $aVals['module_id'] = Phpfox_Module::instance()->getModuleId($aParts[0]);
            } else {
                $aParts = explode('|', $aVals['m_connection']);
                $aVals['component'] = null;
                $aVals['module_id'] = Phpfox_Module::instance()->getModuleId($aParts[0]);
            }
        }
        
        if (empty($aVals['module_id'])) {
            $aVals['module_id'] = 'core';
        }
        
        $aVals['disallow_access'] = (count($aDisallow) ? serialize($aDisallow) : null);
        $aVals['title'] = (empty($aVals['title']) ? null : $this->preParse()->clean($aVals['title']));
        
        if (isset($aVals['style_id']) && is_array($aVals['style_id'])) {
            $aPostInfo = [];
            foreach ($aVals['style_id'] as $iStyleId => $iLocation) {
                if (empty($iLocation)) {
                    continue;
                }
                $aPostInfo[$iStyleId] = $iLocation;
            }
            
            if (count($aPostInfo)) {
                $aVals['location'] = serialize([
                    'g' => $aVals['location'],
                    's' => $aPostInfo
                ]);
            }
        }
        
        (($sPlugin = Phpfox_Plugin::get('admincp.service_block_process_add')) ? eval($sPlugin) : false);
        
        if ($bIsUpdate) {
            $iId = $aVals['block_id'];
            $this->database()->process([
                'type_id'   => 'int',
                'title',
                'm_connection',
                'module_id',
                'product_id',
                'component',
                'location',
                'is_active' => 'int',
                'disallow_access',
                'can_move'  => 'int'
            ], $aVals)->update($this->_sTable, 'block_id = ' . (int)$aVals['block_id']);
            
            if (!$aVals['can_move']) {
                if ($aVals['m_connection'] == 'core.index-member') {
                    $this->database()->delete(Phpfox::getT('user_dashboard'), 'cache_id = \'js_block_border_' . $aVals['module_id'] . '_' . $aVals['component'] . '\'');
                }
                
                if ($aVals['m_connection'] == 'profile.index') {
                    $this->database()->delete(Phpfox::getT('user_design_order'), 'cache_id = \'js_block_border_' . $aVals['module_id'] . '_' . $aVals['component'] . '\'');
                }
            }
        } else {
            $iCount = $this->database()->select('ordering')
                ->from($this->_sTable)
                ->where("m_connection = '" . $this->database()->escape($aVals['m_connection']) . "'")
                ->order('ordering DESC')
                ->execute('getSlaveField');
            
            $aVals['ordering'] = ($iCount + 1);
            $aVals['version_id'] = Phpfox::getId();
            
            $iId = $this->database()
                ->process([
                    'type_id'    => 'int',
                    'title',
                    'm_connection',
                    'module_id',
                    'product_id',
                    'component',
                    'location'   => 'int',
                    'is_active'  => 'int',
                    'ordering'   => 'int',
                    'disallow_access',
                    'can_move'   => 'int',
                    'version_id' => 'int'
                ], $aVals)->insert($this->_sTable);
        }
        
        $this->cache()->remove();
        
        if ($aVals['type_id'] > 0 && isset($aVals['source_code'])) {
            $aVals['source_parsed'] = $aVals['source_code'];
            
            $this->database()->delete(Phpfox::getT('block_source'), 'block_id = ' . (int)$iId);
            $this->database()->insert(Phpfox::getT('block_source'), [
                'block_id'      => $iId,
                'source_code'   => (empty($aVals['source_code']) ? null : $aVals['source_code']),
                'source_parsed' => (empty($aVals['source_parsed']) ? null : $aVals['source_parsed'])
            ]);
        }
        
        return true;
    }
    
    /**
     * @param int   $iId
     * @param array $aVals
     *
     * @return bool
     */
    public function update($iId, $aVals)
    {
        $aVals['block_id'] = $iId;
        
        $this->add($aVals, true);
        
        return true;
    }
    
    /**
     * @param array    $aVals
     * @param null|int $iStyleId
     *
     * @return bool
     */
    public function updateOrder($aVals, $iStyleId = null)
    {
        $iCnt = 0;
        foreach ($aVals as $iId => $aValue) {
            $iCnt++;
            
            if ($iStyleId !== null) {
                $iCheck = (int)$this->database()->select('order_id')
                    ->from(Phpfox::getT('block_order'))
                    ->where('style_id = ' . (int)$iStyleId . ' AND block_id = ' . (int)$iId . '')
                    ->execute('getSlaveField');
                
                if ($iCheck) {
                    $this->database()->update(Phpfox::getT('block_order'), [
                            'style_id' => (int)$iStyleId,
                            'block_id' => (int)$iId,
                            'ordering' => (int)$iCnt
                        ], 'order_id =' . $iCheck);
                } else {
                    $this->database()->insert(Phpfox::getT('block_order'), [
                            'style_id' => (int)$iStyleId,
                            'block_id' => (int)$iId,
                            'ordering' => (int)$iCnt
                        ]);
                }
            } else {
                $this->database()->update($this->_sTable, ['ordering' => $iCnt], 'block_id = ' . (int)$iId);
            }
        }
        
        $this->cache()->remove();
        
        return true;
    }
    
    /**
     * @param int $iId
     *
     * @return bool
     */
    public function delete($iId)
    {
        (($sPlugin = Phpfox_Plugin::get('admincp.service_block_process_delete')) ? eval($sPlugin) : false);
        
        $this->database()->delete($this->_sTable, 'block_id = ' . (int)$iId);
        $this->database()->delete(Phpfox::getT('block_source'), 'block_id = ' . (int)$iId);

        $this->cache()->remove();
        
        return true;
    }
    
    /**
     * @param int $iId
     * @param int $iType
     */
    public function updateActivity($iId, $iType)
    {
        Phpfox::isUser(true);
        Phpfox::getUserParam('admincp.has_admin_access', true);
        
        $this->database()->update($this->_sTable, ['is_active' => (int)($iType == '1' ? 1 : 0)], 'block_id = ' . (int)$iId);

        $this->cache()->remove();
    }
    
    /**
     * If a call is made to an unknown method attempt to connect
     * it to a specific plug-in with the same name thus allowing
     * plug-in developers the ability to extend classes.
     *
     * @param string $sMethod    is the name of the method
     * @param array  $aArguments is the array of arguments of being passed
     *
     * @return null
     */
    public function __call($sMethod, $aArguments)
    {
        /**
         * Check if such a plug-in exists and if it does call it.
         */
        if ($sPlugin = Phpfox_Plugin::get('admincp.service_block_process___call')) {
            return eval($sPlugin);
        }
        
        /**
         * No method or plug-in found we must throw a error.
         */
        Phpfox_Error::trigger('Call to undefined method ' . __CLASS__ . '::' . $sMethod . '()', E_USER_ERROR);
        return null;
    }
}