using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using UnityEngine.Profiling;

namespace Baidu.VR.DepthpanoEditor
{
    internal class SerializedPropertyTable
    {
        private static readonly string s_TableHeight = "_TableHeight";

        private readonly float m_DragHeight = 20f;

        private readonly float m_DragWidth = 32f;

        private readonly float m_FilterHeight = 20f;

        private float m_ColumnHeaderHeight;

        private SerializedPropertyDataStore m_DataStore;

        private readonly SerializedPropertyDataStore.GatherDelegate m_GatherDelegate;

        private readonly HeaderDelegate m_HeaderDelegate;

        private bool m_Initialized;

        private MultiColumnHeaderState m_MultiColumnHeaderState;

        private readonly string m_SerializationUID;

        //private float m_TableHeight = 200f;

        private SerializedPropertyTreeView m_TreeView;

        private TreeViewState m_TreeViewState;

        public SerializedPropertyTable(string serializationUID, SerializedPropertyDataStore.GatherDelegate gatherDelegate, HeaderDelegate headerDelegate)
        {
            //dragHandleEnabled = true;
            m_SerializationUID = serializationUID;
            m_GatherDelegate = gatherDelegate;
            m_HeaderDelegate = headerDelegate;
            //OnEnable();
        }

        //public bool dragHandleEnabled { get; set; }

        private void InitIfNeeded()
        {
            if (!m_Initialized)
            {
                if (m_TreeViewState == null)
                    m_TreeViewState = new TreeViewState();
                if (m_MultiColumnHeaderState == null)
                {
                    string[] propNames;
                    m_MultiColumnHeaderState = new MultiColumnHeaderState(m_HeaderDelegate(out propNames));
                    m_DataStore = new SerializedPropertyDataStore(propNames, m_GatherDelegate);
                }
                var multiColumnHeader = new MultiColumnHeader(m_MultiColumnHeaderState);
                m_ColumnHeaderHeight = multiColumnHeader.height;
                m_TreeView = new SerializedPropertyTreeView(m_TreeViewState, multiColumnHeader, m_DataStore);
                m_TreeView.DeserializeState(m_SerializationUID);
                m_TreeView.Reload();
                m_Initialized = true;
            }
        }

        private float GetMinHeight()
        {
            var singleLineHeight = EditorGUIUtility.singleLineHeight;
            var num = m_FilterHeight + m_ColumnHeaderHeight + singleLineHeight + m_DragHeight;
            return num + singleLineHeight * 3f;
        }

        public void OnInspectorUpdate()
        {
            if (m_DataStore != null && m_DataStore.Repopulate() && m_TreeView != null)
                m_TreeView.FullReload();
            else if (m_TreeView != null && m_TreeView.Update())
                m_TreeView.Repaint();
        }

        public void OnHierarchyChange()
        {
            if (m_DataStore != null && m_DataStore.Repopulate() && m_TreeView != null)
                m_TreeView.FullReload();
        }

        public void OnSelectionChange()
        {
            OnSelectionChange(Selection.instanceIDs);
        }

        public void OnSelectionChange(int[] instanceIDs)
        {
            if (m_TreeView != null)
                m_TreeView.SetSelection(instanceIDs);
        }

        public void OnGUI()
        {
            Profiler.BeginSample("SerializedPropertyTable.OnGUI");
            InitIfNeeded();
            var rect = GUILayoutUtility.GetRect(0f, Screen.width, 0f, Screen.height);
            if (Event.current.type != EventType.Layout)
            {
                rect.x += m_DragWidth;
                rect.width -= m_DragWidth * 2;

                rect.y += m_DragHeight;

                var r = rect;
                rect.y += m_FilterHeight;
                rect.height = rect.height - m_FilterHeight - m_DragHeight * 2;

                var rect2 = rect;
                Profiler.BeginSample("TreeView.OnGUI");
                m_TreeView.OnGUI(rect2);
                Profiler.EndSample();

                //m_TreeView.OnFilterGUI(r);
                if (m_TreeView.IsFilteredDirty())
                    m_TreeView.Reload();
                Profiler.EndSample();
            }
        }

        //public void OnEnable()
        //{
        //    m_TableHeight = SessionState.GetFloat(m_SerializationUID + s_TableHeight, 200f);
        //}

        public void OnDisable()
        {
            if (m_TreeView != null)
                m_TreeView.SerializeState(m_SerializationUID);
            //SessionState.SetFloat(m_SerializationUID + s_TableHeight, m_TableHeight);
        }

        private static class Styles
        {
            public static readonly GUIStyle DragHandle = "RL DragHandle";
        }

        internal delegate SerializedPropertyTreeView.Column[] HeaderDelegate(out string[] propNames);
    }
}