using System.Linq;

namespace UnityEngine.Rendering.UI
{
    /// <summary>
    /// DebugUIHandler for object popup widget.
    /// </summary>
    public class DebugUIHandlerObjectPopupField : DebugUIHandlerField<DebugUI.ObjectPopupField>
    {
        int m_Index;

        /// <summary>
        /// Sets the widget and updates the label
        /// </summary>
        /// <param name="widget">The <see cref="DebugUI.Widget"/></param>
        internal override void SetWidget(DebugUI.Widget widget)
        {
            base.SetWidget(widget);
            m_Index = 0;
        }

        private void ChangeSelectedObject()
        {
            if (m_Field == null)
                return;

            var elements = m_Field.getObjects();
            if (elements == null)
                return;

            var elementsArray = elements.ToArray();
            var count = elementsArray.Count();

            if (m_Index >= count)
            {
                m_Index = 0;
            }
            else if (m_Index < 0)
            {
                m_Index = count - 1;
            }

            var newSelectedValue = elementsArray[m_Index];
            m_Field.SetValue(newSelectedValue);

            UpdateValueLabel();
        }

        /// <summary>
        /// OnIncrement implementation.
        /// </summary>
        /// <param name="fast">True if incrementing fast.</param>
        public override void OnIncrement(bool fast)
        {
            m_Index++;
            ChangeSelectedObject();
        }

        /// <summary>
        /// OnDecrement implementation.
        /// </summary>
        /// <param name="fast">Trye if decrementing fast.</param>
        public override void OnDecrement(bool fast)
        {
            m_Index--;
            ChangeSelectedObject();
        }

        /// <summary>
        /// Update the label of the widget.
        /// </summary>
        public override void UpdateValueLabel()
        {
            var selectedObject = m_Field.GetValue();
            string text = (selectedObject != null) ? selectedObject.name : "Empty";
            SetLabelText(text);
        }
    }
}