<?php
/**
 * @property \modelBackendWidgets $model_backend_widgets
 */
class actionAdminWidgets extends cmsAction {

    private $is_dynamic_scheme = false;
    private $rows_titles_pos   = 'left';

    public function run($do = false) {

        // если нужно, передаем управление другому экшену
        if ($do) {
            return $this->runExternalActionIfExists('widgets_' . $do, array_slice($this->params, 1));
        }

        cmsCore::loadAllControllersLanguages();

        $pages = $this->model_backend_widgets->getWidgetsPages();

        $widgets_list = $this->model_backend_widgets->getAvailableWidgets();

        $tpls = cmsCore::getTemplates();

        $scroll_to     = strip_tags($this->request->get('scroll_to', ''));
        $template_name = $this->request->get('template_name', cmsConfig::get('template'));

        if (!$template_name || !in_array($template_name, $tpls, true)) {
            return cmsCore::error404();
        }

        cmsCore::loadTemplateLanguage($template_name);

        // Шаблоны для показа виджетов
        $templates = [];
        // Шаблоны, у которых есть динамическая схема
        $templates_dynamic_scheme = [];

        foreach ($tpls as $tpl) {
            $template_path = $this->cms_config->root_path . cmsTemplate::TEMPLATE_BASE_PATH . $tpl;
            $manifest      = cmsTemplate::getTemplateManifest($template_path);
            if ($manifest !== null) {
                if (!empty($manifest['properties']['is_frontend'])) {
                    $templates[$tpl] = !empty($manifest['title']) ? $manifest['title'] : $tpl;
                }
                if (!empty($manifest['properties']['is_dynamic_layout'])) {
                    $templates_dynamic_scheme[$tpl] = !empty($manifest['title']) ? $manifest['title'] : $tpl;
                }
                continue;
            }
            if (file_exists($template_path . '/main.tpl.php')) {
                $templates[$tpl] = $tpl;
            }
        }

        $this->rows_titles_pos = cmsUser::getCookie('rows_titles_pos');
        if (!$this->rows_titles_pos) {
            $this->rows_titles_pos = 'left';
        }

        $scheme_html = $this->getSchemeHTML($template_name);

        // Пошаговое руководство страницы, если есть
        $intro_lang = cmsCore::loadLanguage('templates/' . $this->cms_template->name . '/admin/intro/widgets/widgets');

        return $this->cms_template->render('widgets', [
            'is_dynamic_scheme'        => $this->is_dynamic_scheme,
            'rows_titles_pos'          => $this->rows_titles_pos,
            'intro_lang'               => $intro_lang,
            'pages'                    => $pages,
            'template_name'            => $template_name,
            'templates'                => $templates,
            'templates_dynamic_scheme' => $templates_dynamic_scheme,
            'widgets_list'             => $widgets_list,
            'scroll_to'                => $scroll_to,
            'scheme_html'              => $scheme_html
        ]);
    }

    public function getSchemeHTML($name = '') {

        $template = new cmsTemplate($name);

        $template->setContext($this);

        $scheme_html = $template->getSchemeHTML();
        if (!$scheme_html) {
            $scheme_html = $this->getDynamicSchemeHTML($template);
            if (!$scheme_html) {
                return false;
            }

            $this->is_dynamic_scheme = true;
        }

        preg_match_all('/{(.+)}/ui', $scheme_html, $matches);

        if (!empty($matches[1])) {
            foreach ($matches[1] as $block) {

                list($type, $value) = explode(':', $block);

                if ($type === 'position') {
                    $replace_html = '<ul class="position" rel="' . html($value, false) . '" id="pos-' . html($value, false) . '"></ul>';
                }

                if ($type === 'block') {
                    if (mb_strpos($value, 'LANG_') === 0) {
                        $value = constant($value);
                    }
                    $replace_html = '<div class="block"><span>' . $value . '</span></div>';
                }

                if ($type === 'cell') {
                    if (mb_strpos($value, 'LANG_') === 0) {
                        $value = constant($value);
                    }
                    $replace_html = '<div class="cell"><span>' . $value . '</span></div>';
                }

                $scheme_html = str_replace("{{$block}}", $replace_html, $scheme_html);
            }
        }

        return $scheme_html;
    }

    private function getDynamicSchemeHTML($template) {

        $this->cms_template->addTplJSName('admin-scheme');

        $rows = $this->model_backend_widgets->getLayoutRows($template->getName());

        return $template->getRenderedChild('widgets_scheme', [
            'rows_titles_pos' => $this->rows_titles_pos,
            'rows'            => $rows
        ]);
    }

}
