using System.Collections.Generic;

using UnityEngine;

using Codice.CM.Common;
using Unity.PlasticSCM.Editor.UI.Tree;

using EditorGUILayout = UnityEditor.EditorGUILayout;
using EditorStyles = UnityEditor.EditorStyles;

#if !UNITY_6000_3_OR_NEWER
using Unity.PlasticSCM.Editor.UnityInternals.UnityEditor;
#else
using UnityEditor;
#endif

namespace Unity.PlasticSCM.Editor.UI.Errors
{
    internal class ErrorsPanel
    {
        internal bool IsVisible { get; private set; }

        internal ErrorsPanel(
            string title,
            string treeSettingsName,
            string splitterSettingsName)
        {
            mTitle = title;
            mTreeSettingsName = treeSettingsName;
            mSplitterSettingsName = splitterSettingsName;

            ErrorsListHeaderState errorsListHeaderState =
                ErrorsListHeaderState.GetDefault();
            TreeHeaderSettings.Load(
                errorsListHeaderState,
                treeSettingsName,
                UnityConstants.UNSORT_COLUMN_ID);

            mErrorsListView = new ErrorsListView(errorsListHeaderState);
            mErrorsListView.Reload();

            mErrorDetailsSplitterState = new SplitterState(
                SplitterSettings.Load(
                    splitterSettingsName,
                    new float[] { 0.60f, 0.40f }),
                new int[] { 100, 100 },
                new int[] { 100000, 100000 }
            );
        }

        internal void UpdateErrorsList(List<ErrorMessage> errorMessages)
        {
            mErrorsListView.BuildModel(errorMessages);
            mErrorsListView.Reload();

            IsVisible = errorMessages.Count > 0;
        }

        internal void OnDisable()
        {
            TreeHeaderSettings.Save(
                mErrorsListView.multiColumnHeader.state,
                mTreeSettingsName);

            SplitterSettings.Save(
                mErrorDetailsSplitterState,
                mSplitterSettingsName);
        }

        internal void OnGUI()
        {
            EditorGUILayout.BeginVertical();

            if (!string.IsNullOrEmpty(mTitle))
            {
                DrawSplitter.ForHorizontalIndicator();

                GUILayout.Label(
                    mTitle,
                    EditorStyles.boldLabel);
            }

            DoErrorsListSplitViewArea(
                mErrorsListView, mErrorDetailsSplitterState);

            EditorGUILayout.EndVertical();
        }

        void DoErrorsListSplitViewArea(
            ErrorsListView errorsListView,
            SplitterState splitterState)
        {
            EditorGUILayout.BeginHorizontal();

            SplitterGUILayout.BeginHorizontalSplit(splitterState);

            DoErrorsListViewArea(errorsListView);

            DoErrorDetailsTextArea(errorsListView.GetSelectedError());

            SplitterGUILayout.EndHorizontalSplit();

            EditorGUILayout.EndHorizontal();
        }

        static void DoErrorsListViewArea(
            ErrorsListView errorsListView)
        {
            Rect treeRect = GUILayoutUtility.GetRect(0, 100000, 0, 100000);

            errorsListView.OnGUI(treeRect);
        }

        void DoErrorDetailsTextArea(ErrorMessage selectedErrorMessage)
        {
            string errorDetailsText = selectedErrorMessage == null ?
                string.Empty : selectedErrorMessage.Error;

            mErrorDetailsScrollPosition = GUILayout.BeginScrollView(
                mErrorDetailsScrollPosition);

            GUILayout.TextArea(
                errorDetailsText, UnityStyles.TextFieldWithWrapping,
                GUILayout.ExpandHeight(true));

            GUILayout.EndScrollView();
        }

        Vector2 mErrorDetailsScrollPosition;

        readonly string mTitle;
        readonly string mTreeSettingsName;
        readonly string mSplitterSettingsName;
        readonly ErrorsListView mErrorsListView;
        readonly SplitterState mErrorDetailsSplitterState;
    }
}