using UnityEditor;
using UnityEngine;

namespace Unity.PlasticSCM.Editor.UI.Progress
{
    internal static class DrawProgressForOperations
    {
        internal static void For(
            WorkspaceWindow workspaceWindow,
            OperationProgressData operationProgressData,
            float width)
        {
            EditorGUILayout.BeginVertical(
                EditorStyles.helpBox, GUILayout.Height(60));

            GUILayout.Label(
                operationProgressData.ProgressHeader ?? string.Empty,
                EditorStyles.miniLabel);

            DoProgressBar(
                operationProgressData.TotalProgressMessage,
                (float)operationProgressData.TotalProgressPercent,
                operationProgressData.CanCancelProgress, width);

            if (operationProgressData.CanCancelProgress)
                DoCancelButton(workspaceWindow);

            if (operationProgressData.ShowCurrentBlock)
            {
                GUILayout.Space(6);
                DoProgressBar(
                    operationProgressData.CurrentBlockProgressMessage,
                    (float)operationProgressData.CurrentBlockProgressPercent,
                    operationProgressData.CanCancelProgress, width);
            }

            EditorGUILayout.EndVertical();
        }

        static void DoProgressBar(
            string message,
            float progressPercent,
            bool canCancel,
            float width)
        {
            Rect progressRect = GUILayoutUtility.GetRect(width, 15);

            if (canCancel)
                progressRect.width -= UnityConstants.CANCEL_BUTTON_SIZE + 2;

            EditorGUI.ProgressBar(progressRect, progressPercent, string.Empty);

            progressRect.xMin += 4;

            GUI.Label(progressRect, message, EditorStyles.miniLabel);
        }

        static void DoCancelButton(
            WorkspaceWindow workspaceWindow)
        {
            Rect beginRect = GUILayoutUtility.GetLastRect();
            Rect endRect = GUILayoutUtility.GetLastRect();

            float freeVerticalSpace = endRect.yMax - beginRect.yMin;

            Rect cancelButtonRect = new Rect(
                endRect.xMax - UnityConstants.CANCEL_BUTTON_SIZE + 1,
                beginRect.yMin + (freeVerticalSpace - UnityConstants.CANCEL_BUTTON_SIZE) / 2,
                UnityConstants.CANCEL_BUTTON_SIZE, UnityConstants.CANCEL_BUTTON_SIZE);

            if (!GUI.Button(cancelButtonRect, GUIContent.none, UnityStyles.CancelButton))
                return;

            workspaceWindow.CancelCurrentOperation();
        }
    }
}