import { Assets, Texture } from 'pixi.js';

/**
 * Загрузчик ассетов поверх Assets из PixiJS: группы, прогресс, готовые Texture.
 * URL ассетов передаётся функцией-резолвером (приложение решает, где лежат файлы).
 */
export class AssetLoader {
    private textures = new Map<string, Texture>();
    private initPromise: Promise<void> | null = null;

    constructor(private resolveUrl: (key: string) => string) {}

    /** Assets требует однократной инициализации до первой загрузки. */
    private ensureInit(): Promise<void> {
        if (!this.initPromise) {
            this.initPromise = Assets.init({});
        }
        return this.initPromise;
    }

    /** Загрузить группу ключей; onProgress получает долю 0..1. */
    async load(keys: string[], onProgress?: (p: number) => void): Promise<void> {
        await this.ensureInit();
        let done = 0;
        for (const key of keys) {
            try {
                const tex = await Assets.load<Texture>(this.resolveUrl(key));
                this.textures.set(key, tex);
            } catch (err) {
                throw new Error(`Не удалось загрузить ${this.resolveUrl(key)}: ${String(err)}`);
            }
            done++;
            onProgress?.(done / keys.length);
        }
    }

    texture(key: string): Texture {
        const t = this.textures.get(key);
        if (!t) throw new Error(`Текстура не загружена: ${key}`);
        return t;
    }

    has(key: string): boolean {
        return this.textures.has(key);
    }
}