﻿using UnityEngine;
using Object = UnityEngine.Object;

namespace JLGames.RocketDriver.Actions.Loaderx
{
    internal sealed class AbManifestLoading : Loading<AssetBundleManifest>
    {
        public AbManifestLoading(LoadingAsyncType type, string name) : base(type, name)
        {
        }
    }

//    internal sealed class ObjectLoading : Loading<Object>
//    {
//        public ObjectLoading(LoadingAsyncType type, string name) : base(type, name)
//        {
//        }
//    }

    /// <summary>
    /// Download behavior set for a single resource
    /// 单一资源的下载行为集
    /// </summary>
    /// <typeparam name="T"></typeparam>
    internal class Loading<T> where T : Object
    {
        private readonly LoadingAsyncType m_Type;
        private readonly string m_Name;
        private event LoaderDelegate.OnAssetLoaded<T> AsyncEvent;
        private bool m_IsLoading;

        /// <summary>
        /// Asynchronous loading type
        /// Loading type
        /// 异步下载类型
        /// </summary>
        public LoadingAsyncType Type => m_Type;

        /// <summary>
        /// The associated name of the currently downloaded resource
        /// 当前下载资源的关联名字 
        /// </summary>
        public string Name => m_Name;

        /// <summary>
        /// Is it downloading
        /// 是否正在下载
        /// </summary>
        public bool IsLoading => m_IsLoading;

        /// <summary>
        /// Construct a download behavior
        /// 构造一个下载行为
        /// </summary>
        /// <param name="type"></param>
        /// <param name="name"></param>
        public Loading(LoadingAsyncType type, string name)
        {
            m_Type = type;
            m_Name = name;
        }

        public void StartLoading()
        {
            m_IsLoading = true;
        }

        /// <summary>
        /// Add on completion action
        /// 添加完成时行为
        /// </summary>
        /// <param name="callback"></param>
        public void AddAction(LoaderDelegate.OnAssetLoaded<T> callback)
        {
            if (null == callback) return;
            AsyncEvent += callback;
        }

        /// <summary>
        /// Remove action
        /// 移除行为
        /// </summary>
        /// <param name="callback"></param>
        public void RemoveAction(LoaderDelegate.OnAssetLoaded<T> callback)
        {
            if (null == callback || null == AsyncEvent) return;
            AsyncEvent -= callback;
        }

        /// <summary>
        /// Invoke all actions in sequence.
        /// 依顺序执行全部行为
        /// </summary>
        /// <param name="asset"></param>
        /// <param name="suc"></param>
        public void Invoke(T asset, bool suc)
        {
            AsyncEvent?.Invoke(asset, suc);
            AsyncEvent = null;
            m_IsLoading = false;
        }
    }

//    internal sealed class ObjectLoadingContainer : LoadingContainer<Object>
//    {
//        public ObjectLoadingContainer(LoadingAsyncType type) : base(type)
//        {
//        }
//    }
//
//    /// <summary>
//    /// 同一类资源下载集合的容器
//    /// </summary>
//    /// <typeparam name="T"></typeparam>
//    internal class LoadingContainer<T> where T : Object
//    {
//        private readonly LoadingAsyncType _type;
//        private readonly List<Loading<T>> _list = new List<Loading<T>>();
//
//        public LoadingAsyncType Type => _type;
//
//        public LoadingContainer(LoadingAsyncType type)
//        {
//            _type = type;
//        }
//
////        /// <summary>
////        /// 添加 下载行为集
////        /// </summary>
////        /// <param name="loading"></param>
////        /// <returns></returns>
////        public void AddLoading(Loading<T> loading)
////        {
////            if (null == loading) return;
////            if (loading.Type != _type) return;
////            _list.Add(loading);
////        }
////
////        /// <summary>
////        /// 移除 下载行为集
////        /// </summary>
////        /// <param name="loading"></param>
////        /// <returns></returns>
////        public int RemoveLoading(Loading<T> loading)
////        {
////            if (null == loading) return _list.Count;
////            _list.Remove(loading);
////            return _list.Count;
////        }
//
//        /// <summary>
//        /// 追加 行为
//        /// </summary>
//        /// <param name="name"></param>
//        /// <param name="action"></param>
//        public Loading<T> AppendLoadedAction(string name, LoaderDelegate.OnAssetLoaded<T> action)
//        {
//            if (null == action) return null;
//            var old = Find(name);
//            if (null == old)
//            {
//                old = new Loading<T>(_type, name);
//                _list.Add(old);
//            }
//
//            old.AddAction(action);
//            return old;
//        }
//
//        /// <summary>
//        /// 移除 行为
//        /// </summary>
//        /// <param name="name"></param>
//        /// <param name="action"></param>
//        public Loading<T> RemoveLoadedAction(string name, LoaderDelegate.OnAssetLoaded<T> action)
//        {
//            if (null == action) return null;
//            var old = Find(name);
//            old?.RemoveAction(action);
//            return old;
//        }
//
//        /// <summary>
//        /// 查找 行为集
//        /// </summary>
//        /// <param name="name"></param>
//        /// <returns></returns>
//        public Loading<T> Find(string name)
//        {
//            if (null == _list || _list.Count == 0) return null;
//            return _list.Find((async => async.Name == name));
//        }
//
//        /// <summary>
//        /// 执行 指定的下载行为集
//        /// </summary>
//        /// <param name="name"></param>
//        /// <param name="asset"></param>
//        /// <param name="suc"></param>
//        public void Invokd(string name, T asset, bool suc)
//        {
//            Find(name)?.Invoke(asset, suc);
//        }
//    }
}