<?php
/**
 * 炎酷CMS - 一键安装向导（单文件）
 * 兼容 PHP 7.4 ~ 8.2，不依赖任何外部资源与框架。
 * 流程：已安装检测 → 1 许可协议 → 2 环境检测 → 3 目录权限校验
 *      → 4 数据库与管理员表单 → 5 执行安装（建表/演示数据/config.php/管理员/锁定自删除）→ 6 完成
 * 安装完成后会尝试自删除本文件。
 */
session_start();

define('YK_INSTALL_DIR', dirname(__DIR__));
$YK_LOCK_FILE   = YK_INSTALL_DIR . '/data/install.lock';
$YK_CONFIG_FILE = YK_INSTALL_DIR . '/data/config.php';

/* ---------------- 工具函数 ---------------- */

function h($str) {
    return htmlspecialchars((string)$str, ENT_QUOTES, 'UTF-8');
}

function install_redirect($step) {
    header('Location: install.php?step=' . intval($step));
    exit;
}

/** 页面头部（含内联样式与步骤条） */
function install_header($step) {
    $steps = array(1 => '许可协议', 2 => '环境检测', 3 => '目录权限', 4 => '数据库设置', 5 => '执行安装', 6 => '安装完成');
    echo '<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">';
    echo '<meta name="viewport" content="width=device-width, initial-scale=1">';
    echo '<title>炎酷CMS 安装向导</title>';
    echo '<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:"Microsoft YaHei","PingFang SC",sans-serif;background:#f0f2f5;color:#333;font-size:14px;line-height:1.7}
.wrap{max-width:760px;margin:40px auto;padding:0 15px}
.card{background:#fff;border-radius:8px;box-shadow:0 2px 12px rgba(0,0,0,.08);overflow:hidden}
.head{background:#2f54eb;color:#fff;padding:18px 28px;font-size:20px;font-weight:600}
.steps{display:flex;border-bottom:1px solid #eee;background:#fafafa}
.steps li{flex:1;list-style:none;text-align:center;padding:12px 4px;color:#999;border-bottom:3px solid transparent;font-size:13px}
.steps li.cur{color:#2f54eb;border-bottom-color:#2f54eb;font-weight:600}
.steps li.done{color:#52c41a}
.body{padding:28px}
h2{font-size:17px;margin-bottom:16px;padding-bottom:10px;border-bottom:1px solid #f0f0f0}
table{width:100%;border-collapse:collapse;margin-bottom:16px}
th,td{padding:9px 12px;border:1px solid #f0f0f0;text-align:left}
th{background:#fafafa;width:38%;font-weight:600}
.ok{color:#52c41a;font-weight:700}
.bad{color:#f5222d;font-weight:700}
.alert{padding:12px 16px;border-radius:6px;margin-bottom:16px}
.alert-err{background:#fff1f0;border:1px solid #ffa39e;color:#cf1322}
.alert-ok{background:#f6ffed;border:1px solid #b7eb8f;color:#389e0d}
.alert-tip{background:#e6f7ff;border:1px solid #91d5ff;color:#0958d9}
.form-row{margin-bottom:16px}
.form-row label{display:block;margin-bottom:6px;font-weight:600}
.form-row input{width:100%;padding:9px 12px;border:1px solid #d9d9d9;border-radius:5px;font-size:14px}
.form-row input:focus{border-color:#2f54eb;outline:none;box-shadow:0 0 0 2px rgba(47,84,235,.15)}
.agree-row{display:flex;align-items:center;gap:8px;margin-top:14px;font-weight:600}
.agree-row input{width:auto}
.btn{display:inline-block;background:#2f54eb;color:#fff;border:none;padding:10px 34px;font-size:15px;border-radius:5px;cursor:pointer;text-decoration:none}
.btn:hover{background:#1d39c4}
.btn-gray{background:#8c8c8c}
.actions{margin-top:22px;text-align:right}
.log{background:#fafafa;border:1px solid #f0f0f0;border-radius:6px;padding:14px 18px;margin-bottom:14px}
.log p{padding:3px 0}
.foot{text-align:center;color:#bbb;font-size:12px;padding:14px}
code{background:#f5f5f5;padding:2px 7px;border-radius:4px;color:#c41d7f}
.license{height:320px;overflow-y:auto;border:1px solid #e8e8e8;border-radius:6px;background:#fafafa;padding:16px 20px;font-size:13px;color:#555}
.license h3{font-size:14px;color:#333;margin:14px 0 6px}
.license p{margin-bottom:8px}
fieldset{border:1px solid #f0f0f0;border-radius:6px;padding:16px 18px;margin-bottom:18px}
legend{font-weight:600;padding:0 8px;color:#2f54eb}
</style></head><body><div class="wrap"><div class="card">';
    echo '<div class="head">炎酷CMS 安装向导</div><ul class="steps">';
    foreach ($steps as $i => $name) {
        $cls = ($i == $step) ? 'cur' : (($i < $step) ? 'done' : '');
        echo '<li class="' . $cls . '">' . $i . '. ' . h($name) . '</li>';
    }
    echo '</ul><div class="body">';
}

function install_footer() {
    echo '</div></div><div class="foot">炎酷CMS &copy; ' . date('Y') . ' 版权所有</div></div></body></html>';
}

/** 安装完成 / 已安装 页面 */
function render_done($admin_user, $self_deleted, $already) {
    install_header(6);
    echo '<h2>' . ($already ? '系统已安装' : '安装成功') . '</h2>';
    echo '<div class="alert alert-ok">炎酷CMS ' . ($already ? '此前已经完成安装，请勿重复安装。' : '已成功安装，感谢使用！') . '</div>';
    echo '<table>';
    echo '<tr><th>前台地址</th><td><a href="/" target="_blank">/</a></td></tr>';
    echo '<tr><th>后台地址</th><td><a href="/admin/login.php" target="_blank">/admin/login.php</a></td></tr>';
    if ($admin_user !== '') {
        echo '<tr><th>初始账号</th><td>' . h($admin_user) . '（密码为您安装时设置的密码）</td></tr>';
    }
    echo '</table>';
    if ($self_deleted) {
        echo '<div class="alert alert-ok">安装程序 install.php 已自动删除。</div>';
    } else {
        echo '<div class="alert alert-err"><b>安全提醒：</b>安装程序 install.php 未能自动删除，请立即登录服务器手动删除站点根目录下的 <code>install.php</code>，以防被他人重复安装！</div>';
    }
    echo '<div class="alert alert-tip">如需重新安装，请删除 <code>data/install.lock</code> 和 <code>data/config.php</code> 后重新访问 install.php。</div>';
    echo '<div class="actions"><a class="btn" href="/">访问首页</a> <a class="btn btn-gray" href="/admin/login.php">进入后台</a></div>';
    install_footer();
    exit;
}

/* ---------------- 已安装检测 ---------------- */

if (is_file($YK_LOCK_FILE) || is_file($YK_CONFIG_FILE)) {
    $deleted = !is_file(__FILE__);
    render_done('', $deleted, true);
}

$step = isset($_GET['step']) ? intval($_GET['step']) : 1;
if ($step < 1 || $step > 6) $step = 1;

// 未同意许可协议时，仅允许停留在第 1 步
if ($step > 1 && empty($_SESSION['yk_agree'])) {
    install_redirect(1);
}

/* ================= step 1：许可协议 ================= */
if ($step == 1) {
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if (!empty($_POST['agree'])) {
            $_SESSION['yk_agree'] = 1;
            install_redirect(2);
        }
    }
    install_header(1);
    echo '<h2>炎酷CMS 软件许可协议</h2>';
    echo '<div class="license">';
    echo '<p>感谢您选择炎酷CMS网站内容管理系统（以下简称“本软件”）。在开始安装、使用本软件前，请您仔细阅读本许可协议全部条款。您下载、安装、使用、二次开发本软件，即表示您已充分阅读、理解并自愿接受本协议所有约束条款。若您不认可本协议任意条款，请立即停止安装及使用本软件。</p>';
    echo '<h3>一、授权范围（免费开源商用）</h3>';
    echo '<p>本软件为永久免费开源系统，著作权人向所有用户开放无门槛使用授权，具体授权内容如下：</p>';
    echo '<p>1. 免费使用：所有个人、企业、机构均可免费安装、部署本软件，可用于个人网站、商业网站、公益项目等任意合法场景，无任何使用付费、授权年费等费用。</p>';
    echo '<p>2. 免费升级：本软件所有后续版本更新、功能迭代、漏洞修复等升级服务，均对用户永久免费，用户可自主在后台或官方渠道完成升级。</p>';
    echo '<p>3. 自由部署：用户可在单个或多个站点、服务器环境中安装使用本软件，无站点数量、域名数量限制。</p>';
    echo '<p>4. 自定义调整：用户可根据自身业务需求，自由修改、调整本软件的模板、界面、样式、布局等前端展示内容。</p>';
    echo '<p>5. 允许二次开发：用户可基于本软件源代码进行任意二次开发、功能拓展、功能改造、程序优化，适配自身个性化使用需求。</p>';
    echo '<h3>二、使用规范与限制</h3>';
    echo '<p>为保障软件合规运行、维护网络秩序，用户使用本软件及二次开发版本需遵守以下规范：</p>';
    echo '<p>1. 用户可对本软件源代码进行查看、修改、二次开发、适配定制，无需向著作权人提交书面申请、无需支付任何费用。</p>';
    echo '<p>2. 用户不得利用本软件（含二次开发后的衍生版本）从事任何违反国家法律法规、公序良俗的活动，包括但不限于发布违法违规信息、侵权内容、诈骗引流、恶意攻击、传播不良信息等一切违规违法行为。</p>';
    echo '<p>3. 基础版权保留规范：未经著作权人书面许可，禁止用户删除、篡改、屏蔽本软件程序内核底层官方版权标识；用户二次开发新增功能、自定义模板、自定义页面可自主标注个人/企业版权，不受限制。</p>';
    echo '<p>4. 禁止将本软件原版或二次开发后的版本进行单独售卖、授权倒卖、付费共享、打包收费等商业倒卖行为。</p>';
    echo '<h3>三、知识产权说明</h3>';
    echo '<p>1. 本软件原始版本的全部知识产权（包括但不限于著作权、源代码版权、商标权、软件专属权益）均归炎酷CMS著作权人所有。</p>';
    echo '<p>2. 本协议为免费公开授权协议，授权用户永久免费使用、二次开发本软件，但不代表本软件原始知识产权发生转让、售卖或转移。</p>';
    echo '<p>3. 用户基于本软件二次开发产生的新增功能、定制代码、个性化适配内容，版权归开发使用者所有，著作权人不享有相关权益。</p>';
    echo '<h3>四、免责声明</h3>';
    echo '<p>1. 本软件按“现状开源免费提供”，著作权人不针对本软件作出任何明示或默示的担保，包括但不限于软件的稳定性、兼容性、适销性、特定用途适用性等相关担保。</p>';
    echo '<p>2. 本软件为免费开源工具，用户自愿安装、使用、二次开发。因使用本软件、软件升级、二次开发修改、服务器环境问题、第三方插件兼容等原因造成的直接或间接损失（包括但不限于数据丢失、业务中断、网站故障、侵权纠纷等），软件著作权人不承担任何法律责任与经济责任。</p>';
    echo '<p>3. 用户需自行承担网站运营、数据安全、日常维护、定期备份的责任，建议用户定期通过后台【系统工具 → 数据备份】功能备份网站数据，防范数据丢失风险。</p>';
    echo '<p>4. 对于用户违规使用、私自篡改内核、恶意二次开发导致的一切处罚、纠纷、损失，均由用户自行承担全部责任。</p>';
    echo '<h3>五、协议变更与终止</h3>';
    echo '<p>1. 著作权人有权根据行业规范、法律法规更新修订本协议条款，修订后的协议将随软件新版本同步公示，持续使用软件即视为认可更新后的协议内容。</p>';
    echo '<p>2. 若用户违反本协议第二条使用规范，本软件使用授权将自动终止，著作权人有权追责，用户需立即停止使用、删除本软件及相关衍生版本。</p>';
    echo '<h3>六、其他说明</h3>';
    echo '<p>1. 本协议最终解释权归炎酷CMS软件著作权人所有。</p>';
    echo '<p>2. 凡使用本软件的所有用户，均视为已知晓并同意本协议全部条款。</p>';
    echo '<p style="margin-top:14px;color:#999">若您不同意本协议任意条款，请立即关闭页面，停止安装并删除本软件全部相关文件。</p>';
    echo '</div>';
    echo '<form method="post" action="install.php?step=1">';
    echo '<div class="agree-row"><input type="checkbox" name="agree" id="agree" value="1"><label for="agree" style="margin:0">我已阅读并同意《炎酷CMS 软件许可协议》</label></div>';
    echo '<div class="actions"><button class="btn" type="submit">同意并继续安装</button></div>';
    echo '</form>';
    install_footer();
    exit;
}

/* ================= step 2：环境检测 ================= */
if ($step == 2) {
    $checks = array();
    $checks[] = array(
        'name' => 'PHP 版本 ≥ 7.4',
        'pass' => version_compare(PHP_VERSION, '7.4.0', '>='),
        'info' => '当前版本 ' . PHP_VERSION,
        'fix'  => '请在宝塔面板【软件商店】安装 PHP 7.4 或以上版本，并将本站点的 PHP 版本切换过去。',
    );
    $checks[] = array(
        'name' => 'pdo_mysql 扩展',
        'pass' => extension_loaded('pdo_mysql'),
        'info' => extension_loaded('pdo_mysql') ? '已加载' : '未加载',
        'fix'  => '请在宝塔 PHP 管理中安装/启用 pdo_mysql 扩展后重启 PHP。',
    );
    $all_pass = true;
    foreach ($checks as $c) { if (!$c['pass']) { $all_pass = false; break; } }

    install_header(2);
    echo '<h2>运行环境检测</h2>';
    echo '<table><tr><th>检测项目</th><td><b>检测结果</b></td></tr>';
    foreach ($checks as $c) {
        echo '<tr><th>' . h($c['name']) . '</th><td>';
        echo $c['pass'] ? '<span class="ok">√</span>' : '<span class="bad">×</span>';
        echo ' ' . h($c['info']);
        if (!$c['pass']) echo '<br><span class="bad">修复提示：' . $c['fix'] . '</span>';
        echo '</td></tr>';
    }
    echo '</table>';
    if ($all_pass) {
        echo '<div class="alert alert-ok">恭喜，运行环境检测通过。</div>';
        echo '<div class="actions"><a class="btn btn-gray" href="install.php?step=1">上一步</a> <a class="btn" href="install.php?step=3">下一步</a></div>';
    } else {
        echo '<div class="alert alert-err">存在未通过的检测项，请按上方提示修复后刷新本页重新检测。</div>';
        echo '<div class="actions"><a class="btn btn-gray" href="install.php?step=2">重新检测</a></div>';
    }
    install_footer();
    exit;
}

/* ================= step 3：目录权限校验 ================= */
if ($step == 3) {
    $checks = array();
    foreach (array('public/uploads', 'cache', 'data') as $dir) {
        $path = YK_INSTALL_DIR . '/' . $dir;
        if (!is_dir($path)) {
            @mkdir($path, 0755, true);
        }
        $ok = is_dir($path) && is_writable($path);
        $checks[] = array(
            'name' => $dir . '/ 目录可写',
            'pass' => $ok,
            'info' => $ok ? '可写' : (is_dir($path) ? '不可写' : '目录不存在且无法自动创建'),
            'fix'  => '请执行：chmod -R 755 ' . h($path) . ' 并将目录所有者改为 www（宝塔面板文件管理中可修改权限）。',
        );
    }
    // 站点根目录需可写（安装后自删除 install.php）
    $root_ok = is_writable(YK_INSTALL_DIR);
    $checks[] = array(
        'name' => '站点根目录可写（用于安装后自删除 install.php）',
        'pass' => $root_ok,
        'info' => $root_ok ? '可写' : '不可写',
        'fix'  => '不影响安装本身，但安装完成后需手动删除 install.php。建议执行：chmod 755 ' . h(YK_INSTALL_DIR),
    );
    $all_pass = true;
    foreach ($checks as $c) { if (!$c['pass']) { $all_pass = false; break; } }
    // 根目录不可写不阻断安装，只给出提醒
    $must_pass = $checks[0]['pass'] && $checks[1]['pass'] && $checks[2]['pass'];

    install_header(3);
    echo '<h2>目录权限校验</h2>';
    echo '<table><tr><th>校验项目</th><td><b>校验结果</b></td></tr>';
    foreach ($checks as $c) {
        echo '<tr><th>' . h($c['name']) . '</th><td>';
        echo $c['pass'] ? '<span class="ok">√</span>' : '<span class="bad">×</span>';
        echo ' ' . h($c['info']);
        if (!$c['pass']) echo '<br><span class="bad">修复提示：' . $c['fix'] . '</span>';
        echo '</td></tr>';
    }
    echo '</table>';
    if ($must_pass) {
        if (!$root_ok) {
            echo '<div class="alert alert-tip">public/uploads、cache、data 均可写，可以继续安装；但站点根目录不可写，安装完成后请手动删除 install.php。</div>';
        } else {
            echo '<div class="alert alert-ok">目录权限校验通过，可以开始配置数据库。</div>';
        }
        echo '<div class="actions"><a class="btn btn-gray" href="install.php?step=2">上一步</a> <a class="btn" href="install.php?step=4">下一步</a></div>';
    } else {
        echo '<div class="alert alert-err">public/uploads / cache / data 目录必须可写，请按上方提示修复后刷新本页重新校验。</div>';
        echo '<div class="actions"><a class="btn btn-gray" href="install.php?step=3">重新校验</a></div>';
    }
    install_footer();
    exit;
}

/* ================= step 4：数据库与管理员表单 ================= */
if ($step == 4) {
    $err = '';
    $db = array(
        'db_host'   => '127.0.0.1',
        'db_port'   => '3306',
        'db_name'   => '',
        'db_user'   => '',
        'db_pass'   => '',
        'db_prefix' => 'yk_',
    );
    $admin = array('username' => '', 'mobile' => '');
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        foreach ($db as $k => $v) {
            if (isset($_POST[$k])) $db[$k] = trim($_POST[$k]);
        }
        $admin['username'] = isset($_POST['username']) ? trim($_POST['username']) : '';
        $admin['mobile']   = isset($_POST['mobile']) ? trim($_POST['mobile']) : '';
        $pwd  = isset($_POST['password']) ? trim($_POST['password']) : '';
        $pwd2 = isset($_POST['password2']) ? trim($_POST['password2']) : '';

        if ($db['db_host'] === '' || $db['db_name'] === '' || $db['db_user'] === '') {
            $err = '数据库主机、库名、账号不能为空。';
        } elseif (!preg_match('/^\d+$/', $db['db_port']) || intval($db['db_port']) < 1 || intval($db['db_port']) > 65535) {
            $err = '数据库端口必须是 1-65535 之间的数字。';
        } elseif (!preg_match('/^[A-Za-z0-9_]+$/', $db['db_prefix'])) {
            $err = '表前缀只能包含字母、数字和下划线。';
        } elseif (!preg_match('/^[A-Za-z0-9_]+$/', $db['db_name'])) {
            $err = '库名只能包含字母、数字和下划线。';
        } elseif ($admin['username'] === '') {
            $err = '管理员用户名不能为空。';
        } elseif (!preg_match('/^[A-Za-z0-9_]{3,20}$/', $admin['username'])) {
            $err = '管理员用户名需为 3-20 位字母、数字或下划线。';
        } elseif ($pwd === '') {
            $err = '管理员密码不能为空。';
        } elseif (strlen($pwd) < 6) {
            $err = '管理员密码长度至少 6 位。';
        } elseif ($pwd !== $pwd2) {
            $err = '两次输入的管理员密码不一致，请重新输入。';
        } elseif ($admin['mobile'] !== '' && !preg_match('/^1\d{10}$/', $admin['mobile'])) {
            $err = '手机号格式不正确。';
        } else {
            try {
                $pdo = new PDO(
                    'mysql:host=' . $db['db_host'] . ';port=' . intval($db['db_port']) . ';charset=utf8mb4',
                    $db['db_user'], $db['db_pass'],
                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
                );
                // 数据库不存在时尝试创建（账号无权限时报错并提示用户在宝塔中先建库）
                $pdo->exec('CREATE DATABASE IF NOT EXISTS `' . $db['db_name'] . '` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci');
                $pdo->exec('USE `' . $db['db_name'] . '`');
                $_SESSION['yk_db'] = $db;
                $_SESSION['yk_admin'] = array(
                    'username' => $admin['username'],
                    'password' => $pwd,
                    'mobile'   => $admin['mobile'],
                );
                install_redirect(5);
            } catch (PDOException $e) {
                $err = '数据库连接失败：' . $e->getMessage();
            }
        }
    }
    install_header(4);
    echo '<h2>数据库与管理员设置</h2>';
    if ($err !== '') echo '<div class="alert alert-err">' . h($err) . '<br>请确认数据库账号密码正确；若库不存在，请先在宝塔面板【数据库】中创建，或使用有建库权限的账号。</div>';
    echo '<form method="post" action="install.php?step=4">';
    echo '<fieldset><legend>数据库配置</legend>';
    $labels = array(
        'db_host'   => '数据库主机',
        'db_port'   => '端口',
        'db_name'   => '数据库名',
        'db_user'   => '数据库账号',
        'db_prefix' => '表前缀',
    );
    foreach ($labels as $k => $label) {
        echo '<div class="form-row"><label>' . h($label) . '</label>';
        echo '<input type="text" name="' . $k . '" value="' . h($db[$k]) . '"></div>';
    }
    echo '<div class="form-row"><label>数据库密码</label>';
    echo '<input type="password" name="db_pass" value="' . h($db['db_pass']) . '"></div>';
    echo '</fieldset>';
    echo '<fieldset><legend>管理员账号</legend>';
    echo '<div class="form-row"><label>用户名（3-20 位字母、数字或下划线）</label><input type="text" name="username" value="' . h($admin['username']) . '"></div>';
    echo '<div class="form-row"><label>密码（至少 6 位）</label><input type="password" name="password" value=""></div>';
    echo '<div class="form-row"><label>确认密码</label><input type="password" name="password2" value=""></div>';
    echo '<div class="form-row"><label>手机号（选填）</label><input type="text" name="mobile" value="' . h($admin['mobile']) . '"></div>';
    echo '</fieldset>';
    echo '<div class="actions"><a class="btn btn-gray" href="install.php?step=3">上一步</a> <button class="btn" type="submit">开始安装</button></div>';
    echo '</form>';
    install_footer();
    exit;
}

/* ================= step 5：执行安装 ================= */
if ($step == 5) {
    if (empty($_SESSION['yk_db']) || empty($_SESSION['yk_admin'])) install_redirect(4);

    $cfg   = $_SESSION['yk_db'];
    $admin = $_SESSION['yk_admin'];

    install_header(5);
    echo '<h2>正在执行安装</h2><div class="log">';

    try {
        // 1. 连接数据库
        $pdo = new PDO(
            'mysql:host=' . $cfg['db_host'] . ';port=' . intval($cfg['db_port']) . ';dbname=' . $cfg['db_name'] . ';charset=utf8mb4',
            $cfg['db_user'], $cfg['db_pass'],
            array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
        );
        echo '<p><span class="ok">√</span> 数据库连接成功</p>';

        $pre = $cfg['db_prefix'];

        // 2. 执行建表 SQL（CREATE TABLE IF NOT EXISTS，重复执行不会报错）
        $tables = array(
            'config' => "ckey VARCHAR(64) NOT NULL PRIMARY KEY, cvalue TEXT",
            'column' => "id INT AUTO_INCREMENT PRIMARY KEY, pid INT DEFAULT 0, name VARCHAR(100), nav_name VARCHAR(100) DEFAULT '', flag VARCHAR(64) DEFAULT '', intro VARCHAR(500) DEFAULT '', cover VARCHAR(255) DEFAULT '', list_tpl INT DEFAULT 1, content_tpl INT DEFAULT 1, page_size INT DEFAULT 10, seo_title VARCHAR(255) DEFAULT '', seo_keywords VARCHAR(255) DEFAULT '', seo_description VARCHAR(500) DEFAULT '', sort INT DEFAULT 0, status TINYINT DEFAULT 1, is_nav TINYINT DEFAULT 1",
            'article' => "id INT AUTO_INCREMENT PRIMARY KEY, col_id INT DEFAULT 0, title VARCHAR(255), thumb VARCHAR(255) DEFAULT '', photos TEXT, content MEDIUMTEXT, add_time INT DEFAULT 0, is_top TINYINT DEFAULT 0, is_recommend TINYINT DEFAULT 0, views INT DEFAULT 0, seo_title VARCHAR(255) DEFAULT '', seo_keywords VARCHAR(255) DEFAULT '', seo_description VARCHAR(500) DEFAULT '', sort INT DEFAULT 0, status TINYINT DEFAULT 1",
            'page' => "id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), nav_name VARCHAR(100) DEFAULT '', flag VARCHAR(32) UNIQUE, content MEDIUMTEXT, image VARCHAR(255) DEFAULT '', page_tpl INT DEFAULT 1, seo_title VARCHAR(255) DEFAULT '', seo_keywords VARCHAR(255) DEFAULT '', seo_description VARCHAR(500) DEFAULT '', sort INT DEFAULT 0, status TINYINT DEFAULT 1, is_nav TINYINT DEFAULT 0",
            'index_block' => "id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), mod_type VARCHAR(20) NOT NULL DEFAULT 'article', col_id INT DEFAULT 0, tpl_id INT DEFAULT 1, list_num INT DEFAULT 6, intro VARCHAR(500) DEFAULT '', image VARCHAR(255) DEFAULT '', link_url VARCHAR(255) DEFAULT '', title_style INT DEFAULT 1, title_color VARCHAR(20) DEFAULT '', data_order VARCHAR(10) DEFAULT 'new', show_thumb TINYINT DEFAULT 1, show_desc TINYINT DEFAULT 1, show_time TINYINT DEFAULT 1, sort INT DEFAULT 0, is_show TINYINT DEFAULT 1",
            'admin' => "id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE, password CHAR(32), mobile VARCHAR(20) DEFAULT '', role VARCHAR(20) DEFAULT 'admin', add_time INT DEFAULT 0",
            'upload' => "id INT AUTO_INCREMENT PRIMARY KEY, filepath VARCHAR(255), filesize INT DEFAULT 0, category VARCHAR(50) DEFAULT '默认', add_time INT DEFAULT 0",
            'log' => "id INT AUTO_INCREMENT PRIMARY KEY, admin VARCHAR(50), action VARCHAR(50), detail VARCHAR(500), ip VARCHAR(45), add_time INT DEFAULT 0",
            'stats' => "id INT AUTO_INCREMENT PRIMARY KEY, ip VARCHAR(45) DEFAULT '', url VARCHAR(255) DEFAULT '', add_time INT DEFAULT 0, KEY idx_time (add_time)",
            'stats_day' => "day DATE NOT NULL PRIMARY KEY, pv INT DEFAULT 0",
            'stats_ip' => "day DATE NOT NULL, ip CHAR(32) NOT NULL, PRIMARY KEY (day, ip)",
        );
        foreach ($tables as $name => $ddl) {
            $pdo->exec("CREATE TABLE IF NOT EXISTS `{$pre}{$name}` ({$ddl}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
        }
        echo '<p><span class="ok">√</span> 数据表创建完成（共 ' . count($tables) . ' 张，前缀 ' . h($pre) . '）</p>';

        $now = time();

        // 3. 写入默认配置
        $configs = array(
            'company_name'    => '演示公司',
            'seo_title'       => '炎酷CMS演示站',
            'seo_keywords'    => 'CMS,建站',
            'seo_description' => '炎酷CMS演示站点',
            'phone'           => '400-000-0000',
            'address'         => '广东省广州市',
            'email'           => 'admin@example.com',
            'icp'             => '粤ICP备00000000号',
            'copyright'       => '© 演示公司 版权所有',
            'logo'            => '',
            'tpl_header'      => '1',
            'tpl_footer'      => '1',
            'tpl_banner'      => '1',
            'banner_images'   => '[]',
            'banner_notice'   => '欢迎使用炎酷CMS',
            'upload_max'      => '2',
            'upload_ext'      => 'jpg,jpeg,png,gif,webp',
            'favicon'         => '',
            'wechat_qr'       => '',
            'slogan'          => '',
            'theme_nav_bg'    => '',
            'theme_nav_color' => '',
            'theme_nav_active' => '',
            'theme_nav_active_bg' => '',
            'theme_accent'    => '',
            'theme_footer_bg' => '',
            'theme_footer_color' => '',
            'theme_side_bg'   => '',
            'theme_side_color'=> '',
            'kefu_on'         => '0',
            'kefu_style'      => '1',
            'kefu_phone'      => '',
            'kefu_wechat'     => '',
            'rewrite_on'      => '0',
            'version'         => '1.2',
            'upgrade_url'     => 'https://api.dinyun.cn/upgrade/manifest.json',
            'friend_links'    => '[]',
        );
        $stCfg = $pdo->prepare("INSERT INTO `{$pre}config` (ckey, cvalue) VALUES (?, ?) ON DUPLICATE KEY UPDATE cvalue = VALUES(cvalue)");
        foreach ($configs as $k => $v) {
            $stCfg->execute(array($k, $v));
        }
        echo '<p><span class="ok">√</span> 默认配置写入完成</p>';

        // 4. 演示数据（仅当栏目表为空时写入，避免重复执行产生重复数据）
        $colCount = intval($pdo->query("SELECT COUNT(*) FROM `{$pre}column`")->fetchColumn());
        if ($colCount === 0) {
            $stCol = $pdo->prepare("INSERT INTO `{$pre}column` (pid, name, flag, intro, sort, status, is_nav) VALUES (?, ?, ?, ?, ?, 1, 1)");
            // 一级栏目（flag 为伪静态目录式地址别名，可后台修改为拼音）
            $topCols = array(
                array('新闻中心', 'news', '公司新闻与行业资讯', 1),
                array('产品中心', 'product', '核心产品展示', 2),
                array('客户案例', 'case', '客户成功案例展示', 3),
            );
            $colIds = array();
            foreach ($topCols as $c) {
                $stCol->execute(array(0, $c[0], $c[1], $c[2], $c[3]));
                $colIds[$c[0]] = intval($pdo->lastInsertId());
            }
            // 新闻中心子栏目
            $stCol->execute(array($colIds['新闻中心'], '公司新闻', 'company-news', '公司最新动态', 1));
            $colIds['公司新闻'] = intval($pdo->lastInsertId());
            $stCol->execute(array($colIds['新闻中心'], '行业动态', 'industry-news', '行业前沿资讯', 2));
            $colIds['行业动态'] = intval($pdo->lastInsertId());

            // 8 篇演示文章，add_time 递减
            $stArt = $pdo->prepare("INSERT INTO `{$pre}article` (col_id, title, content, add_time, views, sort, status) VALUES (?, ?, ?, ?, ?, 0, 1)");
            $articles = array(
                array($colIds['公司新闻'], '炎酷CMS V1.0 正式发布', '经过团队的持续研发与测试，炎酷CMS V1.0 今日正式发布。本版本采用原生 PHP + PDO 架构，轻量高效，支持栏目管理、文章发布、单页管理、首页区块自定义等功能，欢迎下载体验。'),
                array($colIds['公司新闻'], '公司荣获年度科技创新企业称号', '近日，演示公司凭借在内容管理领域的技术创新，荣获年度科技创新企业称号。公司将继续加大研发投入，为客户提供更优质的建站产品与服务。'),
                array($colIds['行业动态'], '企业官网建设进入轻量化时代', '随着云计算与开源技术的普及，企业官网建设正朝着轻量化、模块化方向发展。轻量 CMS 以部署简单、维护成本低的优势，成为中小企业的首选方案。'),
                array($colIds['行业动态'], '移动端访问量占比持续提升', '最新统计数据显示，企业网站移动端访问量占比已超过七成。响应式模板与移动端 SEO 优化，已成为网站建设不可忽视的重要环节。'),
                array($colIds['产品中心'], '企业建站标准版', '企业建站标准版包含响应式官网模板、文章管理系统、SEO 优化工具，适合中小企业快速搭建品牌官网，三天即可上线。'),
                array($colIds['产品中心'], '集团门户定制版', '集团门户定制版支持多站点管理、权限分级、数据报表等高级功能，为集团型企业提供一体化门户解决方案。'),
                array($colIds['客户案例'], '制造业数字化官网案例', '针对制造业企业特点，提供产品展厅、案例展示、在线询价等功能模块，助力制造企业实现品牌数字化升级。'),
                array($colIds['客户案例'], '连锁零售企业官网案例', '为连锁零售企业打造品牌官网与门店展示体系，整合客服浮动条与移动端适配，上线三个月咨询量提升 60%。'),
            );
            $i = 0;
            foreach ($articles as $a) {
                $stArt->execute(array($a[0], $a[1], '<p>' . $a[2] . '</p>', $now - $i * 3600, 100 + $i * 7));
                $i++;
            }

            // 单页（默认显示在导航）
            $stPage = $pdo->prepare("INSERT INTO `{$pre}page` (name, flag, content, sort, status, is_nav) VALUES (?, ?, ?, ?, 1, 1)");
            $stPage->execute(array('关于我们', 'about', '<p>演示公司成立于 2010 年，总部位于广东省广州市，是一家专注于企业数字化服务的科技公司。我们致力于为客户提供高效、稳定、易用的内容管理系统与建站服务。</p>', 1));
            $aboutPageId = intval($pdo->lastInsertId());
            $stPage->execute(array('联系我们', 'contact', '<p>服务热线：400-000-0000</p><p>电子邮箱：admin@example.com</p><p>公司地址：广东省广州市</p>', 2));

            // 首页区块（about=单页简介模块 / article=文章模块 / product=产品案例模块）
            $stBlock = $pdo->prepare("INSERT INTO `{$pre}index_block` (name, mod_type, col_id, tpl_id, list_num, sort, is_show) VALUES (?, ?, ?, ?, ?, ?, 1)");
            $stBlock->execute(array('最新动态', 'article', $colIds['新闻中心'], 1, 6, 1));
            $stBlock->execute(array('产品展示', 'product', $colIds['产品中心'], 1, 8, 2));
            $stBlock->execute(array('客户案例', 'product', $colIds['客户案例'], 2, 4, 3));
            $stBlock->execute(array('关于我们', 'about', $aboutPageId, 1, 120, 4));

            echo '<p><span class="ok">√</span> 演示数据写入完成（栏目、文章、单页、首页区块）</p>';
        } else {
            echo '<p><span class="ok">√</span> 检测到已有栏目数据，跳过演示数据写入</p>';
        }

        // 5. 生成 data/config.php（var_export 防注入）
        // 密码规则：md5(明文 . salt)，salt 为随机 8 位字符串
        $salt = substr(md5(uniqid(mt_rand(), true)), 0, 8);
        $configArr = array(
            'db_host'   => $cfg['db_host'],
            'db_port'   => $cfg['db_port'],
            'db_name'   => $cfg['db_name'],
            'db_user'   => $cfg['db_user'],
            'db_pass'   => $cfg['db_pass'],
            'db_prefix' => $cfg['db_prefix'],
            'pwd_salt'  => $salt,
        );
        $configPhp = "<?php\nreturn " . var_export($configArr, true) . ";\n";
        if (file_put_contents($YK_CONFIG_FILE, $configPhp) === false) {
            throw new Exception('配置文件写入失败，请检查 data/ 目录写权限。已执行的数据库操作不会自动回滚，修复权限后请删除 data/install.lock（如存在）并重新执行安装。');
        }
        echo '<p><span class="ok">√</span> 配置文件 data/config.php 生成成功</p>';

        // 6. 创建管理员账号（md5(明文 . salt)）
        $stAdmin = $pdo->prepare("INSERT INTO `{$pre}admin` (username, password, mobile, role, add_time) VALUES (?, ?, ?, 'admin', ?)
            ON DUPLICATE KEY UPDATE password = VALUES(password), mobile = VALUES(mobile)");
        $stAdmin->execute(array($admin['username'], md5($admin['password'] . $salt), $admin['mobile'], $now));
        echo '<p><span class="ok">√</span> 管理员账号创建完成</p>';

        // 7. 写 .htaccess 保护 data/ 与 cache/
        foreach (array('data', 'cache') as $dir) {
            @file_put_contents(YK_INSTALL_DIR . '/' . $dir . '/.htaccess', "Deny from all\nRequire all denied\n");
        }
        echo '<p><span class="ok">√</span> 安全文件 .htaccess 写入完成</p>';

        // 8. 写安装锁并自删除
        file_put_contents($YK_LOCK_FILE, date('Y-m-d H:i:s'));
        $selfDeleted = @unlink(__FILE__);
        echo '<p><span class="ok">√</span> 安装锁写入完成' . ($selfDeleted ? '，install.php 已自删除' : '') . '</p>';

        echo '</div>';

        // 清理 SESSION 中的敏感数据
        unset($_SESSION['yk_db'], $_SESSION['yk_admin'], $_SESSION['yk_agree']);

        // 直接渲染完成页（文件可能已删除，不能再跳转）
        echo '<script>if(window.history.replaceState){window.history.replaceState(null,"","install.php?step=6");}</script>';
        echo '<div class="alert alert-ok">全部安装步骤执行成功！</div>';
        echo '<table>';
        echo '<tr><th>前台地址</th><td><a href="/" target="_blank">/</a></td></tr>';
        echo '<tr><th>后台地址</th><td><a href="/admin/login.php" target="_blank">/admin/login.php</a></td></tr>';
        echo '<tr><th>初始账号</th><td>' . h($admin['username']) . '（密码为您刚才设置的密码）</td></tr>';
        echo '</table>';
        if (!$selfDeleted) {
            echo '<div class="alert alert-err"><b>安全提醒：</b>install.php 自动删除失败，请立即手动删除站点根目录下的 <code>install.php</code>！</div>';
        } else {
            echo '<div class="alert alert-ok">install.php 已自动删除，无需手动处理。</div>';
        }
        echo '<div class="actions"><a class="btn" href="/">访问首页</a> <a class="btn btn-gray" href="/admin/login.php">进入后台</a></div>';
        install_footer();
        exit;

    } catch (Exception $e) {
        echo '</div>';
        echo '<div class="alert alert-err"><b>安装失败：</b>' . h($e->getMessage()) . '<br>'
            . '提示：建表语句均为 CREATE TABLE IF NOT EXISTS，修复问题后重新执行安装不会产生冲突；'
            . '若需完全重装，请清空数据库中的 ' . h($cfg['db_prefix']) . ' 前缀表并删除 data/config.php 后重试。</div>';
        echo '<div class="actions"><a class="btn btn-gray" href="install.php?step=4">返回修改配置</a> <a class="btn" href="install.php?step=5">重试安装</a></div>';
        install_footer();
        exit;
    }
}

/* ================= step 6：安装完成 ================= */
// 能走到这里说明锁文件与配置文件都不存在（顶部已检测），即尚未完成安装
install_redirect(1);
