using System;

using UnityEditor;
using UnityEngine;

using Codice.Client.Common.WebApi;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.CloudDrive.Workspaces;
using Unity.PlasticSCM.Editor.UI;

namespace Unity.PlasticSCM.Editor.CloudDrive.CreateWorkspace
{
    class CreateWorkspaceDialog : PlasticDialog, IPlasticDialogCloser
    {
        protected override Rect DefaultRect
        {
            get
            {
                var baseRect = base.DefaultRect;
                return new Rect(baseRect.x, baseRect.y, 850, 560);
            }
        }

        internal static WorkspaceCreationData CreateWorkspace(
            string proposedOrganization,
            string proposedProject,
            IPlasticWebRestApi restApi,
            IPlasticAPI plasticApi,
            EditorWindow parentWindow)
        {
            CreateWorkspaceDialog dialog = Create(
                proposedOrganization,
                proposedProject,
                restApi,
                plasticApi,
                parentWindow,
                null);

            ResponseType dialogResult = dialog.RunModal(parentWindow);

            WorkspaceCreationData result = mCreateWorkspacePanel.BuildCreationData();
            result.Result = dialogResult == ResponseType.Ok;
            return result;
        }

        internal static void CreateWorkspace(
            IPlasticWebRestApi restApi,
            IPlasticAPI plasticApi,
            EditorWindow parentWindow,
            Action<WorkspaceInfo> successOperationDelegate)
        {
            CreateWorkspaceDialog dialog = Create(
                string.Empty,
                string.Empty,
                restApi,
                plasticApi,
                parentWindow,
                successOperationDelegate);

            dialog.RunModal(parentWindow);
        }

        void IPlasticDialogCloser.CloseDialog()
        {
            if (mSuccessOperationDelegate == null)
            {
                OkButtonAction();
                return;
            }

            WorkspaceCreationData wkCreationData = mCreateWorkspacePanel.BuildCreationData();
            wkCreationData.Result = true;

            CreateWorkspaceOperation.CreateWorkspace(
                wkCreationData,
                PlasticGui.Plastic.API,
                mProgressControls,
                (createdWorkspace) =>
                {
                    OkButtonAction();
                    mSuccessOperationDelegate(createdWorkspace);
                });
        }

        static CreateWorkspaceDialog Create(
            string proposedOrganization,
            string proposedProject,
            IPlasticWebRestApi restApi,
            IPlasticAPI plasticApi,
            EditorWindow parentWindow,
            Action<WorkspaceInfo> successOperationDelegate)
        {
            var instance = CreateInstance<CreateWorkspaceDialog>();
            instance.IsResizable = false;

            mCreateWorkspacePanel = new CreateWorkspacePanel(
                proposedOrganization,
                proposedProject,
                restApi,
                plasticApi,
                parentWindow,
                instance.mProgressControls);

            instance.mEnterKeyAction = instance.OkButtonAction;
            instance.mEscapeKeyAction = instance.CancelButtonAction;
            instance.mTitle = PlasticLocalization.Name.CreateCloudWorkspaceTitle.GetString();
            instance.mSuccessOperationDelegate = successOperationDelegate;
            return instance;
        }

        protected override string GetTitle()
        {
            return mTitle;
        }

        protected override void DoComponentsArea()
        {
            bool isOperationRunning = mProgressControls.ProgressData.IsWaitingAsyncResult;

            mCreateWorkspacePanel.OnGUI(isOperationRunning);
        }

        protected override void DoOkButton()
        {
            if (mProgressControls.ProgressData.IsWaitingAsyncResult)
                GUI.enabled = false;

            if (NormalButton(PlasticLocalization.Name.CreateButton.GetString()))
            {
                OkButtonAction();
            }

            GUI.enabled = true;
        }

        internal override void OkButtonAction()
        {
            WorkspaceCreationValidation.AsyncValidation(
                mCreateWorkspacePanel.BuildCreationData(), this, mProgressControls);
        }

        string mTitle;
        Action<WorkspaceInfo> mSuccessOperationDelegate;

        static CreateWorkspacePanel mCreateWorkspacePanel;
    }
}