<?php
/** CLI：默认预览；--apply 升级既有auth关联，保留认证、绑定和账号ID。 */
if (PHP_SAPI !== 'cli') { http_response_code(404); exit; }
function migrateAuthLinks(PDO $pdo, $prefix, $apply, $backupPath)
{
    if (!preg_match('/^[a-zA-Z0-9_]+$/', $prefix)) throw new RuntimeException('Invalid prefix');
    $table = $prefix . 'auth';
    $columns = $pdo->query("SHOW COLUMNS FROM `$table`")->fetchAll(PDO::FETCH_COLUMN);
    $hasAdmin = in_array('admin_id', $columns, true);
    $members = $pdo->query("SELECT eid, MIN(id) AS id FROM `{$prefix}member_list` GROUP BY eid HAVING COUNT(*)=1")->fetchAll(PDO::FETCH_KEY_PAIR);
    $admins = $pdo->query("SELECT username, MIN(id) AS id FROM `{$prefix}admin_user` GROUP BY username HAVING COUNT(*)=1")->fetchAll(PDO::FETCH_KEY_PAIR);
    $rows = $pdo->query("SELECT id,username,user_type,user_id" . ($hasAdmin ? ',admin_id' : '') . " FROM `$table`")->fetchAll(PDO::FETCH_ASSOC);
    $changes = [];
    foreach ($rows as $row) {
        $admin = $hasAdmin ? (int)$row['admin_id'] : ((int)$row['user_type'] > 1 ? (int)$row['user_id'] : (int)($admins[$row['username']] ?? 0));
        // 列已添加但转换中断时，根据后台用户名恢复，不再把member_id误当admin_id。
        if (!$admin && (int)$row['user_type'] > 1) $admin = (int)($admins[$row['username']] ?? 0);
        $member = (int)$row['user_type'] === 1 ? (int)$row['user_id'] : (int)($members[$row['username']] ?? 0);
        if (!$hasAdmin || $member !== (int)$row['user_id'] || $admin !== (int)$row['admin_id']) $changes[] = [$member, $admin, (int)$row['id']];
    }
    $report = ['accounts'=>count($rows), 'changes'=>count($changes), 'addAdminColumn'=>!$hasAdmin, 'applied'=>false];
    if (!$apply) return $report;
    if (!file_exists($backupPath) && file_put_contents($backupPath, json_encode($rows, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) === false) throw new RuntimeException('Cannot save original links');
    if (!$hasAdmin) $pdo->exec("ALTER TABLE `$table` ADD COLUMN admin_id INT NOT NULL DEFAULT 0 COMMENT 'admin_user.id' AFTER user_id");
    $pdo->beginTransaction();
    try {
        $update = $pdo->prepare("UPDATE `$table` SET user_id=?,admin_id=? WHERE id=?");
        foreach ($changes as $change) $update->execute($change);
        $pdo->commit();
    } catch (Throwable $error) { $pdo->rollBack(); throw $error; }
    $report['applied'] = true;
    return $report;
}
if (realpath($argv[0]) === __FILE__) {
    $root = $argv[1] ?? 'D:/phpstudy_pro/WWW/cqoms.com';
    if ($root === '--apply') $root = 'D:/phpstudy_pro/WWW/cqoms.com';
    require $root . '/vendor/autoload.php';
    $app = new \think\App(rtrim($root, '/\\') . '/'); $app->initialize();
    $c = $app->config->get('database.connections.' . $app->config->get('database.default'));
    $pdo = new PDO('mysql:host='.$c['hostname'].';port='.$c['hostport'].';dbname='.$c['database'].';charset=utf8mb4', $c['username'], $c['password'], [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
    $folder = dirname(__DIR__) . '/.local'; if (!is_dir($folder)) mkdir($folder, 0700, true);
    echo json_encode(migrateAuthLinks($pdo, $c['prefix'], in_array('--apply', $argv, true), $folder . '/auth-links-before.json')), PHP_EOL;
}
