﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace JLGames.RocketDriver.Actions.Audio
{
//     public class AudioPool : MonoBehaviour
//     {
//         private IEnumerator m_PreloadEnumerator;
//         private AudioPreloadedInfo m_LoadingInfo;
//         private readonly List<AudioPreloadedInfo> m_Preloadings = new List<AudioPreloadedInfo>();
//
//         private readonly Dictionary<string, AudioClip> m_PreloadPool = new Dictionary<string, AudioClip>();
//         private readonly Dictionary<string, AudioClip> m_Pool = new Dictionary<string, AudioClip>(32);
//
//         void Awake()
//         {
//             if (null == _shared)
//             {
//                 _shared = this;
//             }
//         }
//
//         #region Public Functions
//
//         public bool HasClip(string path)
//         {
//             return m_Pool.ContainsKey(path);
//         }
//
//         public AudioClip GetClicp(string path)
//         {
//             return m_Pool.ContainsKey(path) ? m_Pool[path] : null;
//         }
//
//         public void Add2Pool(string path, AudioClip clip)
//         {
//             InnerTryAddPool(path, clip);
//         }
//
//         public void ResetPool()
//         {
//             foreach (var clip in m_Pool.Values)
//             {
//                 Destroy(clip);
//             }
//
//             m_Pool.Clear();
//         }
//
//         public bool Loading => null != m_PreloadEnumerator;
//
//         public void StartPreload(AudioPreloadedInfo[] preloads)
//         {
//             if (null != preloads && preloads.Length == 0)
//             {
//                 //追加预加载
//                 InnerAppendPreload(preloads);
//             }
//
//             if (null != m_PreloadEnumerator)
//             {
//                 //加载中
//                 return;
//             }
//
//             if (m_Preloadings.Count > 0)
//             {
//                 //未完成预加载
//                 InnerTryStartPreloadCoroutine();
//             }
//         }
//
//         public void StopPreload()
//         {
//             InnerTryStopPreloadCoroutine();
//         }
//
//         #endregion
//
//         private void InnerTryAddPool(string key, AudioClip clip)
//         {
//             if (m_Pool.ContainsKey(key))
//             {
//                 return;
//             }
//
//             m_Pool.Add(key, clip);
// //		Debug.Log("tryAddPool: " + key);
//         }
//
//         private bool InnerAppendPreload(AudioPreloadedInfo[] preloads)
//         {
//             var addCount = 0;
//             foreach (var info in preloads)
//             {
//                 if (m_PreloadPool.ContainsKey(info.Named))
//                 {
//                     continue;
//                 }
//
//                 if (null != m_LoadingInfo && m_LoadingInfo.Named == info.Named)
//                 {
//                     continue;
//                 }
//
//                 if (InnerLevelUp(info))
//                 {
//                     continue;
//                 }
//
//                 addCount++;
//                 m_Preloadings.Add(info);
//             }
//
//             if (addCount > 0)
//             {
//                 InnerSortPreloadingList();
//                 return true;
//             }
//
//             return false;
//         }
//
//         private bool InnerLevelUp(AudioPreloadedInfo info)
//         {
//             int i;
//             for (i = 0; i < m_Preloadings.Count; i++)
//             {
//                 var loading = m_Preloadings[i];
//                 if (loading.Named == info.Named)
//                 {
//                     loading.Level = info.Level > loading.Level ? info.Level : loading.Level;
//                     return true;
//                 }
//             }
//
//             return false;
//         }
//
//         private void InnerSortPreloadingList()
//         {
//             m_Preloadings.Sort(InnerCompare);
//         }
//
//         private int InnerCompare(AudioPreloadedInfo o1, AudioPreloadedInfo o2)
//         {
//             return o2.Level.CompareTo(o1.Level);
//         }
//
//         #region load coroutine
//
//         private void InnerTryStartPreloadCoroutine()
//         {
//             if (null != m_PreloadEnumerator)
//             {
//                 return;
//             }
//
//             m_PreloadEnumerator = InnerPreLoadCoroutine();
//             StartCoroutine(m_PreloadEnumerator);
//         }
//
//         private void InnerTryStopPreloadCoroutine()
//         {
//             if (null == m_PreloadEnumerator)
//             {
//                 return;
//             }
//
//             StopCoroutine(m_PreloadEnumerator);
//             m_PreloadEnumerator = null;
//         }
//
//         private IEnumerator InnerPreLoadCoroutine()
//         {
//             while (m_Preloadings.Count > 0)
//             {
//                 m_LoadingInfo = m_Preloadings[0];
//                 m_Preloadings.RemoveAt(0);
//                 var request = Resources.LoadAsync<AudioClip>(m_LoadingInfo.Named);
//                 while (!request.isDone)
//                 {
//                     yield return null;
//                 }
//
//                 var clip = (AudioClip) request.asset;
//                 InnerTryAddPool(m_LoadingInfo.Named, clip);
//                 m_LoadingInfo = null;
//             }
//
//             m_PreloadEnumerator = null;
//         }
//
//         #endregion
//
//         #region Instance
//
//         private static AudioPool _shared;
//
//         public static AudioPool Shared
//         {
//             get
//             {
//                 if (null == _shared)
//                 {
//                     _shared = InnerCreateInstance();
//                 }
//
//                 return _shared;
//             }
//         }
//
//         private static AudioPool InnerCreateInstance()
//         {
//             var obj = new GameObject("AudioPool");
//             var pool = obj.AddComponent<AudioPool>();
//             return pool;
//         }
//
//         #endregion
//     }
}