using UnityEditor;
using UnityEngine;

using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow.Attributes;
using PlasticGui.WorkspaceWindow.QueryViews.Attributes;
using Unity.PlasticSCM.Editor.UI;

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

namespace Unity.PlasticSCM.Editor.Views.Attributes
{
    internal class CreateAttributeView : IPlasticDialogCloser
    {
        internal CreateAttributeView(
            RepositorySpec repSpec,
            IWorkspaceWindow workspaceWindow,
            ApplyAttributeDialogOperations.IApplyAttributeDialog applyAttributeView,
            IProgressControls progressControls,
            AttributeDataDialog parentWindow)
        {
            mRepSpec = repSpec;
            mWorkspaceWindow = workspaceWindow;
            mApplyAttributeView = applyAttributeView;
            mProgressControls = progressControls;
            mParentWindow = parentWindow;
        }

        void IPlasticDialogCloser.CloseDialog()
        {
            mParentWindow.ToggleCreateAttributeView(false);

            ApplyAttributeDialogOperations.CreateAttribute(
                BuildCreationData(),
                mWorkspaceWindow,
                mProgressControls,
                mApplyAttributeView);
        }

        internal void OkButtonAction()
        {
            AttributeDataValidation.AsyncValidation(
                BuildCreationData(),
                this,
                mProgressControls);
        }

        AttributeData BuildCreationData()
        {
            return new AttributeData(
                mRepSpec,
                null,
                mAttributeName,
                mComments);
        }

        internal void OnGUI()
        {
            using (new EditorGUILayout.VerticalScope())
            {
                using (new EditorGUILayout.HorizontalScope())
                {
                    GUILayout.Label(
                        PlasticLocalization.Name.AttributeNameLabel.GetString(),
                        GUILayout.Width(HORIZONTAL_ALIGNMENT));

                    Rect nameRect = GUILayoutUtility.GetRect(
                        new GUIContent(string.Empty),
                        EditorStyles.textField,
                        GUILayout.Width(ENTRIES_WIDTH));

                    GUI.SetNextControlName(NAME_FIELD_CONTROL_NAME);
                    mAttributeName = UnityEditor.EditorGUI.TextField(nameRect, mAttributeName);

                    if (!mWasNameFieldFocused)
                    {
                        UnityEditor.EditorGUI.FocusTextInControl(NAME_FIELD_CONTROL_NAME);
                        mWasNameFieldFocused = true;
                    }
                }

                GUILayout.Space(5);

                using (new EditorGUILayout.HorizontalScope())
                {
                    using (new EditorGUILayout.VerticalScope(GUILayout.Width(HORIZONTAL_ALIGNMENT)))
                    {
                        GUILayout.Space(49);
                        GUILayout.Label(
                            PlasticLocalization.Name.AttributeCommentLabel.GetString(),
                            GUILayout.Width(HORIZONTAL_ALIGNMENT));
                    }

                    using (new EditorGUILayout.VerticalScope())
                    {
                        Rect commentRect = GUILayoutUtility.GetRect(
                            new GUIContent(string.Empty),
                            EditorStyles.textArea,
                            GUILayout.Height(COMMENTS_HEIGHT),
                            GUILayout.Width(ENTRIES_WIDTH));

                        mComments = EditorGUI.ScrollableTextAreaInternal(
                            commentRect,
                            mComments,
                            ref mScrollPosition,
                            EditorStyles.textArea);

                        GUILayout.Space(5);

                        GUILayout.Label(
                            PlasticLocalization.Name.AttributeHelpLabel.GetString(),
                            UnityStyles.Dialog.MiniLabelText);
                    }
                }
            }
        }

        string mAttributeName = string.Empty;
        string mComments = string.Empty;
        Vector2 mScrollPosition;
        bool mWasNameFieldFocused;

        readonly RepositorySpec mRepSpec;
        readonly IWorkspaceWindow mWorkspaceWindow;
        readonly ApplyAttributeDialogOperations.IApplyAttributeDialog mApplyAttributeView;
        readonly IProgressControls mProgressControls;
        readonly AttributeDataDialog mParentWindow;

        const int HORIZONTAL_ALIGNMENT = 100;
        const int COMMENTS_HEIGHT = 200;
        const int ENTRIES_WIDTH = 350;
        const string NAME_FIELD_CONTROL_NAME = "CreateAttributeNameField";
    }
}