using System;
using System.Reflection;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;

namespace UnityEditor.ShaderGraph.Drawing.Controls
{
    [AttributeUsage(AttributeTargets.Property)]
    class ButtonControlAttribute : Attribute, IControlAttribute
    {
        public ButtonControlAttribute()
        {
        }

        public VisualElement InstantiateControl(AbstractMaterialNode node, PropertyInfo propertyInfo)
        {
            return new ButtonControlView(node, propertyInfo);
        }
    }

    [Serializable]
    struct ButtonConfig
    {
        public string text;
        public Action action;
    }

    class ButtonControlView : VisualElement
    {
        public ButtonControlView(AbstractMaterialNode node, PropertyInfo propertyInfo)
        {
            AbstractMaterialNode m_Node;

            m_Node = node;

            Type type = propertyInfo.PropertyType;
            if (type != typeof(ButtonConfig))
            {
                throw new ArgumentException("Property must be a ButtonConfig.", "propertyInfo");
            }
            var value = (ButtonConfig)propertyInfo.GetValue(m_Node, null);

            Add(new Button(value.action) { text = value.text });
        }
    }
}