using System;
using UnityEngine;
using UnityEngine.UIElements;

namespace UnityEditor.Rendering.Converter
{
    internal class RenderPipelineConverterItemVisualElement : VisualElement
    {
        const string k_Uxml = "Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConverterItemVisualElement.uxml";

        static Lazy<VisualTreeAsset> s_VisualTreeAsset = new Lazy<VisualTreeAsset>(() => AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(k_Uxml));

        VisualElement m_RootVisualElement;
        Toggle m_ItemSelectedToggle;
        ConverterItemState m_ConverterItemState;

        public Action itemSelectionChanged;

        public RenderPipelineConverterItemVisualElement()
        {
            m_RootVisualElement = new VisualElement();
            s_VisualTreeAsset.Value.CloneTree(m_RootVisualElement);

            m_ItemSelectedToggle = m_RootVisualElement.Q<Toggle>("converterItemActive");
            m_ItemSelectedToggle.RegisterCallback<ClickEvent>(evt =>
            {
                if (m_ConverterItemState != null)
                {
                    m_ConverterItemState.isSelected = !m_ConverterItemState.isSelected;
                    itemSelectionChanged?.Invoke();
                }
            });

            Add(m_RootVisualElement);
        }

        public void Bind(ConverterItemState itemState)
        {
            m_ConverterItemState = itemState;

            m_ItemSelectedToggle.SetValueWithoutNotify(m_ConverterItemState.isSelected);

            var item = m_ConverterItemState.item;
            m_RootVisualElement.Q<Label>("converterItemName").text = item.name;
            m_RootVisualElement.Q<Label>("converterItemPath").text = item.info;

            // Changing the icon here depending on the status.
            Texture2D icon = null;
            Status status = m_ConverterItemState.conversionResult.Status;
            switch (status)
            {
                case Status.Pending:
                    icon = CoreEditorStyles.iconPending;
                    break;
                case Status.Error:
                    icon = CoreEditorStyles.iconFail;
                    break;
                case Status.Warning:
                    icon = CoreEditorStyles.iconWarn;
                    break;
                case Status.Success:
                    icon = CoreEditorStyles.iconComplete;
                    break;
            }

            m_RootVisualElement.Q<Image>("converterItemStatusIcon").image = icon;
            m_RootVisualElement.Q<Image>("converterItemStatusIcon").tooltip = m_ConverterItemState.conversionResult.Message;
        }

    }
}