#!/usr/bin/env php
<?php

declare(strict_types=1);

use KingCMS\App;
use KingCMS\Demo\DemoContent;

$autoload = __DIR__ . '/../vendor/autoload.php';
if (is_file($autoload)) {
    require $autoload;
} else {
    spl_autoload_register(static function (string $class): void {
        $prefix = 'KingCMS\\';
        if (strncmp($class, $prefix, strlen($prefix)) !== 0) {
            return;
        }

        $relative = substr($class, strlen($prefix));
        $file = __DIR__ . '/../app/' . str_replace('\\', '/', $relative) . '.php';
        if (is_file($file)) {
            require $file;
        }
    });
}

$usage = <<<'TEXT'
用法：php x1/bin/demo-content [--data-dir=<目录>]

把 demo.kingcms.com 的演示内容整理为「户外用品企业网站演示」。
执行前会把现有 SQLite 备份到 <data-dir>/backups/，可重复执行。

TEXT;

$dataDir = __DIR__ . '/../data';
$arguments = array_slice($argv, 1);

for ($i = 0; $i < count($arguments); $i++) {
    $argument = $arguments[$i];

    if ($argument === '--help' || $argument === '-h') {
        fwrite(STDOUT, $usage);
        exit(0);
    }

    if (strncmp($argument, '--data-dir=', 11) === 0) {
        $dataDir = substr($argument, 11);
        continue;
    }

    if ($argument === '--data-dir') {
        $value = $arguments[$i + 1] ?? '';
        if ($value === '') {
            fwrite(STDERR, "--data-dir 缺少目录\n");
            exit(2);
        }
        $dataDir = $value;
        $i++;
        continue;
    }

    fwrite(STDERR, "未知参数：{$argument}\n\n" . $usage);
    exit(2);
}

$dataDir = rtrim($dataDir, '/');
if ($dataDir === '') {
    fwrite(STDERR, "数据目录不能为空\n");
    exit(2);
}

$database = $dataDir . '/kingcms.sqlite';

$backup = null;
if (is_file($database)) {
    try {
        $backupDir = $dataDir . '/backups';
        if (!is_dir($backupDir) && !mkdir($backupDir, 0700, true) && !is_dir($backupDir)) {
            throw new RuntimeException(sprintf('无法创建备份目录：%s', $backupDir));
        }
        @chmod($backupDir, 0700);

        $target = sprintf(
            '%s/demo-before-%s-%s.sqlite',
            $backupDir,
            date('Ymd-His'),
            bin2hex(random_bytes(4))
        );

        $pdo = new PDO('sqlite:' . $database, null, null, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        ]);
        $pdo->exec('VACUUM INTO ' . $pdo->quote($target));
        @chmod($target, 0600);
        $pdo = null;
        $backup = $target;
    } catch (Throwable $exception) {
        fwrite(STDERR, '备份失败，已停止：' . $exception->getMessage() . PHP_EOL);
        exit(1);
    }
}

fwrite(STDOUT, $backup !== null
    ? "已备份数据库：{$backup}\n"
    : "数据库尚未创建，跳过备份。\n");

try {
    $app = new App($dataDir);
    $summary = (new DemoContent($app->pdo(), $app->settings()))->apply();
} catch (Throwable $exception) {
    fwrite(STDERR, '演示内容整理失败：' . $exception->getMessage() . PHP_EOL);
    exit(1);
}

fwrite(STDOUT, "演示内容已整理：\n");
fwrite(STDOUT, sprintf(
    "  分类：新增 %d，更新 %d，隐藏 %d\n",
    $summary['categories_created'],
    $summary['categories_updated'],
    $summary['categories_hidden']
));
fwrite(STDOUT, sprintf(
    "  商品：新增 %d，更新 %d，下架 %d\n",
    $summary['products_created'],
    $summary['products_updated'],
    $summary['products_withdrawn']
));
fwrite(STDOUT, sprintf(
    "  文章：新增 %d，更新 %d，归档 %d\n",
    $summary['articles_created'],
    $summary['articles_updated'],
    $summary['articles_withdrawn']
));
fwrite(STDOUT, sprintf(
    "  轮播：新增 %d，更新 %d，停用旧内容 %d\n",
    $summary['banners_created'],
    $summary['banners_updated'],
    $summary['banners_disabled']
));
fwrite(STDOUT, "注意：主题内置文案「2026 家居灵感」和「把舒适，安放进日常」由语言文件直出，数据脚本无法覆盖。\n");

exit(0);
