using System;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.UIElements;

namespace UnityEditor.Splines
{
    sealed class ButtonStripField : VisualElement
    {
        static readonly StyleSheet s_StyleSheet;

        static ButtonStripField()
        {
            s_StyleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Packages/com.unity.splines/Editor/Stylesheets/ButtonStripField.uss");
        }

        const string k_ButtonStripClass = "button-strip";
        const string k_ButtonClass = "button-strip-button";
        const string k_ButtonIconClass = "button-strip-button__icon";
        const string k_LeftButtonClass = k_ButtonClass + "--left";
        const string k_MiddleButtonClass = k_ButtonClass + "--middle";
        const string k_RightButtonClass = k_ButtonClass + "--right";
        const string k_AloneButtonClass = k_ButtonClass + "--alone";
        const string k_CheckedButtonClass = k_ButtonClass + "--checked";

        GUIContent[] m_Choices = new GUIContent[0];
        readonly VisualElement m_ButtonStrip;

        public GUIContent[] choices
        {
            get => m_Choices;
            set
            {
                m_Choices = value ?? new GUIContent[0];
                RebuildButtonStrip();
            }
        }

        int m_Value;

        public int value
        {
            get => m_Value;
            set
            {
                m_Value = value;
                UpdateButtonsState(m_Value);
                OnValueChanged?.Invoke(m_Value);
            }
        }

        public event Action<int> OnValueChanged;

        public ButtonStripField()
        {
            styleSheets.Add(s_StyleSheet);

            m_ButtonStrip = this;
            m_ButtonStrip.AddToClassList(k_ButtonStripClass);
        }

        Button CreateButton(GUIContent content)
        {
            var button = new Button();
            button.displayTooltipWhenElided = false;
            button.tooltip = L10n.Tr(content.tooltip);
            var icon = new VisualElement { name = content.text };
            icon.AddToClassList(k_ButtonIconClass);
            button.AddToClassList(k_ButtonClass);
            button.Add(icon);
            return button;
        }

        //public override void SetValueWithoutNotify(int newValue)
        public void SetValueWithoutNotify(int newValue)
        {
            m_Value = math.clamp(newValue, 0, choices.Length - 1);
            UpdateButtonsState(m_Value);
        }

        void UpdateButtonsState(int value)
        {
            List<Button> buttons = m_ButtonStrip.Query<Button>().ToList();
            for (int i = 0; i < buttons.Count; ++i)
            {
                buttons[i].EnableInClassList(k_CheckedButtonClass, value == i);
            }
        }

        void RebuildButtonStrip()
        {
            m_ButtonStrip.Clear();
            for (int i = 0, count = choices.Length; i < count; ++i)
            {
                var button = CreateButton(choices[i]);
                var targetValue = i;
                button.clicked += () => { value = targetValue; };
                if (choices.Length == 1)
                    button.AddToClassList(k_AloneButtonClass);
                else if (i == 0)
                    button.AddToClassList(k_LeftButtonClass);
                else if (i == count - 1)
                    button.AddToClassList(k_RightButtonClass);
                else 
                    button.AddToClassList(k_MiddleButtonClass);

                m_ButtonStrip.Add(button);
            }

            UpdateButtonsState(value);
        }
    }
}