/**
 * Сохранения: каждое сохранение под namespace, поддерживает merge/increment/max.
 * Лидерборды.
 *
 * Per-player: данные принадлежат конкретному игроку и привязаны к проекту.
 */
declare namespace game {
    interface SaveApi {
        /**
         * Сохранить данные под именем (replace).
         * @example game.save.set('progress', { level: 3, coins: 150 });
         */
        set(namespace: string, data: any, fn?: (ok: boolean) => void): void;

        /**
         * Прочитать данные namespace.
         * @example game.save.get('progress', (data) => game.log(data));
         */
        get(namespace: string, fn: (data: any) => void): void;

        /** Все namespace игрока разом. */
        getAll(fn: (allData: Record<string, any>) => void): void;

        /**
         * Слияние данных: { patch: {...}, increment: {...}, max: {...} }.
         * - patch: перезаписать ключи
         * - increment: прибавить к существующему (для счётчиков)
         * - max: max(старое, новое) (для рекордов)
         * @example
         * game.save.merge('stats', {
         *     patch: { lastLevel: 5 },
         *     increment: { coins: 10, deaths: 1 },
         *     max: { bestTime: 47.3 },
         * });
         */
        merge(namespace: string, opts: {
            patch?: Record<string, any>;
            increment?: Record<string, number>;
            max?: Record<string, number>;
        }, fn?: (result: any) => void): void;

        /** Атомарно увеличить счётчик. */
        increment(namespace: string, key: string, delta: number, fn?: (newValue: number) => void): void;

        /**
         * Положить в общий лидерборд (топ всех игроков игры).
         * @example game.save.leaderboard.submit('time', 47.3);
         */
        leaderboard: {
            submit(boardName: string, value: number): void;
            top(boardName: string, limit: number, fn: (rows: Array<{
                userId: number;
                username: string;
                value: number;
            }>) => void): void;
        };
    }
    const save: SaveApi;
}
