using System.Collections;
using UnityEngine;
using UnityEngine.UI;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Затемнение экрана: чёрная картинка на весь экран, которую можно плавно проявить
    /// (fade in — из чёрного) или затемнить (fade out — в чёрное). Используется при
    /// старте уровня, гибели и переходах. Singleton — доступен через <see cref="m_Current"/>.
    /// </summary>
    public class FadeControl : MonoBehaviour
    {
        public static FadeControl m_Current;

        public Image m_FadeImage;
        [Tooltip("Скорость затемнения/проявления (доля непрозрачности в секунду)")]
        public float m_FadeSpeed = 0.5f;

        void Awake()
        {
            m_Current = this;
        }

        void Start()
        {
            m_FadeImage.gameObject.SetActive(false);
            StartFadeIn();
        }

        public void StartFadeOut() => StartCoroutine(Co_StartFadeOut());
        public void StartFadeIn() => StartCoroutine(Co_StartFadeIn());

        /// <summary>Затемнение в чёрное.</summary>
        IEnumerator Co_StartFadeOut()
        {
            m_FadeImage.gameObject.SetActive(true);
            float fade = 0;
            while (fade < 1f)
            {
                fade += m_FadeSpeed * Time.deltaTime;
                m_FadeImage.color = new Color(0, 0, 0, fade);
                yield return null;
            }
            m_FadeImage.color = Color.black;
        }

        /// <summary>Проявление из чёрного.</summary>
        IEnumerator Co_StartFadeIn()
        {
            m_FadeImage.gameObject.SetActive(true);
            m_FadeImage.color = Color.black;
            float fade = 1;
            while (fade > 0f)
            {
                fade -= m_FadeSpeed * Time.deltaTime;
                m_FadeImage.color = new Color(0, 0, 0, fade);
                yield return null;
            }
            m_FadeImage.gameObject.SetActive(false);
        }
    }
}
