<?php
/**
 * 炎酷CMS - 模板渲染器
 * 模板文件为 template/{目录}/{前缀}_{ID}.html，内含 PHP 片段，include 渲染。
 * ID 对应文件不存在时自动回退 _1，保证切换模板不白屏。
 */
defined('YKCMS') or exit('Access Denied');

require_once __DIR__ . '/functions.php';

/** 模板类型 => [目录, 文件前缀] */
function tpl_type_map() {
    return array(
        'header'  => array('header',   'header'),
        'footer'  => array('footer',   'footer'),
        'banner'  => array('banner',   'banner'),
        'block'   => array('block',    'block'),
        'about'   => array('block',    'about'),
        'article' => array('block',    'article'),
        'product' => array('block',    'product'),
        'float'   => array('float',    'float'),
        'art'     => array('article',  'art'),
        'page'    => array('page_tpl', 'page'),
        'list'    => array('list_tpl', 'list'),
    );
}

/**
 * 渲染指定类型模板
 * @param string $type header|footer|banner|block|page|list
 * @param int    $id   模板编号
 * @param array  $vars 注入模板的变量
 */
function render_tpl($type, $id, $vars = array()) {
    $map = tpl_type_map();
    if (!isset($map[$type])) return;
    list($dir, $prefix) = $map[$type];
    $id    = max(1, (int)$id);
    $base  = dirname(__DIR__) . '/template/' . $dir . '/';
    $file  = $base . $prefix . '_' . $id . '.html';
    if (!is_file($file)) {
        $file = $base . $prefix . '_1.html';
        if (!is_file($file)) return;
    }
    // 公共变量全模板可用
    $site = site_config();
    extract($vars, EXTR_SKIP);
    include $file;
}

/** 主题配置键 => CSS 变量名（theme_style_render 与可视化预览共用） */
function theme_var_map() {
    return array(
        'theme_nav_bg'       => '--yk-nav-bg',
        'theme_nav_color'    => '--yk-nav-color',
        'theme_nav_active'   => '--yk-nav-active',
        'theme_nav_active_bg'=> '--yk-nav-active-bg',
        'theme_accent'       => '--yk-accent',
        'theme_footer_bg'    => '--yk-footer-bg',
        'theme_footer_color' => '--yk-footer-color',
        'theme_side_bg'      => '--yk-side-bg',
        'theme_side_color'   => '--yk-side-color',
    );
}

/**
 * 可视化预览覆盖：后台“可视化设置”页通过 URL 参数临时套用模板与主题色。
 * 仅在已登录管理员 session 且带 yk_preview=1 时生效，不写数据库，游客不受影响。
 */
function preview_config() {
    static $pv = null;
    if ($pv === null) {
        $pv = array();
        if (isset($_GET['yk_preview']) && $_GET['yk_preview'] === '1') {
            if (session_status() !== PHP_SESSION_ACTIVE && !headers_sent()) {
                session_start();
            }
            if (!empty($_SESSION['yk_admin_id'])) {
                foreach (array('tpl_header' => 5, 'tpl_footer' => 2, 'tpl_banner' => 8, 'kefu_style' => 3,
                              'list_tpl' => 12, 'content_tpl' => 3, 'page_tpl' => 10,
                              'block_id' => 999999, 'block_tpl' => 5, 'block_title_style' => 5) as $k => $max) {
                    if (isset($_GET[$k]) && $_GET[$k] !== '') {
                        $pv[$k] = (string)max(1, min($max, (int)$_GET[$k]));
                    }
                }
                if (isset($_GET['kefu_on'])) {
                    $pv['kefu_on'] = $_GET['kefu_on'] === '1' ? '1' : '0';
                }
                foreach (array_keys(theme_var_map()) as $k) {
                    if (isset($_GET[$k])) {
                        $v = trim((string)$_GET[$k]);
                        // 与 theme_style_render 同一颜色白名单；空串表示“清除为模板默认色”
                        if ($v === '' || preg_match('/^(#[0-9a-fA-F]{3,8}|rgba?\([0-9\s.,%]+\)|[a-zA-Z]+)$/', $v)) {
                            $pv[$k] = $v;
                        }
                    }
                }
            }
        }
    }
    return $pv;
}

/** 是否处于可视化预览（已登录管理员 + yk_preview=1） */
function preview_active() {
    preview_config(); // 内部完成 session 启动与管理员校验
    return isset($_GET['yk_preview']) && $_GET['yk_preview'] === '1' && !empty($_SESSION['yk_admin_id']);
}

/** 预览模式下优先取 URL 覆盖值，否则取数据库配置 */
function preview_aware_config($key, $default = '') {
    $pv = preview_config();
    if (array_key_exists($key, $pv)) return $pv[$key];
    return site_config($key, $default);
}

/** 渲染全局头部；$active 为导航高亮 key：'home' / 'col-{id}' / 'page-{flag}' */
function render_header($active = 'home') {
    render_tpl('header', (int)preview_aware_config('tpl_header', 1), array(
        'nav'    => nav_columns(),
        'active' => $active,
    ));
}

/** 渲染全局底部；友情链接仅在首页输出（$withLinks = true 时） */
function render_footer($withLinks = false) {
    render_tpl('footer', (int)preview_aware_config('tpl_footer', 1), array(
        'nav'    => nav_columns(),
        'flinks' => $withLinks ? friend_links() : array(),
    ));
}

/** 公共静态资源版本号（style.css 与 main.js 的最新修改时间，防浏览器缓存旧版） */
function tpl_assets_ver() {
    static $ver = null;
    if ($ver === null) {
        $base = dirname(__DIR__) . '/public/assets/';
        $ver  = max(
            is_file($base . 'css/style.css') ? filemtime($base . 'css/style.css') : 0,
            is_file($base . 'js/main.js') ? filemtime($base . 'js/main.js') : 0
        );
    }
    return $ver;
}

/** 渲染全局顶部广告条 */
function render_banner() {
    render_tpl('banner', (int)preview_aware_config('tpl_banner', 1), array(
        'banner' => banner_data(),
    ));
}

/**
 * 渲染一个首页区块（按 mod_type 分派：about=单页简介 / article=文章模块 / product=产品案例模块）
 * @param array $block yk_index_block 行
 */
function render_block_row($block) {
    $mod = isset($block['mod_type']) ? $block['mod_type'] : 'article';
    // 友情链接模块不在首页区块位置渲染（由页脚统一输出）
    if ($mod === 'link') return;
    // 可视化预览：在线编辑指定模块的模板/标题样式临时覆盖（不写库）
    $pv = preview_config();
    if (isset($pv['block_id']) && (int)$pv['block_id'] === (int)(isset($block['id']) ? $block['id'] : 0)) {
        if (isset($pv['block_tpl'])) $block['tpl_id'] = (int)$pv['block_tpl'];
        if (isset($pv['block_title_style'])) $block['title_style'] = (int)$pv['block_title_style'];
    }
    $vars = array(
        'title_text'  => $block['name'],
        'title_style' => (int)$block['title_style'],
        'title_color' => $block['title_color'],
        'col_id'      => (int)$block['col_id'],
    );

    if ($mod === 'about') {
        // 关于我们/联系我们模块：数据源为单页，简介自动从单页内容截取（滤标签图片、保留空行）
        $page = (int)$block['col_id'] > 0
            ? db_one('SELECT * FROM ' . DB_PREFIX . 'page WHERE id = ? AND status = 1', array((int)$block['col_id']))
            : null;
        if (!$page) return;
        $vars['about'] = array(
            'name'  => $page['name'],
            'image' => trim($block['image']) !== '' ? $block['image'] : $page['image'],
            'intro' => str_cut_br($page['content'], max(20, (int)$block['list_num'])),
            'url'   => trim($block['link_url']) !== '' ? $block['link_url'] : url_page($page['flag']),
        );
        render_tpl('about', (int)$block['tpl_id'], $vars);
        return;
    }

    // article / product 模块：数据源为栏目文章
    $vars['list_num']   = (int)$block['list_num'];
    $vars['data_list']  = get_articles((int)$block['col_id'], (int)$block['list_num'],
                            isset($block['data_order']) ? $block['data_order'] : 'new');
    $vars['show_thumb'] = !isset($block['show_thumb']) || $block['show_thumb'];
    $vars['show_desc']  = !isset($block['show_desc'])  || $block['show_desc'];
    $vars['show_time']  = !isset($block['show_time'])  || $block['show_time'];
    render_tpl($mod === 'product' ? 'product' : 'article', (int)$block['tpl_id'], $vars);
}

/**
 * 输出页面公共 <head> 前段（编码、自适应 viewport、主题色 CSS 变量、公共 CSS/JS）
 */
function page_head($title = '', $keywords = '', $description = '') {
    echo '<!DOCTYPE html>' . "\n<html lang=\"zh-CN\">\n<head>\n";
    echo '<meta charset="UTF-8">' . "\n";
    echo '<meta name="viewport" content="width=device-width, initial-scale=1.0">' . "\n";
    // 统一相对路径基准（伪静态目录式地址 /product/ 下 uploads/assets 等相对路径仍指向根目录）
    echo '<base href="/">' . "\n";
    seo_render($title, $keywords, $description);
    $favicon = site_config('favicon', '');
    if ($favicon !== '') {
        echo '<link rel="icon" href="' . e($favicon) . '">' . "\n";
    }
    theme_style_render();
    // 静态资源带文件修改时间戳，模板/css/js 更新后自动刷新浏览器缓存
    $ver = tpl_assets_ver();
    echo '<link rel="stylesheet" href="' . tpl_assets() . '/css/style.css?v=' . $ver . '">' . "\n";
    echo '<script src="' . tpl_assets() . '/js/main.js?v=' . $ver . '" defer></script>' . "\n";
    echo "</head>\n<body>\n";
}

/** 输出全局主题色 CSS 变量（模板用 var(--yk-*, 原色) 引用，未设置时回退模板默认色） */
function theme_style_render() {
    $css = '';
    foreach (theme_var_map() as $key => $var) {
        $val = trim(preview_aware_config($key, ''));
        // 仅接受合法颜色值，防注入
        if ($val !== '' && preg_match('/^(#[0-9a-fA-F]{3,8}|rgba?\([0-9\s.,%]+\)|[a-zA-Z]+)$/', $val)) {
            $css .= $var . ':' . $val . ';';
        }
    }
    if ($css !== '') {
        echo '<style>:root{' . $css . '}</style>' . "\n";
    }
}

/** 输出页面收尾（含全站客服浮动条） */
function page_foot() {
    if (preview_aware_config('kefu_on', '0') === '1') {
        render_tpl('float', (int)preview_aware_config('kefu_style', 1), array(
            'kefu' => array(
                'phone'  => site_config('kefu_phone', ''),
                'wechat' => site_config('kefu_wechat', ''),
            ),
        ));
    }
    // 可视化预览：接收后台面板 postMessage 的主题色，免刷新实时套用
    if (preview_active()) {
        echo '<script>window.addEventListener("message",function(e){var d=e.data;'
           . 'if(!d||d.ykTheme!==1||!d.vars)return;'
           . 'for(var k in d.vars){if(d.vars[k]==="")document.documentElement.style.removeProperty(k);'
           . 'else document.documentElement.style.setProperty(k,d.vars[k]);}});</script>' . "\n";
    }
    echo "\n</body>\n</html>";
}

/** 标题样式片段：block/page/list 模板通用的模块标题（5 种样式） */
function block_title_html($text, $style = 1, $color = '') {
    $style = min(5, max(1, (int)$style));
    $c = $color !== '' ? ' style="color:' . e($color) . '"' : '';
    return '<div class="yk-tt yk-tt-' . $style . '"><span' . $c . '>' . e($text) . '</span></div>';
}

/**
 * 栏目列表页侧栏 HTML（子栏目切换）
 * @param array $side route_column 准备的数据：title/url/cols[{id,name,url}]/active
 * @return string 无子栏目时返回空串（模板据此不渲染侧栏）
 */
function list_side_html($side) {
    if (!is_array($side) || empty($side['cols']) || !is_array($side['cols'])) return '';
    $active = isset($side['active']) ? (int)$side['active'] : 0;
    $html  = '<div class="yk-lside">';
    $html .= '<div class="yk-lside-tt"><a href="' . e(isset($side['url']) ? $side['url'] : '#') . '">'
           . e(isset($side['title']) ? $side['title'] : '栏目分类') . '</a></div>';
    $html .= '<ul>';
    foreach ($side['cols'] as $c) {
        $on = (int)$c['id'] === $active ? ' class="on"' : '';
        $html .= '<li><a' . $on . ' href="' . e($c['url']) . '">' . e($c['name']) . '</a></li>';
    }
    return $html . '</ul></div>';
}
