using UnityEngine;
using System.Collections;
using CommonAIClient.Unity.Battle;
using System.ComponentModel;

namespace CommonAIClient.Unity.Utils
{
    public static class Extensions
    {
        public static GameObject FindChild(this GameObject go, string name)
        {
            if (go.name == name)
                return go;

            for (int i = 0; i < go.transform.childCount; i++)
            {
                GameObject tmp = go.transform.GetChild(i).gameObject;
                tmp = FindChild(tmp, name);
                if (tmp != null)
                {
                    return tmp;
                }
            }
            return null;
        }

        public static Vector3 Position(this GameObject go)
        {
            return go.transform.position;
        }

        public static Quaternion Rotation(this GameObject go)
        {
            return go.transform.rotation;
        }

        public static Vector3 Forward(this GameObject go)
        {
            return go.transform.forward;
        }

        public static void Position(this GameObject go, Vector3 position)
        {
            go.transform.position = position;
        }

        public static void Rotation(this GameObject go, Quaternion rotation)
        {
            go.transform.rotation = rotation;
        }

        public static void Forward(this GameObject go, Vector3 forward)
        {
            if (forward != Vector3.zero)
                go.transform.forward = forward;
        }

        public static void Parent(this GameObject go, GameObject parent)
        {
            go.transform.parent = parent != null ? parent.transform : null;
        }

        public static void ParentRoot(this GameObject go, GameObject parent)
        {
            go.transform.parent = parent.transform;
            go.transform.localPosition = Vector3.zero;
            go.transform.localScale = Vector3.one;
            go.transform.localRotation = Quaternion.identity;
        }

        public static void LookAt(this GameObject go, GameObject target)
        {
            go.transform.LookAt(target.transform);
        }

        public static void LookAt(this GameObject go, Transform target)
        {
            go.transform.LookAt(target);
        }

        public static void LookAt(this GameObject go, Vector3 worldPosition, [DefaultValue("Vector3.up")]Vector3 worldUp)
        {
            go.transform.LookAt(worldPosition, worldUp);
        }

        public static void LookAt(this Transform go, GameObject target)
        {
            go.LookAt(target.transform);
        }

        public static void ZonePos2UnityPos(this GameObject go, float totalHeight
            , float x, float y, float z = 0)
        {
            go.Position(ZonePos2UnityPos(totalHeight, x, y, z));
        }

        public static void ZonePos2NavPos(this GameObject go, float totalHeight
            , float x, float y, float z = 0)
        {
            go.Position(ZonePos2NavPos(totalHeight, x, y, z));
        }

        public static void ZoneRot2UnityRot(this GameObject go, float direct)
        {
            go.Rotation(ZoneRot2UnityRot(direct));
        }
        
        public static bool NearlyZero(float v)
        {
            return System.Math.Abs(v) < 0.0001f;
        }

        public static bool NavRayHit(Vector3 pos, out Vector3 hit)
        {
            hit = pos;
            RaycastHit rayHit;
            if (Physics.Raycast(pos + Vector3.up * 100, Vector3.down, out rayHit
                , Mathf.Infinity, 1 << BattleFactroy.Instance.StageNavLay))
            {
                hit.y = rayHit.point.y;
                return true;
            }
            return false;
        }

        //找个地方保存地图信息 优化掉参数1
        public static Vector3 ZonePos2UnityPos(float totalHeight, float x, float y, float z = 0)
        {
            Vector3 tmp = Vector3.zero;
            tmp.x = x;
            tmp.y = z;
            tmp.z = totalHeight - y;
            return tmp;
        }

        //找个地方保存地图信息 优化掉参数1
        public static Vector3 ZonePos2NavPos(float totalHeight, float x, float y, float z = 0)
        {
            Vector3 tmp = ZonePos2UnityPos(totalHeight, x, y, z);
            NavRayHit(tmp, out tmp);
            return tmp;
        }

        public static Quaternion ZoneRot2UnityRot(float direct)
        {
            return Quaternion.AngleAxis(direct * Mathf.Rad2Deg + 90, Vector3.up);
        }
    }
}