#if VRTK_DEFINE_SDK_DAYDREAM
namespace VRTK
{
    using UnityEngine;

    /// <summary>
    /// DaydreamReach component uses touchpad to extend controller position out in front of user
    /// along the current controller orientation plane
    /// </summary>
    public class DaydreamReach : MonoBehaviour
    {
        [Tooltip("Controller to track, defaults to ./Controller but probably want a Pointer Joint like GvrControllerPointer/Laser")]
        public Transform controller;
        [Tooltip("Maximum reach distance from controller origin.")]
        public float reachDistance = 0.5f;

        private Vector3 positionOrigin;

        protected virtual void Start()
        {
            if (controller == null)
            {
                controller = transform.Find("Controller");
            }
            positionOrigin = transform.position;
        }

        protected virtual void Update()
        {
            if (!GvrController.IsTouching)
            {
                // snap back to origin
                transform.position = positionOrigin;
            }
            else
            {
                transform.position = ReachForwardByDistance();
            }
        }

        private Vector3 ReachForwardByDistance()
        {
            Vector3 pos = positionOrigin;
            Vector3 offset = Vector3.zero;
            Vector2 touch = GetTouch(5);

            offset.z = touch.y * reachDistance;
            offset = controller.transform.rotation * offset;
            pos += offset;
            return pos;
        }

        /// <summary>
        /// GetTouch gets touch position adjusted coordinates. Abs(x) and abs(y) always 0 to 1
        /// </summary>
        /// <param name="origin">like a numeric keypad, 1= lower left, 2=lower-center, 5=center etc</param>
        /// <returns>A Vector2 of the touch position.</returns>
        private Vector2 GetTouch(int origin = 5)
        {
            if (!GvrController.IsTouching)
            {
                return Vector2.zero;
            }

            Vector2 touch = GvrController.TouchPos;
            // raw: 0,0 is top left, x is left-right, y is front-back
            // invert y axis
            touch.y = 1.0f - touch.y;

            switch (origin)
            {
                case 1:
                    break;
                case 2:
                    touch.x = touch.x * 2f - 1f;
                    break;
                case 5:
                    touch.y = touch.y * 2f - 1f;
                    touch.x = touch.x * 2f - 1f;
                    break;
            }

            return touch;
        }
    }
}
#endif