using System;
using UnityEngine;
using UnityEngine.UI;
namespace XCharts.Runtime
{
    /// 
    /// UI组件基类。
    /// 
    [ExecuteInEditMode]
    [RequireComponent(typeof(RectTransform))]
    [DisallowMultipleComponent]
    public class UIComponent : BaseGraph
    {
        [SerializeField] private bool m_DebugModel = false;
        [SerializeField] protected UIComponentTheme m_Theme = new UIComponentTheme();
        [SerializeField] private Background m_Background = new Background() { show = true };
        protected bool m_DataDirty;
        private ThemeType m_CheckTheme = 0;
        public override HideFlags chartHideFlags { get { return m_DebugModel ? HideFlags.None : HideFlags.HideInHierarchy; } }
        public UIComponentTheme theme { get { return m_Theme; } set { m_Theme = value; } }
        /// 
        /// 背景样式。
        /// 
        public Background background { get { return m_Background; } set { m_Background = value; color = Color.white; } }
        /// 
        /// Update chart theme.
        /// ||切换内置主题。
        /// 
        /// theme
        public bool UpdateTheme(ThemeType theme)
        {
            if (theme == ThemeType.Custom)
            {
                Debug.LogError("UpdateTheme: not support switch to Custom theme.");
                return false;
            }
            if (m_Theme.sharedTheme == null)
                m_Theme.sharedTheme = XCThemeMgr.GetTheme(ThemeType.Default);
            m_Theme.sharedTheme.CopyTheme(theme);
            m_Theme.SetAllDirty();
            return true;
        }
        [Since("v3.9.0")]
        public void SetDataDirty()
        {
            m_DataDirty = true;
            m_RefreshChart = true;
        }
        public override void SetAllDirty()
        {
            base.SetAllDirty();
            SetDataDirty();
        }
        public override void SetVerticesDirty()
        {
            base.SetVerticesDirty();
            m_RefreshChart = true;
        }
        protected override void InitComponent()
        {
            base.InitComponent();
            if (m_Theme.sharedTheme == null)
                m_Theme.sharedTheme = XCThemeMgr.GetTheme(ThemeType.Default);
            UIHelper.InitBackground(this);
        }
        protected override void CheckComponent()
        {
            base.CheckComponent();
            if (m_Theme.anyDirty)
            {
                if (m_Theme.componentDirty)
                {
                    SetAllComponentDirty();
                }
                if (m_Theme.vertsDirty) RefreshGraph();
                m_Theme.ClearDirty();
            }
        }
        protected override void SetAllComponentDirty()
        {
            base.SetAllComponentDirty();
            InitComponent();
        }
        protected override void OnDrawPainterBase(VertexHelper vh, Painter painter)
        {
            vh.Clear();
            UIHelper.DrawBackground(vh, this);
        }
        protected override void Awake()
        {
            CheckTheme(true);
            base.Awake();
        }
        protected override void Update()
        {
            base.Update();
            if (m_DataDirty)
            {
                m_DataDirty = false;
                DataDirty();
            }
        }
#if UNITY_EDITOR
        protected override void Reset()
        {
            base.Reset();
            Awake();
        }
        protected override void OnValidate()
        {
            base.OnValidate();
        }
#endif
        protected virtual void DataDirty()
        {
        }
        protected virtual void CheckTheme(bool firstInit = false)
        {
            if (m_Theme.sharedTheme == null)
            {
                m_Theme.sharedTheme = XCThemeMgr.GetTheme(ThemeType.Default);
            }
            if (firstInit)
            {
                m_CheckTheme = m_Theme.themeType;
            }
            if (m_Theme.sharedTheme != null && m_CheckTheme != m_Theme.themeType)
            {
                m_CheckTheme = m_Theme.themeType;
                m_Theme.sharedTheme.CopyTheme(m_CheckTheme);
#if UNITY_EDITOR
                UnityEditor.EditorUtility.SetDirty(this);
#endif
                SetAllDirty();
                SetAllComponentDirty();
                OnThemeChanged();
            }
        }
        protected virtual void OnThemeChanged() { }
    }
}