using UnityEditor;
using UnityEngine;

namespace Unity.PlasticSCM.Editor.UI.Progress
{
    internal static class DrawProgressForViews
    {
        internal static void ForNotificationArea(
            ProgressControlsForViews.Data data)
        {
            EditorGUILayout.BeginHorizontal();

            EditorGUILayout.HelpBox(
                data.NotificationMessage,
                data.NotificationType);

            EditorGUILayout.EndHorizontal();
        }

        internal static void ForDeterminateProgressBar(
            ProgressControlsForViews.Data data)
        {
            ForProgressBar(data, true);
        }

        static void ForProgressBar(ProgressControlsForViews.Data data, bool showPercentage)
        {
            EditorGUILayout.BeginHorizontal();

            GUILayout.Space(10);

            DoProgressBar(data.ProgressPercent);

            GUILayout.Space(3);

            DoProgressBarLabel(data, showPercentage);

            GUILayout.FlexibleSpace();

            EditorGUILayout.EndHorizontal();
        }

        internal static void ForIndeterminateProgressSpinner(
            ProgressControlsForViews.Data data)
        {
            EditorGUILayout.BeginHorizontal();

            GUILayout.Space(10);

            DoProgressSpinner(data.ProgressPercent);

            DoProgressSpinnerLabel(data.ProgressMessage);

            GUILayout.FlexibleSpace();

            EditorGUILayout.EndHorizontal();
        }

        static void DoProgressBar(float progressPercent)
        {
            EditorGUILayout.BeginVertical(GUILayout.Height(22));

            GUILayout.FlexibleSpace();

            Rect progressRect = GUILayoutUtility.GetRect(30, 10);

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

            GUILayout.FlexibleSpace();

            EditorGUILayout.EndVertical();
        }

        static void DoProgressSpinner(float progressPercent)
        {
            EditorGUILayout.BeginVertical(GUILayout.Height(22));

            GUILayout.FlexibleSpace();

            LoadingSpinner.OnGUI(progressPercent);

            GUILayout.FlexibleSpace();

            EditorGUILayout.EndVertical();
        }

        static void DoProgressBarLabel(ProgressControlsForViews.Data data, bool showPercentage)
        {
            EditorGUILayout.BeginVertical(GUILayout.Height(22));

            GUILayout.FlexibleSpace();

            GUILayout.Label(
                showPercentage ?
                    string.Format("{0} ({1}%)", data.ProgressMessage, (int)(data.ProgressPercent * 100)) :
                    data.ProgressMessage,
                UnityStyles.ProgressLabel);

            GUILayout.FlexibleSpace();

            EditorGUILayout.EndVertical();
        }

        static void DoProgressSpinnerLabel(string progressMessage)
        {
            EditorGUILayout.BeginVertical(GUILayout.Height(EditorGUIUtility.singleLineHeight));

            GUILayout.FlexibleSpace();

            GUILayout.Space(1);

            GUILayout.Label(progressMessage, UnityStyles.ProgressLabel);

            GUILayout.FlexibleSpace();

            EditorGUILayout.EndVertical();
        }
    }
}