using System;
using UnityEngine.UIElements;
using UnityEditor.U2D.Common;

namespace UnityEditor.U2D.Animation
{
    internal class GenerateWeightsPanel : VisualElement
    {
        public class GenerateWeightsPanelFactory : UxmlFactory<GenerateWeightsPanel, GenerateWeightsPanelUxmlTraits> {}
        public class GenerateWeightsPanelUxmlTraits : UxmlTraits {}

        public event Action onGenerateWeights = () => {};
        public event Action onNormalizeWeights = () => {};
        public event Action onClearWeights = () => {};
        private VisualElement m_AssociateBoneControl;
        private Toggle m_AssociateBonesToggle;
        Button m_GenerateWeightsButton;

        public bool associateBones
        {
            get { return m_AssociateBoneControl.visible && m_AssociateBonesToggle.value; }
            set { m_AssociateBonesToggle.value = value; }
        }

        public GenerateWeightsPanel()
        {
            styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/GenerateWeightsPanelStyle.uss"));
            if (EditorGUIUtility.isProSkin)
                AddToClassList("Dark");
            AddToClassList("AssociateBoneEnabled");
            RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
            RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
        }

        public void BindElements()
        {
            m_AssociateBoneControl = this.Q<VisualElement>("AssociateBonesControl");
            m_GenerateWeightsButton = this.Q<Button>("GenerateWeightsButton");
            m_GenerateWeightsButton.clickable.clicked += OnGenerateWeights;

            var normalizeWeightsButton = this.Q<Button>("NormalizeWeightsButton");
            normalizeWeightsButton.clickable.clicked += OnNormalizeWeights;

            var clearWeightsButton = this.Q<Button>("ClearWeightsButton");
            clearWeightsButton.clickable.clicked += OnClearWeights;

            m_AssociateBonesToggle = this.Q<Toggle>("AssociateBonesField");
        }

        public string generateButtonText
        {
            set { m_GenerateWeightsButton.text = value; }
        }

        public void Update(bool enableAssociateBones)
        {
            m_AssociateBoneControl.SetHiddenFromLayout(!enableAssociateBones);
            if (enableAssociateBones)
            {
                RemoveFromClassList("AssociateBoneDisabled");
                AddToClassList("AssociateBoneEnabled");
            }
            else
            {
                RemoveFromClassList("AssociateBoneEnabled");
                AddToClassList("AssociateBoneDisabled");
            }
        }

        public void OnGenerateWeights()
        {
            onGenerateWeights();
        }

        public void OnNormalizeWeights()
        {
            onNormalizeWeights();
        }

        public void OnClearWeights()
        {
            onClearWeights();
        }

        public static GenerateWeightsPanel GenerateFromUXML()
        {
            var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/GenerateWeightsPanel.uxml");
            var clone = visualTree.CloneTree().Q<GenerateWeightsPanel>("GenerateWeightsPanel");
            clone.LocalizeTextInChildren();
            clone.BindElements();
            return clone;
        }
    }
}