using EZXR.Glass.Inputs;
using EZXR.Glass.SixDof;
#if SpatialComputing
using EZXR.Glass.SpatialComputing;
#endif
using UnityEngine;

namespace EZXR.Glass.Core
{
    [ScriptExecutionOrder(-58)]
    public class XRMan : MonoBehaviour
    {
        #region ����
        private static XRMan instance;
        public static XRMan Instance
        {
            get
            {
                return instance;
            }
        }
        #endregion

        #region Encapsulation
        //SixDof
        public HMDPoseTracker.DegreeOfFreedom m_dof = HMDPoseTracker.DegreeOfFreedom.SixDof;
        public class TwoEyes
        {
            public Camera left
            {
                get
                {
                    return HMDPoseTracker.Instance.leftCamera;
                }
            }
            public Camera right
            {
                get
                {
                    return HMDPoseTracker.Instance.rightCamera;
                }
            }
        }
        public TwoEyes Eyes;


        //Hand
        public class TwoHands
        {
            /// <summary>
            /// ��¼�����ֱ���������Ϣ
            /// </summary>
            public InputInfoBase left
            {
                get
                {
                    return InputSystem.leftHand;
                }
            }
            /// <summary>
            /// ��¼�����ֱ���������Ϣ
            /// </summary>
            public InputInfoBase right
            {
                get
                {
                    return InputSystem.rightHand;
                }
            }
        }
        public TwoHands Hands;
        #endregion

        /// <summary>
        /// ר�����ڷ��ø��ָ������
        /// </summary>
        public Transform attachments;

        [HideInInspector]
        public Vector3 position_SpatialTracking;
        [HideInInspector]
        public Quaternion rotation_SpatialTracking;
        [HideInInspector]
        public Vector3 position_SpatialComputing;
        [HideInInspector]
        public Quaternion rotation_SpatialComputing;
        [HideInInspector]
        public Matrix4x4 offset_SpatialComputing = Matrix4x4.identity;

        Vector3 tempPosition;
        Quaternion tempRotation;
        Matrix4x4 tempMatrix;

        private void Awake()
        {
            instance = this;

            if (attachments == null)
            {
                attachments = transform.Find("Attachments");
            }
        }

        // Start is called before the first frame update
        void Start()
        {
            InvokeRepeating("DoFramerate", 0, 1);
        }

        void DoFramerate()
        {
            Utilities.Android.SendIntent("ToSystem", "com.ezxr.glass.systemui", "DebugInfo", (1 / Time.smoothDeltaTime).ToString("##.#"));
        }

        // Update is called once per frame
        void Update()
        {
            if (HMDPoseTracker.Instance != null)
            {
                tempPosition = position_SpatialTracking;
                tempRotation = rotation_SpatialTracking;
            }
#if SpatialComputing
            if (EZXRSpatialComputingManager.Instance != null)
            {
                tempMatrix = offset_SpatialComputing * Matrix4x4.TRS(tempPosition, tempRotation, Vector3.one);
                tempPosition = tempMatrix.GetColumn(3);
                tempRotation = tempMatrix.rotation;
            }
#endif

            transform.position = tempPosition;
            transform.rotation = tempRotation;
        }
    }
}