﻿#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEditor;
using Object = UnityEngine.Object;

namespace JLGames.RocketDriver.Actions.Loaderx
{
    public static class EditorUtils
    {
        /// <summary>
        /// loading resource
        /// 加载资源
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <typeparam name="T">资源类型</typeparam>
        /// <returns></returns>
        public static T LoadAsset<T>(string unityAssetPath) where T : Object
        {
            return AssetDatabase.LoadAssetAtPath<T>(unityAssetPath);
        }

        /// <summary>
        /// load resources of the same type in batchs
        /// 批量加载同类型资源
        /// </summary>
        /// <param name="unityAssetPaths"></param>
        /// <typeparam name="T">资源类型</typeparam>
        /// <returns></returns>
        public static T[] LoadAssets<T>(string[] unityAssetPaths) where T : Object
        {
            if (null == unityAssetPaths || unityAssetPaths.Length == 0) return null;
            var rs = new T[unityAssetPaths.Length];
            for (var index = 0; index < rs.Length; index++)
            {
                rs[index] = LoadAsset<T>(unityAssetPaths[index]);
            }

            return rs;
        }

        /// <summary>
        /// Load sub-resources (sub-images, presets, etc.)
        /// 加载子资源(子图、预置等)
        ///     1.Prefab: Returns GameObject and all components, including child nodes
        ///     1.Prefab: 返回GameObject和全部组件，包括子节点
        ///     2.Image: Returns Texture2D and all Sprites
        ///     2.图片: 返回Texture2D和全部Sprite
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <returns></returns>
        public static Object[] LoadSubAssets(string unityAssetPath)
        {
            return AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <param name="type">资源类型</param>
        /// <returns></returns>
        public static Object[] LoadSubAssets(string unityAssetPath, Type type)
        {
            var assets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            if (null == assets) return null;
            var ln = assets.Length;
            if (0 == ln) return new Object[0];
            var list = new List<Object>();
            for (var i = 0; i < ln; i++)
            {
                if (assets[i].GetType() == type)
                {
                    list.Add(assets[i]);
                }
            }

            return list.ToArray();
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <typeparam name="T">资源类型</typeparam>
        /// <returns></returns>
        public static T[] LoadSubAssets<T>(string unityAssetPath) where T : Object
        {
            var assets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            if (null == assets) return null;
            var ln = assets.Length;
            if (0 == ln) return new T[0];
            var list = new List<T>();
            for (var i = 0; i < ln; i++)
            {
                if (assets[i] is T)
                {
                    list.Add((T) assets[i]);
                }
            }

            return list.ToArray();
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <param name="subName">子资源名称</param>
        /// <returns>返回第一个</returns>
        public static Object LoadSubAsset(string unityAssetPath, string subName)
        {
            var subAssets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            return Internal.FindAsset(subAssets, subName);
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <param name="subName">子资源名称</param>
        /// <param name="type">子资源类型</param>
        /// <returns>返回第一个</returns>
        public static Object LoadSubAsset(string unityAssetPath, string subName, Type type)
        {
            var subAssets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            return Internal.FindAsset(subAssets, subName, type);
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <param name="subName">子资源名称</param>
        /// <typeparam name="T">子资源类型</typeparam>
        /// <returns>返回第一个</returns>
        public static T LoadSubAsset<T>(string unityAssetPath, string subName) where T : Object
        {
            var subAssets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            return Internal.FindAsset<T>(subAssets, subName);
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <param name="subNames">子资源名称</param>
        /// <returns></returns>
        public static Object[] LoadSubAssets(string unityAssetPath, string[] subNames)
        {
            var subAssets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            return Internal.FindAssets(subAssets, subNames);
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <param name="subNames">子资源名称</param>
        /// <param name="type">子资源类型</param>
        /// <returns></returns>
        public static Object[] LoadSubAssets(string unityAssetPath, string[] subNames, Type type)
        {
            var subAssets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            return Internal.FindAssets(subAssets, subNames, type);
        }

        /// <summary>
        /// Load sub-resources (sprites, prefabs, etc.)
        /// 加载子资源(子图、预置等)
        /// </summary>
        /// <param name="unityAssetPath"></param>
        /// <param name="subNames">子资源名称</param>
        /// <typeparam name="T">子资源类型</typeparam>
        /// <returns></returns>
        public static T[] LoadSubAssets<T>(string unityAssetPath, string[] subNames) where T : Object
        {
            var subAssets = AssetDatabase.LoadAllAssetsAtPath(unityAssetPath);
            return Internal.FindAssets<T>(subAssets, subNames);
        }
    }
}
#endif