<?php

/**
 * Список тем оформления
 */
abstract class themes {

    /**
     * Проверка на существование темы оформления
     * @param string $code имя темы оформления (название папки с темой)
     * @param string $type тип темы оформления
     * @return boolean
     */
    static public function exists($code, $type = 'all') {
        $list = self::getList($type);
        return isset($list[$code]);
    }

    /**
     * Получение конфига темы оформления
     * @param string $code имя темы оформления (название папки с темой)
     * @return array
     */
    static public function getConfig($code) {
        if (!self::exists($code)) {
            return false;
        }
        $list = self::getList();
        return $list[$code];
    }

    /**
     * Возвращает список тем оформления
     * @staticvar boolean|array $list
     * @param string $type тип тем
     * @return array
     */
    static public function getList($type = 'all') {
        static $list = false;

        if ($list !== false) {
            return self::filterType($list, $type);
        }

        // получение списка языковых пакетов
        if ($list = cache::get('themes'))           
            return self::filterType($list, $type);        

        $list = self::getRealList();
        cache::set('themes', $list, 60);

        return self::filterType($list, $type);
    }

    /**
     * Фильтр тем оформления по типу
     * @param array $list список тем
     * @param string $type тип тем
     * @return array
     */
    static protected function filterType($list, $type = 'all') {
        if ($type != 'all') {
            foreach ($list as $dir => $conf) {
                if ($conf['browsers'] && !in_array($type, $conf['browsers'])) {
                    unset($list[$dir]);
                }
            }
        }

        return $list;
    }

    /**
     * Получение списка тем без кэширования
     * @global \dcms $dcms
     * @return array
     */
    static public function getRealList() {
        global $dcms;
        $list = array();

        // получение списка тем оформления минуя кэш
        $lpath = H . '/sys/themes';
        $od = opendir($lpath);
        while ($rd = readdir($od)) {

            if ($rd {0} == '.') {
                continue; // все файлы и папки начинающиеся с точки пропускаем
            }
            if (is_dir($lpath . '/' . $rd)) {
                if (!file_exists($lpath . '/' . $rd . '/config.ini')) {
                    // если нет конфига, то тему оформления тоже пропускаем
                    continue;
                }

                $config = ini::read($lpath . '/' . $rd . '/config.ini', true);

                if (empty($config['CONFIG'])) {
                    // нет конфигурации
                    continue;
                }

                if (empty($config['CONFIG']['version']) || $config['CONFIG']['version'] != $dcms->theme_version) {
                    // тема оформления не соответствует версии
                    continue;
                }

                $list[$rd] = self::properties($config, $rd);
            }
        }
        closedir($od);

        ksort($list);
        reset($list);

        return $list;
    }

    /**
     * Свойства темы оформления из конфига
     * @param array $config
     * @param string $dir
     * @return array
     */
    static protected function properties($config, $dir) {
        if (empty($config['VARS'])) {
            $vars = array();
        } else {
            $vars = $config['VARS'];
        }

        $info = $config['CONFIG'];
        $info['vars'] = &$vars;
        $info['dir'] = $dir;

        if (empty($info['name'])) {
            $info['name'] = $dir;
        }

        if (empty($info['img_width_max'])) {
            $info['img_width_max'] = 300;
        }

        if (empty($info['browsers'])) {
            $info['browsers'] = array();
        } else {
            $info['browsers'] = preg_split('/[\|\,\:\^]/', $info['browsers']);
        }

        if (empty($info['content'])) {
            $info['content'] = 'html';
        }

        if (empty($info['icons'])) {
            $info['icons'] = '/sys/images/icons';
        } else {
            $info['icons'] = '/sys/themes/' . $dir . '/' . $info['icons'];
        }

        return $info;
    }

    /**
     * очистка кэша списка тем
     */
    static public function clearCache() {
        cache::set('themes', false);
    }

}