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

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

/**
 *
 *
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author        Raymond Benc
 * @package        Module_Admincp
 * @version        $Id: menu.class.php 6739 2013-10-07 14:14:51Z Fern $
 */
class Admincp_Service_Menu_Menu extends Phpfox_Service
{
    /**
     * @var array
     */
    private $_aTypes = [
        'main',
        'footer',
    ];

    /**
     * Class constructor
     */
    public function __construct()
    {
        $this->_sTable = Phpfox::getT('menu');

        (($sPlugin = Phpfox_Plugin::get('admincp.service_menu_menu___construct')) ? eval($sPlugin) : false);
    }

    /**
     * @return array
     */
    public function getTypes()
    {
        return $this->_aTypes;
    }

    /**
     * @param array $aConds
     * @param bool $bAll
     *
     * @return array
     */
    public function get($aConds = array(), $bAll = true)
    {
        (($sPlugin = Phpfox_Plugin::get('admincp.service_menu_menu_get_start')) ? eval($sPlugin) : false);

        if ($bAll && !Phpfox::getParam('core.is_auto_hosted')) {
            $this->database()
                ->leftJoin(Phpfox::getT('module'), 'm', 'm.module_id = menu.module_id AND m.is_active = 1');
        } else {
            $this->database()
                ->join(Phpfox::getT('module'), 'm', 'm.module_id = menu.module_id AND m.is_active = 1');
        }

        $aRows = $this->database()
            ->select('menu.*, m.module_id AS module_name, COUNT(mchild.menu_id) AS total_children')
            ->from($this->_sTable, 'menu')
            ->leftJoin($this->_sTable, 'mchild', 'mchild.parent_id = menu.menu_id')
            ->where($aConds)
            ->order('ordering ASC')
            ->group('menu.menu_id, m.module_id')
            ->execute('getSlaveRows');

        foreach ($aRows as $iKey => $aRow) {
            if (Phpfox::isModule($aRow['module_id'])) {
                $aRows[$iKey]['name'] = _p($aRow['var_name'], []);
            }
        }

        (($sPlugin = Phpfox_Plugin::get('admincp.service_menu_menu_get_end')) ? eval($sPlugin) : false);
        return $aRows;
    }

    /**
     * @param int $iId
     *
     * @return array
     */
    public function getForEdit($iId)
    {
        $sCacheId = $this->cache()->set('admincp_menu_getForEdit_' . $iId);
        if (!$aRow = $this->cache()->get($sCacheId)) {
            (($sPlugin = Phpfox_Plugin::get('admincp.service_menu_menu_getforedit')) ? eval($sPlugin) : false);

            $aRow = $this->database()
                ->select('m.*')
                ->from($this->_sTable, 'm')
                ->where('m.menu_id = ' . (int)$iId)
                ->execute('getSlaveRow');

            if ($aRow['parent_id'] > 0) {
                $aRow['m_connection'] = $aRow['parent_id'];
            }
        }
        return $aRow;
    }

    /**
     * @param string $sProduct
     * @param null $sModuleId
     *
     * @return bool
     */
    public function export($sProduct, $sModuleId = null)
    {
        $aCond = array();
        $aCond[] = "me.product_id = '" . $this->database()->escape($sProduct) . "'";
        if ($sModuleId !== null) {
            $aCond[] = "AND me.module_id = '" . $sModuleId . "'";
        }

        $aRows = $this->database()->select('me.*, m.module_id AS module_name, p.title AS product_name, pm.var_name as parent_var_name')
            ->from($this->_sTable, 'me')
            ->join(Phpfox::getT('module'), 'm', 'm.module_id = me.module_id')
            ->join(Phpfox::getT('product'), 'p', 'p.product_id = me.product_id')
            ->leftJoin(Phpfox::getT('menu'), 'pm', 'pm.menu_id = me.parent_id')
            ->where($aCond)
            ->execute('getSlaveRows');

        if (!count($aRows)) {
            return false;
        }

        $oXmlBuilder = Phpfox::getLib('xml.builder');
        $oXmlBuilder->addGroup('menus');
        foreach ($aRows as $aRow) {
            if (!empty($aRow['disallow_access'])) {
                $aGroups = unserialize($aRow['disallow_access']);
                $aRow['disallow_access'] = array();
                foreach ($aGroups as $iGroup) {
                    if (!in_array($iGroup, array(1, 2, 3, 4))) {
                        continue;
                    }

                    $aRow['disallow_access'][] = $iGroup;
                }
                $aRow['disallow_access'] = serialize($aRow['disallow_access']);
            }

            $aTag = array(
                'module_id' => $aRow['module_id'],
                'parent_var_name' => $aRow['parent_var_name'],
                'm_connection' => $aRow['m_connection'],
                'var_name' => $aRow['var_name'],
                'ordering' => $aRow['ordering'],
                'url_value' => $aRow['url_value'],
                'version_id' => $aRow['version_id'],
                'disallow_access' => $aRow['disallow_access'],
                'module' => $aRow['module_name']
            );

            if (!empty($aRow['mobile_icon'])) {
                $aTag['mobile_icon'] = $aRow['mobile_icon'];
            }

            $oXmlBuilder->addTag('menu', '', $aTag);
        }
        $oXmlBuilder->closeGroup();

        return true;
    }

    /**
     * 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_menu_menu__call')) {
            eval($sPlugin);
            return null;
        }

        /**
         * No method or plug-in found we must throw a error.
         */
        Phpfox_Error::trigger('Call to undefined method ' . __CLASS__ . '::' . $sMethod . '()', E_USER_ERROR);
    }
}