import { ResMgr } from "./ResMgr";
import { ResPath } from "./ResConfig";
import { Prefab, SpriteFrame, AudioClip, instantiate, Node } from 'cc';

/**
 * ResMgr 资源管理器使用示例
 */

// ========== 示例1: 加载单个资源 ==========

/**
 * 加载UI预制体
 */
export async function loadUIPrefab(): Promise<void> {
    try {
        console.log("========== 加载UI预制体 ==========");
        
        // 加载预制体
        const prefab = await ResMgr.getInstance().load(
            'resources',
            'prefabs/ui/LoginUI',
            Prefab
        );
        
        console.log("预制体加载成功:", prefab.name);
        
        // 实例化预制体
        const node = instantiate(prefab);
        console.log("预制体实例化成功");
        
    } catch (error) {
        console.error("加载UI预制体失败:", error);
    }
}

/**
 * 加载图片资源
 */
export async function loadSprite(): Promise<void> {
    try {
        console.log("========== 加载图片资源 ==========");
        
        // 加载精灵帧
        const spriteFrame = await ResMgr.getInstance().load(
            'resources',
            'textures/ui/icon_player',
            SpriteFrame
        );
        
        console.log("图片加载成功:", spriteFrame.name);
        
    } catch (error) {
        console.error("加载图片失败:", error);
    }
}

/**
 * 加载音频资源
 */
export async function loadAudio(): Promise<void> {
    try {
        console.log("========== 加载音频资源 ==========");
        
        // 加载音频片段
        const audioClip = await ResMgr.getInstance().load(
            'resources',
            'audio/music/bg_music',
            AudioClip
        );
        
        console.log("音频加载成功:", audioClip.name);
        
    } catch (error) {
        console.error("加载音频失败:", error);
    }
}

// ========== 示例2: 预加载资源 ==========

/**
 * 预加载关卡资源
 */
export async function preloadLevel(): Promise<void> {
    try {
        console.log("========== 预加载关卡资源 ==========");
        
        // 预加载多个资源
        const resources = [
            'prefabs/enemy/Enemy1',
            'prefabs/enemy/Enemy2',
            'prefabs/effect/Explosion'
        ];
        
        for (const path of resources) {
            await ResMgr.getInstance().preload(
                'resources',
                path,
                Prefab,
                (finished, total) => {
                    const progress = (finished / total * 100).toFixed(0);
                    console.log(`预加载 ${path}: ${progress}%`);
                }
            );
        }
        
        console.log("关卡资源预加载完成");
        
    } catch (error) {
        console.error("预加载失败:", error);
    }
}

// ========== 示例3: 加载目录 ==========

/**
 * 加载所有UI图标
 */
export async function loadAllUIIcons(): Promise<void> {
    try {
        console.log("========== 加载UI图标目录 ==========");
        
        // 加载整个目录
        const sprites = await ResMgr.getInstance().loadDir(
            'resources',
            ResPath.UI_TEXTURE + '/icons',
            SpriteFrame
        );
        
        console.log(`加载了 ${sprites.length} 个UI图标`);
        
        // 遍历所有图标
        sprites.forEach((sprite, index) => {
            console.log(`图标 ${index + 1}: ${sprite.name}`);
        });
        
    } catch (error) {
        console.error("加载目录失败:", error);
    }
}

// ========== 示例4: 资源释放 ==========

/**
 * 释放不需要的资源
 */
export function releaseUnusedResources(): void {
    console.log("========== 释放资源 ==========");
    
    // 释放单个资源
    ResMgr.getInstance().release('resources', 'prefabs/ui/LoginUI');
    
    // 释放目录资源
    ResMgr.getInstance().releaseDir('resources', 'textures/ui/icons');
    
    console.log("资源释放完成");
}

// ========== 示例5: 完整的资源管理流程 ==========

/**
 * 游戏场景资源管理示例
 */
export class GameSceneResourceManager {
    private loadedPrefabs: Map<string, Prefab> = new Map();
    
    /**
     * 进入场景 - 加载场景资源
     */
    async onEnterScene(): Promise<void> {
        console.log("========== 进入游戏场景 ==========");
        
        try {
            // 1. 预加载场景资源
            await this.preloadSceneResources();
            
            // 2. 加载玩家预制体
            const playerPrefab = await ResMgr.getInstance().load(
                'resources',
                'prefabs/actor/Player',
                Prefab
            );
            this.loadedPrefabs.set('Player', playerPrefab);
            
            // 3. 加载敌人预制体
            const enemies = await ResMgr.getInstance().loadDir(
                'resources',
                'prefabs/enemy',
                Prefab
            );
            enemies.forEach(prefab => {
                this.loadedPrefabs.set(prefab.name, prefab);
            });
            
            console.log("场景资源加载完成");
            
        } catch (error) {
            console.error("场景资源加载失败:", error);
        }
    }
    
    /**
     * 预加载场景资源
     */
    private async preloadSceneResources(): Promise<void> {
        // 预加载特效预制体
        const effectResources = [
            'prefabs/effect/Hit',
            'prefabs/effect/Explosion'
        ];
        
        for (const path of effectResources) {
            await ResMgr.getInstance().preload(
                'resources',
                path,
                Prefab
            );
        }
        
        // 预加载音频
        const audioResources = [
            'audio/effect/hit',
            'audio/effect/explosion'
        ];
        
        for (const path of audioResources) {
            await ResMgr.getInstance().preload(
                'resources',
                path,
                AudioClip
            );
        }
    }
    
    /**
     * 获取已加载的预制体
     */
    getPrefab(name: string): Prefab | undefined {
        return this.loadedPrefabs.get(name);
    }
    
    /**
     * 离开场景 - 释放场景资源
     */
    onLeaveScene(): void {
        console.log("========== 离开游戏场景 ==========");
        
        // 清空预制体缓存
        this.loadedPrefabs.clear();
        
        // 释放场景相关资源
        ResMgr.getInstance().releaseDir('resources', 'prefabs/actor');
        ResMgr.getInstance().releaseDir('resources', 'prefabs/enemy');
        ResMgr.getInstance().releaseDir('resources', 'prefabs/effect');
        
        console.log("场景资源释放完成");
        console.log(`缓存大小: ${ResMgr.getInstance().getCacheSize()}`);
    }
}

// ========== 测试函数 ==========

/**
 * 测试资源管理器
 */
export async function testResMgr(): Promise<void> {
    console.log("========================================");
    console.log("  开始测试 ResMgr 资源管理器");
    console.log("========================================");
    
    // 测试1: 加载单个资源
    await loadUIPrefab();
    await loadSprite();
    
    // 测试2: 预加载资源
    await preloadLevel();
    
    // 测试3: 加载目录
    await loadAllUIIcons();
    
    // 查看缓存大小
    console.log(`当前缓存资源数量: ${ResMgr.getInstance().getCacheSize()}`);
    
    // 测试4: 释放资源
    releaseUnusedResources();
    
    console.log(`释放后缓存资源数量: ${ResMgr.getInstance().getCacheSize()}`);
    
    console.log("========================================");
    console.log("  ResMgr 测试完成");
    console.log("========================================");
}
