using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;

namespace ET.Client
{
    public class GameObjectPool : Singleton<GameObjectPool>
    {
        private readonly Dictionary<string, AudioClip> audioPool = new();
        private readonly Dictionary<string, Sprite> cardSpritePool = new();

        //scroll item list
        //上下02 右1 左3
        public Dictionary<int, List<GameObject>> fightCardItemPools = new Dictionary<int, List<GameObject>>();
        public Dictionary<int, List<GameObject>> disCardItemPools = new Dictionary<int, List<GameObject>>();
        public Dictionary<int, List<GameObject>> havCardItemPools = new Dictionary<int, List<GameObject>>();

        public List<GameObject> chatFastItemPools = new List<GameObject>();
        public List<GameObject> chatFaceItemPools = new List<GameObject>();
        List<int> arealySelCardList = new List<int>();

        public void ClearCache()
        {
            foreach(var ac in audioPool.Values)
            {
                ac.UnloadAudioData();
            }
            audioPool.Clear();

            cardSpritePool.Clear();
            disCardItemPools.Clear();
            fightCardItemPools.Clear();
            chatFastItemPools.Clear();
            arealySelCardList.Clear();
        }

        public async ETTask<AudioClip> AcquireSound(string abName)
        {
            if(audioPool.TryGetValue(abName, out var ac))
            {
                return ac;
            }
            //Log.Warning($"not cache audio: ({key})");
            await ResourcesComponentHelper.Instance.LoadAssetAsync(GameUtil.Instance.GetSceneComponent(), "fightsound");
            UnityEngine.Object soundObj = ResourcesComponentHelper.Instance.GetAssetAsync("fightsound", abName);
            var aac = soundObj as AudioClip ;
            aac.LoadAudioData();
            audioPool.Add(abName, aac);
            return aac;
        }

        public async ETTask<Sprite> AcquireSprite(string abName)
        {
            if (cardSpritePool.ContainsKey(abName))
            {
                return cardSpritePool[abName];
            }
            await ResourcesComponentHelper.Instance.LoadAssetAsync(GameUtil.Instance.GetSceneComponent(), "majiangatlas");
            UnityEngine.Object spriteObj = ResourcesComponentHelper.Instance.GetAssetAsync("majiangatlas", abName);
            Texture2D texture = spriteObj as Texture2D;
            var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f), 100f);
            if (!cardSpritePool.ContainsKey(abName))
            {
                cardSpritePool.Add(abName, sprite);
            }
            return sprite;
        }

        public void OperatoRarealySelCardList(int operatorType,int val)
        {
            if (operatorType == 0)
            {
                arealySelCardList.Add(val);
            }
            else 
            {
                arealySelCardList.Remove(val);
            }
        }

        public void ClearRealySelCardList()
        {
            arealySelCardList.Clear();
        }

        public List<int> GetRealySelCardList()
        {
            arealySelCardList.Sort();
            return arealySelCardList;
        }
    }
}