<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;

function Mirai_levelAdminAdjust($uid, $level = null, $exp = null) {
    $db = \Typecho\Db::get();
    $data = [];
    if ($level !== null) {
        $data['level'] = min(max(1, (int)$level), Mirai_levelGetMax());
    }
    if ($exp !== null) {
        $data['exp'] = max(0, (int)$exp);
    }
    if (empty($data)) return false;

    $beforeLevel = Mirai_levelGet($uid);
    $beforeExp = Mirai_expGet($uid);

    $db->query($db->update('table.users')->rows($data)->where('uid = ?', $uid));

    $afterLevel = Mirai_levelGet($uid);
    $afterExp = Mirai_expGet($uid);

    if ($afterExp !== $beforeExp || $afterLevel !== $beforeLevel) {
        $expLogTable = Mirai_pointsTable('mirai_exp_logs');
        try {
            $db->query($db->insert($expLogTable)->rows([
                'uid' => $uid,
                'action' => 'admin_adjust',
                'amount' => ($afterExp ?? 0) - $beforeExp,
                'exp_before' => $beforeExp,
                'exp_after' => $afterExp,
                'level_before' => $beforeLevel,
                'level_after' => $afterLevel,
                'ref_type' => 'admin',
                'ref_id' => 0,
                'remark' => '管理员手动调整',
                'created' => time(),
            ]));
        } catch (Exception $e) {}
    }

    return true;
}

function Mirai_levelAdminGetStats() {
    $db = \Typecho\Db::get();
    $max = Mirai_levelGetMax();
    $rows = $db->fetchAll($db->select('level', ['COUNT(*)' => 'cnt'])->from('table.users')->group('level'));
    $stats = [];
    for ($i = 1; $i <= $max; $i++) {
        $stats[$i] = 0;
    }
    foreach ($rows as $row) {
        $lv = (int)$row['level'];
        if ($lv >= 1 && $lv <= $max) {
            $stats[$lv] = (int)$row['cnt'];
        }
    }
    return $stats;
}