using UnityEngine;
using System.Collections;

namespace mgaia.Utils
{
    /// <summary>
    /// Editor utilizado para posicionar um elemento através de coordenadas de janela, facilita a montagem de guis
    /// </summary>
    /// <owner>Victor</owner>
    public class WindowTransform : MonoBehaviour
    {
        [SerializeField]
        private Vector2 _windowPosition;

        [SerializeField]
        private Camera _camera;

        /// <summary>
        /// Camera utilizada para desenhar esse elemento
        /// </summary>
        private Camera CurrentCamera
        {
            get
            {
                if (_camera == null)
                {
                    return Camera.main;
                }
                else
                {
                    return _camera;
                }
            }
        }

        /// <summary>
        /// Posição da janela atual em que o elemento está
        /// </summary>
        public Vector3 WindowPosition
        {
            get { return _windowPosition; }
            set
            {
                _windowPosition = value;

                SetCorrectPosition();
            }
        }

        /// <summary>
        /// Calcula a posição da janela atual de acordo com a posição do objeto no mundo
        /// </summary>
        public void CalculateCurrentWindowPosition()
        {
            _windowPosition = AdjustWindowPositionToCommonOrigin(CurrentCamera.WorldToScreenPoint(transform.position));
        }

        /// <summary>
        /// Evento chamado quando algum valor de propriedade muda, seta a posição do objeto no mundo
        /// </summary>
        private void OnValidate()
        {
            SetCorrectPosition();
        }

        /// <summary>
        /// Calcula a posição da janela para que o referencial comum (superior esquerda) seja convertido para o referencial Unity (inferior esquerda)
        /// </summary>
        private Vector2 AdjustWindowPositionToCommonOrigin(Vector2 windowPosition)
        {
#if UNITY_EDITOR
            float width;
            float height;
            float aspect;

            if (EditorHelper.GetGameViewSize(out width, out height, out aspect))
            {
                windowPosition.x = (CurrentCamera.pixelWidth * windowPosition.x) / width;
                windowPosition.y = (CurrentCamera.pixelHeight * windowPosition.y) / height;
            }
#endif

            return new Vector2(windowPosition.x, CurrentCamera.pixelHeight - windowPosition.y);
        }

        /// <summary>
        /// Seta a posição do objeto no mundo de acordo com a posição na janela
        /// </summary>
        private void SetCorrectPosition()
        {
            Vector3 newPosition = CurrentCamera.ScreenToWorldPoint(AdjustWindowPositionToCommonOrigin(WindowPosition));

            transform.position = new Vector3(newPosition.x, newPosition.y, transform.position.z);
        }
    }
}