﻿using UnityEngine;
using Object = UnityEngine.Object;

namespace JLGames.RocketDriver.Actions.Utils
{
    public static class TransformUtil
    {
        public static void RemoveAndDestroy(Transform obj)
        {
            RemoveChild(obj, true);
            InnerDestroy(obj.gameObject);
        }

        public static void RemoveAndDestroy(GameObject gameObject)
        {
            RemoveAndDestroy(gameObject.transform);
        }

        /// <summary>
        /// Gets the sub transform.
        /// 自行保证非重名
        /// </summary>
        /// <returns>The sub transform.</returns>
        /// <param name="currentTransform">Current transform.</param>
        /// <param name="nameChain">Name chain.</param>
        public static Transform GetSubTransform(Transform currentTransform, string nameChain)
        {
            if (string.IsNullOrEmpty(nameChain))
            {
                return currentTransform;
            }

            var delimiter = '/';
            var subNames = nameChain.Split(delimiter);
            var rs = currentTransform;
            foreach (var subName in subNames)
            {
                if (null == rs) return rs;
                if (subName.Length == 0) continue;
                rs = rs.Find(subName);
            }

            return rs;
        }

        public static void AddChildTo(Transform child, Transform parent, bool worldPosStays = false)
        {
            child.SetParent(parent, worldPosStays);
        }

        public static void AddChildTo(GameObject child, GameObject parent, bool worldPosStays = false)
        {
            child.transform.SetParent(parent.transform, worldPosStays);
        }

        public static void RemoveChild(Transform child, bool worldPosStays)
        {
            child.SetParent(null, worldPosStays);
        }

        public static void RemoveAllChildren(Transform container, bool worldPosStays)
        {
            var childCount = container.transform.childCount;
            if (childCount <= 0)
            {
                return;
            }

            for (var i = childCount - 1; i >= 0; i--)
            {
                var obj = container.GetChild(i);
                RemoveChild(obj, worldPosStays);
            }
        }

        public static void DestroyAllChildren(Transform container)
        {
            var childCount = container.transform.childCount;
            if (childCount <= 0)
            {
                return;
            }

            for (var i = childCount - 1; i >= 0; i--)
            {
                var go = container.GetChild(i).gameObject;
                InnerDestroy(go);
            }
        }

        private static void InnerDestroy(Object obj)
        {
#if UNITY_EDITOR
            Object.DestroyImmediate(obj);
#else
            Object.Destroy(obj);
#endif
        }
    }
}