namespace SRF.UI
{
    using Internal;
    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;

    [RequireComponent(typeof (RectTransform))]
    [ExecuteInEditMode]
    [AddComponentMenu(ComponentMenuPaths.ContentFitText)]
    public class ContentFitText : UIBehaviour, ILayoutElement
    {
        public SRText CopySource;
        public Vector2 Padding;

        public float minWidth
        {
            get
            {
                if (CopySource == null)
                {
                    return -1f;
                }
                return LayoutUtility.GetMinWidth(CopySource.rectTransform) + Padding.x;
            }
        }

        public float preferredWidth
        {
            get
            {
                if (CopySource == null)
                {
                    return -1f;
                }
                return LayoutUtility.GetPreferredWidth(CopySource.rectTransform) + Padding.x;
            }
        }

        public float flexibleWidth
        {
            get
            {
                if (CopySource == null)
                {
                    return -1f;
                }
                return LayoutUtility.GetFlexibleWidth(CopySource.rectTransform);
            }
        }

        public float minHeight
        {
            get
            {
                if (CopySource == null)
                {
                    return -1f;
                }
                return LayoutUtility.GetFlexibleHeight(CopySource.rectTransform) + Padding.y;
            }
        }

        public float preferredHeight
        {
            get
            {
                if (CopySource == null)
                {
                    return -1f;
                }
                return LayoutUtility.GetPreferredHeight(CopySource.rectTransform) + Padding.y;
            }
        }

        public float flexibleHeight
        {
            get
            {
                if (CopySource == null)
                {
                    return -1f;
                }
                return LayoutUtility.GetFlexibleHeight(CopySource.rectTransform);
            }
        }

        public int layoutPriority
        {
            get { return 0; }
        }

        public void CalculateLayoutInputHorizontal()
        {
            CopySource.CalculateLayoutInputHorizontal();
        }

        public void CalculateLayoutInputVertical()
        {
            CopySource.CalculateLayoutInputVertical();
        }

        protected override void OnEnable()
        {
            SetDirty();
            CopySource.LayoutDirty += CopySourceOnLayoutDirty;
        }

        private void CopySourceOnLayoutDirty(SRText srText)
        {
            SetDirty();
        }

        protected override void OnTransformParentChanged()
        {
            SetDirty();
        }

        protected override void OnDisable()
        {
            CopySource.LayoutDirty -= CopySourceOnLayoutDirty;
            SetDirty();
        }

        protected override void OnDidApplyAnimationProperties()
        {
            SetDirty();
        }

        protected override void OnBeforeTransformParentChanged()
        {
            SetDirty();
        }

        protected void SetDirty()
        {
            if (!IsActive())
            {
                return;
            }

            LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform);
        }
    }
}