using System;
using UnityEditor;
using UnityEngine;

namespace Unity.Tutorials.Core.Editor
{
    /// <summary>
    /// Criterion for checking a specific Play Mode state.
    /// </summary>
    public class PlayModeStateCriterion : Criterion
    {
        enum PlayModeState
        {
            Playing,
            NotPlaying
        }

        [SerializeField]
        PlayModeState m_RequiredPlayModeState = PlayModeState.Playing;

        /// <summary>
        /// Starts testing of the criterion.
        /// </summary>
        public override void StartTesting()
        {
            base.StartTesting();
            UpdateCompletion();

            EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
        }

        /// <summary>
        /// Stops testing of the criterion.
        /// </summary>
        public override void StopTesting()
        {
            base.StopTesting();
            EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
        }

        void OnPlayModeStateChanged(PlayModeStateChange playModeStateChange)
        {
            switch (playModeStateChange)
            {
                case PlayModeStateChange.EnteredPlayMode:
                case PlayModeStateChange.EnteredEditMode:
                    UpdateCompletion();
                    break;
            }
        }

        /// <summary>
        /// Evaluates if the criterion is completed.
        /// </summary>
        /// <returns></returns>
        protected override bool EvaluateCompletion()
        {
            switch (m_RequiredPlayModeState)
            {
                case PlayModeState.NotPlaying:
                    return !EditorApplication.isPlaying;

                case PlayModeState.Playing:
                    return EditorApplication.isPlaying;

                default:
                    return false;
            }
        }

        /// <summary>
        /// Auto-completes the criterion.
        /// </summary>
        /// <returns>True if the auto-completion succeeded.</returns>
        public override bool AutoComplete()
        {
            EditorApplication.isPlaying = m_RequiredPlayModeState == PlayModeState.Playing;

            return true;
        }
    }
}