<?php
require __DIR__ . '/../../app/bootstrap.php';
require __DIR__ . '/../../app/admin-sidebar.php';
require_login();

$adminName = isset($_SESSION['admin_name']) ? (string)$_SESSION['admin_name'] : 'Admin';
$adminUsername = isset($_SESSION['admin_username']) ? (string)$_SESSION['admin_username'] : 'admin';
$avatarText = strtoupper(substr($adminName !== '' ? $adminName : 'A', 0, 1));

$config = app_runtime_config();
$currentToken = isset($config['task_runner_token']) ? trim((string)$config['task_runner_token']) : '';
$schedulerUrl = task_runner_absolute_url();
$nginxRewritePath = __DIR__ . '/../../nginx-rewrite.conf';
$apacheRewritePath = __DIR__ . '/../../.htaccess';
$nginxStaticExamplePath = __DIR__ . '/../../nginx.static.conf.example';

$tab = isset($_GET['tab']) ? trim((string)$_GET['tab']) : 'quickstart';
$validTabs = array('quickstart', 'scheduler', 'rewrite', 'troubleshoot', 'fonts');
if (!in_array($tab, $validTabs, true)) {
    $tab = 'quickstart';
}
?><!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?php echo e(APP_NAME); ?> - 使用帮助</title>
    <link rel="stylesheet" href="/assets/css/admin-ui.css">
</head>
<body>
<div class="admin-shell">
    <?php render_admin_sidebar('help', $adminName, $adminUsername, $avatarText); ?>
    <main class="admin-content">
        <div class="content-wrap">
            <header class="topbar">
                <div>
                    <h1>使用帮助</h1>
                    <p>平台常用操作指引、部署配置说明与常见问题排错。</p>
                </div>
            </header>

            <nav class="help-tabs section-tabs">
                <a class="<?php echo $tab === 'quickstart' ? 'active' : ''; ?>" href="/admin/help/index.php?tab=quickstart">快速入门</a>
                <a class="<?php echo $tab === 'scheduler' ? 'active' : ''; ?>" href="/admin/help/index.php?tab=scheduler">任务调度</a>
                <a class="<?php echo $tab === 'rewrite' ? 'active' : ''; ?>" href="/admin/help/index.php?tab=rewrite">伪静态规则</a>
                <a class="<?php echo $tab === 'troubleshoot' ? 'active' : ''; ?>" href="/admin/help/index.php?tab=troubleshoot">常见问题</a>
                <a class="<?php echo $tab === 'fonts' ? 'active' : ''; ?>" href="/admin/help/index.php?tab=fonts">字体管理</a>
            </nav>

            <?php if ($tab === 'quickstart'): ?>
                <section class="page-card help-card">
                    <div class="card-head"><div><h2>快速入门</h2><p>建议按以下顺序完成初始配置，一套域名最快 5 分钟即可完成首次建站。</p></div></div>
                    <ol class="help-steps">
                        <li>
                            <strong>配置 AI 模型</strong>
                            <p>进入 <a href="/admin/ai-model/list.php">AI 模型</a>，添加至少一个启用中的模型（需填写供应商、模型名、API 地址与密钥），并点击"测试"确认可用。</p>
                        </li>
                        <li>
                            <strong>维护模板</strong>
                            <p>进入 <a href="/admin/template-pack/list.php">模板套件</a>，确认至少有一个模板套件可用。套件包含首页、文章页、栏目页、页眉页脚和样式，域名绑定后统一风格。</p>
                        </li>
                        <li>
                            <strong>接入域名</strong>
                            <p>进入 <a href="/admin/domain/list.php">域名管理</a>，添加域名并设置站点根目录（必须存在且可写），绑定默认模板。可点击"检测目录"确认通过。</p>
                        </li>
                        <li>
                            <strong>发起一键建站</strong>
                            <p>进入 <a href="/admin/site-build/index.php">一键建站</a>，选择域名、模板、模型，填入关键词，即可批量生成首页或文章。</p>
                        </li>
                        <li>
                            <strong>配置调度器（可选）</strong>
                            <p>如需自动化批量生成，推荐在宝塔添加 Shell 脚本类型计划任务，直接调用 CLI Runner。无需 Token，稳定可靠。详细步骤见本页"<a href="/admin/help/index.php?tab=scheduler">任务调度</a>"标签。</p>
                        </li>
                        <li>
                            <strong>配置伪静态</strong>
                            <p>为了让 <code>/tiyu/</code>、<code>/articles/</code>、<code>/xxx.html</code> 等 URL 可访问，需要在 Nginx / Apache / IIS 下配置伪静态规则。详见"伪静态规则"标签。</p>
                        </li>
                    </ol>
                </section>

                <section class="page-card help-card">
                    <div class="card-head"><div><h2>核心概念</h2><p>理解这些概念可以显著减少配置失误。</p></div></div>
                    <div class="help-concept-grid">
                        <div><strong>域名</strong><p>每个域名对应一个独立站点目录，可绑定不同模板与菜单，完全隔离。</p></div>
                        <div><strong>模板</strong><p>分首页模板和文章模板两类，可在多个域名间复用。</p></div>
                        <div><strong>菜单</strong><p>按域名维护站点导航栏与栏目 SEO 信息，首页菜单会出现在首页导航。</p></div>
                        <div><strong>AI 模型</strong><p>用于文章生成与标题生成，建议至少配置 2 个以便容灾切换。</p></div>
                        <div><strong>建站任务</strong><p>一次批量执行单元，可包含多个域名与关键词；按任务跟踪成功 / 失败。</p></div>
                        <div><strong>静态发布</strong><p>将 PHP 动态渲染结果落盘为 HTML，提高访问速度与收录率。</p></div>
                    </div>
                </section>
            <?php endif; ?>

            <?php if ($tab === 'scheduler'): ?>
                <?php $cliScriptPath = str_replace('\\', '/', dirname(__FILE__, 3)) . '/admin/cli/article-task-runner-cli.php'; ?>

                <section class="page-card help-card">
                    <div class="card-head"><div><h2>推荐方式：CLI 调度（Shell 脚本）</h2><p>通过 PHP CLI 直接执行任务脚本，无需 HTTP 请求，不受 Nginx 超时限制，最稳定可靠。</p></div></div>
                    <div class="help-body">
                        <p><strong>第 1 步：</strong>登录宝塔面板，进入"计划任务"。</p>
                        <p><strong>第 2 步：</strong>任务类型选择 <strong>Shell 脚本</strong>，执行周期设为 <strong>每 1 分钟</strong>。</p>
                        <p><strong>第 3 步：</strong>脚本内容填入：</p>
                        <pre class="help-code">php <?php echo e($cliScriptPath); ?></pre>
                        <p><strong>第 4 步：</strong>保存后手动执行一次，查看宝塔任务日志确认输出正常。</p>
                        <p><strong>第 5 步：</strong>验证结果——在"一键建站"的文章任务区看到"最近调度"时间刷新，即表示自动执行成功。</p>
                    </div>
                    <div class="table-note" style="margin-top:14px;padding:14px 16px;background:rgba(99,102,241,.06);border-radius:10px;border:1px solid rgba(99,102,241,.15);">
                        <p style="margin:0;font-size:12.5px;color:#6366f1;line-height:1.8;">
                            <strong>优势说明：</strong><br>
                            · 无需配置 Token，CLI 模式下自动通过本地鉴权<br>
                            · 不受 Nginx / HTTP 超时限制，AI 生成耗时长也不会中断<br>
                            · 内置文件锁，多个 cron 并发调用不会重复执行<br>
                            · 运行日志自动写入 <code>runtime/article-task-runner.log</code>
                        </p>
                    </div>
                </section>

                <section class="page-card help-card">
                    <div class="card-head"><div><h2>Linux crontab 示例</h2><p>不使用宝塔时可直接使用系统 crontab。</p></div></div>
                    <pre class="help-code">* * * * * php <?php echo e($cliScriptPath); ?> >> /dev/null 2>&1</pre>
                </section>

                <section class="page-card help-card">
                    <div class="card-head"><div><h2>备选方式：HTTP 调度</h2><p>如需通过 HTTP 请求触发（如第三方监控平台），需先在 <a href="settings.php?tab=scheduler">系统设置 · 任务调度</a> 生成 Token。</p></div></div>
                    <div class="help-body">
                        <p><strong>请求地址：</strong></p>
                        <pre class="help-code"><?php echo e($schedulerUrl); ?></pre>
                        <p><strong>请求方式：</strong>POST，参数：</p>
                        <pre class="help-code">limit=1&token=<?php echo e($currentToken !== '' ? $currentToken : '<请先在系统设置中生成 Token>'); ?></pre>
                        <p style="font-size:12.5px;color:#94a3b8;margin-top:8px;">Token 也可通过请求头 <code>X-Task-Token</code> 传递。注意：HTTP 方式受 Nginx <code>fastcgi_read_timeout</code> 限制，长时间 AI 生成可能超时。</p>
                    </div>
                </section>
            <?php endif; ?>

            <?php if ($tab === 'rewrite'): ?>
                <section class="page-card help-card">
                    <div class="card-head"><div><h2>伪静态规则</h2><p>伪静态相关配置已迁移至系统设置。</p></div></div>
                    <div class="help-body" style="text-align:center;padding:32px 0;">
                        <p style="font-size:15px;color:#475569;margin:0 0 16px;">伪静态开关、URL 规则说明和 Nginx / Apache / IIS 规则已迁移到：</p>
                        <a class="btn-primary" href="/admin/settings/index.php?tab=optimization&sub=pseudo_static" style="display:inline-block;padding:12px 28px;text-decoration:none;">前往 系统优化 · 伪静态</a>
                    </div>
                </section>
            <?php endif; ?>

            <?php if ($tab === 'troubleshoot'): ?>
                <section class="page-card help-card">
                    <div class="card-head"><div><h2>常见问题</h2><p>按出现频率排序，建议先从第一个开始排查。</p></div></div>
                    <div class="help-faq">
                        <details open>
                            <summary>首页或文章页 404 / 打不开</summary>
                            <p>多半是伪静态未配置。请前往 <a href="/admin/settings/index.php?tab=optimization&sub=pseudo_static">系统设置 · 系统优化 · 伪静态</a> 复制规则，或查看 <code>nginx-rewrite.conf</code> 手动粘贴。</p>
                        </details>
                        <details>
                            <summary>静态发布失败：目录不可写</summary>
                            <p>进入域名管理点击"检测目录"确认 PHP 对该目录有写权限。Linux 下可执行 <code>chown -R www:www 站点目录</code>。</p>
                        </details>
                        <details>
                            <summary>AI 生成调用失败 / 超时</summary>
                            <p>检查 AI 模型配置：API 地址、密钥、Request 格式是否与实际供应商一致，可在 AI 模型页点击"测试"快速验证。</p>
                        </details>
                        <details>
                            <summary>定时任务不执行</summary>
                            <p>推荐使用 <strong>CLI 调度</strong>（Shell 脚本）方式，避免 HTTP 超时和宝塔 curl 兼容问题。检查步骤：</p>
                            <ol style="margin:8px 0 0;padding-left:20px;font-size:13px;line-height:1.8;">
                                <li>确认宝塔计划任务类型为"Shell 脚本"，脚本内容为 <code>php 站点路径/admin/cli/article-task-runner-cli.php</code></li>
                                <li>手动执行一次计划任务，查看宝塔执行日志是否有输出</li>
                                <li>检查 <code>runtime/article-task-runner.log</code> 是否有记录</li>
                                <li>如果任务状态卡在 <code>running</code>，系统会在 10 分钟后自动恢复</li>
                            </ol>
                        </details>
                        <details>
                            <summary>模板改了但页面不变</summary>
                            <p>页面已静态化或存在缓存，可在内容管理中重新执行"全量静态发布"覆盖旧 HTML。</p>
                        </details>
                        <details>
                            <summary>SQL 报错 / 表缺失</summary>
                            <p>确认已导入 <code>database/*.sql</code>，并核对 <code>app/config.php</code> 中数据库账号密码。</p>
                        </details>
                    </div>
                </section>
            <?php endif; ?>

            <?php if ($tab === 'fonts'): ?>
                <section class="page-card help-card">
                    <div class="card-head"><div><h2>字体管理</h2><p>管理标题图生成所需的字体，支持中文、日文、韩文等多语言。</p></div></div>
                    <div style="line-height: 1.8; color: #475569;">
                        <h3 style="margin-top: 16px; margin-bottom: 8px; color: #0f172a;">字体检查</h3>
                        <p>系统会自动检查项目内 <code>assets/fonts/</code> 目录中的字体文件。以下是当前检查结果：</p>
                        
                        <?php
                        $notoProjectPath = __DIR__ . '/../../assets/fonts/NotoSansCJK-Regular.ttc';
                        $msyhProjectPath = __DIR__ . '/../../assets/fonts/msyh.ttc';
                        $msyhProjectPath2 = __DIR__ . '/../../assets/fonts/msyh.ttf';
                        $simheiProjectPath = __DIR__ . '/../../assets/fonts/simhei.ttf';
                        $simsunProjectPath = __DIR__ . '/../../assets/fonts/simsun.ttc';
                        
                        $fonts = array(
                            array('name' => 'Noto Sans CJK', 'exists' => is_file($notoProjectPath), 'path' => 'NotoSansCJK-Regular.ttc', 'priority' => '高', 'languages' => '中文、日文、韩文'),
                            array('name' => 'Microsoft YaHei', 'exists' => is_file($msyhProjectPath) || is_file($msyhProjectPath2), 'path' => 'msyh.ttc / msyh.ttf', 'priority' => '中', 'languages' => '中文、日文、韩文（支持不佳）'),
                            array('name' => 'SimHei', 'exists' => is_file($simheiProjectPath), 'path' => 'simhei.ttf', 'priority' => '低', 'languages' => '中文'),
                            array('name' => 'SimSun', 'exists' => is_file($simsunProjectPath), 'path' => 'simsun.ttc', 'priority' => '低', 'languages' => '中文'),
                        );
                        ?>
                        
                        <table style="width: 100%; border-collapse: collapse; margin: 12px 0; font-size: 13px;">
                            <thead>
                                <tr style="background: #f1f5f9; border-bottom: 1px solid rgba(148,163,184,0.16);">
                                    <th style="padding: 8px; text-align: left; font-weight: 600; color: #334155;">字体名称</th>
                                    <th style="padding: 8px; text-align: left; font-weight: 600; color: #334155;">文件</th>
                                    <th style="padding: 8px; text-align: left; font-weight: 600; color: #334155;">支持语言</th>
                                    <th style="padding: 8px; text-align: center; font-weight: 600; color: #334155;">状态</th>
                                    <th style="padding: 8px; text-align: center; font-weight: 600; color: #334155;">操作</th>
                                </tr>
                            </thead>
                            <tbody>
                                <?php 
                                $fontDownloads = array(
                                    'Noto Sans CJK' => 'noto-cjk',
                                    'Microsoft YaHei' => 'msyh',
                                    'SimHei' => 'simhei',
                                    'SimSun' => 'simsun',
                                );
                                ?>
                                <?php foreach ($fonts as $font): ?>
                                <tr style="border-bottom: 1px solid rgba(148,163,184,0.08);">
                                    <td style="padding: 8px; color: #0f172a;"><strong><?php echo e($font['name']); ?></strong></td>
                                    <td style="padding: 8px; color: #64748b; font-family: monospace; font-size: 12px;"><?php echo e($font['path']); ?></td>
                                    <td style="padding: 8px; color: #64748b;"><?php echo e($font['languages']); ?></td>
                                    <td style="padding: 8px; text-align: center;">
                                        <span class="font-status-badge" data-font="<?php echo e($font['name']); ?>" style="display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; font-weight: 600; <?php echo $font['exists'] ? 'background: rgba(34,197,94,0.1); color: #15803d;' : 'background: rgba(220,38,38,0.1); color: #b91c1c;'; ?>">
                                            <?php echo $font['exists'] ? '✓ 已安装' : '✗ 未安装'; ?>
                                        </span>
                                    </td>
                                    <td style="padding: 8px; text-align: center;">
                                        <?php if (isset($fontDownloads[$font['name']])): ?>
                                            <button class="font-download-btn" data-font-key="<?php echo e($fontDownloads[$font['name']]); ?>" data-font-name="<?php echo e($font['name']); ?>" style="padding: 4px 12px; border-radius: 6px; background: #4f46e5; color: white; border: none; font-size: 12px; font-weight: 600; cursor: pointer; transition: background 0.2s;" onmouseover="this.style.background='#4338ca'" onmouseout="this.style.background='#4f46e5'">↓ 下载</button>
                                        <?php else: ?>
                                            <span style="color: #94a3b8; font-size: 12px;">-</span>
                                        <?php endif; ?>
                                    </td>
                                </tr>
                                <?php endforeach; ?>
                            </tbody>
                        </table>

 
                        <h3 style="margin-top: 20px; margin-bottom: 8px; color: #0f172a;">常见问题</h3>
                        <details style="margin-bottom: 12px;">
                            <summary style="cursor: pointer; font-weight: 600; color: #0f172a;">Q: 为什么韩文标题图显示乱码？</summary>
                            <p style="margin-top: 8px; color: #475569;">A: 微软雅黑虽然包含韩文字符，但 GD 库对韩文的渲染支持有限。建议安装 Noto Sans CJK 字体，它提供了最佳的多语言支持。</p>
                        </details>
                        <details style="margin-bottom: 12px;">
                            <summary style="cursor: pointer; font-weight: 600; color: #0f172a;">Q: 安装字体后仍然不生效？</summary>
                            <p style="margin-top: 8px; color: #475569;">A: 需要重启 PHP 服务或 Web 服务器。在 Linux 上，还需要运行 <code style="background: #f1f5f9; padding: 2px 6px; border-radius: 4px;">sudo fc-cache -fv</code> 刷新字体缓存。</p>
                        </details>
                        <details style="margin-bottom: 12px;">
                            <summary style="cursor: pointer; font-weight: 600; color: #0f172a;">Q: 可以把字体放在项目目录吗？</summary>
                            <p style="margin-top: 8px; color: #475569;">A: 可以。将字体放到 <code style="background: #f1f5f9; padding: 2px 6px; border-radius: 4px;">assets/fonts/</code> 目录，系统会自动检测并使用。这样做的好处是字体随项目部署，不依赖系统字体。</p>
                        </details>
                    </div>
                </section>
            <?php endif; ?>
        </div>
    </main>
</div>
<script>
var nginxRewriteRules = <?php echo json_encode(file_exists($nginxRewritePath) ? trim((string)file_get_contents($nginxRewritePath)) : '', JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?>;
var apacheRewriteRules = <?php echo json_encode(file_exists($apacheRewritePath) ? trim((string)file_get_contents($apacheRewritePath)) : '', JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?>;
function copyRewriteRules(type) {
    var text = type === 'apache' ? apacheRewriteRules : nginxRewriteRules;
    if (!text) { alert('未找到可复制的规则内容。'); return; }
    if (navigator.clipboard && navigator.clipboard.writeText) {
        navigator.clipboard.writeText(text).then(function () {
            alert(type === 'apache' ? 'Apache 规则已复制。' : 'Nginx 规则已复制。');
        }).catch(function () { fallbackCopy(text, type); });
        return;
    }
    fallbackCopy(text, type);
}
function fallbackCopy(text, type) {
    var ta = document.createElement('textarea');
    ta.value = text;
    ta.setAttribute('readonly', 'readonly');
    ta.style.position = 'absolute';
    ta.style.left = '-9999px';
    document.body.appendChild(ta);
    ta.select();
    document.execCommand('copy');
    document.body.removeChild(ta);
    alert(type === 'apache' ? 'Apache 规则已复制。' : 'Nginx 规则已复制。');
}

// 字体下载处理
document.querySelectorAll('.font-download-btn').forEach(function(btn) {
    btn.addEventListener('click', function() {
        var fontKey = this.getAttribute('data-font-key');
        var fontName = this.getAttribute('data-font-name');
        var originalText = this.textContent;
        var originalBg = this.style.background;
        
        this.disabled = true;
        this.textContent = '下载中...';
        this.style.background = '#94a3b8';
        
        fetch('/admin/api/font-download.php?action=download&font=' + encodeURIComponent(fontKey))
            .then(function(res) { return res.json(); })
            .then(function(data) {
                if (data.ok) {
                    // 更新状态徽章
                    var badge = document.querySelector('[data-font="' + fontName + '"]');
                    if (badge) {
                        badge.textContent = '✓ 已安装';
                        badge.style.background = 'rgba(34,197,94,0.1)';
                        badge.style.color = '#15803d';
                    }
                    alert('字体下载成功！' + (data.size ? '（' + (data.size / 1024 / 1024).toFixed(2) + ' MB）' : ''));
                } else {
                    alert('下载失败：' + (data.error || '未知错误'));
                }
            })
            .catch(function(err) {
                alert('请求失败：' + (err && err.message ? err.message : '网络错误'));
            })
            .finally(function() {
                btn.disabled = false;
                btn.textContent = originalText;
                btn.style.background = originalBg;
            });
    });
});
</script>
<script src="/assets/js/admin-ui.js"></script>
</body>
</html>
