<?php
if (PHP_SAPI !== 'cli') { http_response_code(404); exit; }
function migrateAuthNames(PDO $pdo, $prefix, $apply)
{
    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);
    $hasName = in_array('name', $columns, true);
    $rows = $pdo->query("SELECT a.id,a.username,a.user_type," . ($hasName ? 'a.name' : "'' AS name") . ",m.eid,m.ename,u.username AS admin_username,u.truename FROM `$table` a LEFT JOIN `{$prefix}member_list` m ON m.id=a.user_id LEFT JOIN `{$prefix}admin_user` u ON u.id=a.admin_id")->fetchAll(PDO::FETCH_ASSOC);
    $changes = []; $unresolved = 0;
    foreach ($rows as $row) {
        if (trim((string)$row['name']) !== '') continue;
        $member = (int)$row['user_type'] === 1;
        $name = $row['username'] === ($member ? $row['eid'] : $row['admin_username']) ? trim((string)($member ? $row['ename'] : $row['truename'])) : '';
        if ($name === '') { $unresolved++; continue; }
        $changes[] = [$name, (int)$row['id']];
    }
    $report = ['accounts'=>count($rows), 'addNameColumn'=>!$hasName, 'fillNames'=>count($changes), 'unresolved'=>$unresolved, 'applied'=>false];
    if (!$apply) return $report;
    if (!$hasName) $pdo->exec("ALTER TABLE `$table` ADD COLUMN name VARCHAR(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' AFTER username");
    $pdo->beginTransaction();
    try {
        $update = $pdo->prepare("UPDATE `$table` SET name=? WHERE id=? AND (name IS NULL OR TRIM(name)='')");
        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 = dirname(__DIR__);
    require $root . '/vendor/autoload.php';
    $app = new \think\App($root . '/'); $app->initialize();
    $config = $app->config->get('database.connections.' . $app->config->get('database.default'));
    $pdo = new PDO('mysql:host='.$config['hostname'].';port='.$config['hostport'].';dbname='.$config['database'].';charset=utf8mb4', $config['username'], $config['password'], [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
    $report = migrateAuthNames($pdo, $config['prefix'], in_array('--apply', $argv, true));
    if ($report['applied']) {
        $schemaFile = $config['schema_cache_path'] . $config['database'] . '.' . $config['prefix'] . 'auth.php';
        if (is_file($schemaFile) && !unlink($schemaFile)) throw new RuntimeException('Cannot clear auth schema cache');
    }
    echo json_encode($report, JSON_UNESCAPED_UNICODE), PHP_EOL;
}
