using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using Shooter.ScriptableObjects;

namespace Shooter.Gameplay
{
    /// <summary>
    /// Главный менеджер уровня: вступительный туториал, пауза (Esc), гибель игрока с
    /// перезапуском уровня и продвижение чекпойнтов. Singleton — доступен через
    /// <see cref="m_Current"/>.
    /// </summary>
    public class GameControl : MonoBehaviour
    {
        public static GameControl m_Current;

        [Header("Босс")]
        public bool m_EnteredBossFight = false;
        public GameObject m_LevelBoss;

        [Header("Сохранение и UI")]
        public SaveData m_MainSaveData;
        [Tooltip("Вступительный текст в начале игры")]
        public GameObject m_TextUI_1;
        [Tooltip("Подсказки-туториалы, показываются по очереди в начале")]
        public GameObject[] m_Tutorials;
        public GameObject m_PauseUI;

        [HideInInspector] public bool m_Pausesd = false;

        void Awake()
        {
            m_Current = this;
        }

        void Start()
        {
            StartCoroutine(Co_Start());
        }

        /// <summary>
        /// Вступление: в самом начале игры (первый чекпойнт) показываем текст и
        /// подсказки по очереди; иначе просто плавно проявляем картинку.
        /// </summary>
        IEnumerator Co_Start()
        {
            if (m_MainSaveData.m_CheckpointNumber == 0)
            {
                m_TextUI_1.SetActive(true);
                FadeControl.m_Current.StartFadeIn();
                yield return new WaitForSeconds(4f);
                FadeControl.m_Current.StartFadeOut();
                yield return new WaitForSeconds(3f);
                m_TextUI_1.SetActive(false);
                FadeControl.m_Current.StartFadeIn();

                yield return new WaitForSeconds(2f);
                m_Tutorials[0].SetActive(true);
                yield return new WaitForSeconds(4f);
                m_Tutorials[0].SetActive(false);
                m_Tutorials[1].SetActive(true);
                yield return new WaitForSeconds(4f);
                m_Tutorials[1].SetActive(false);
            }
            else
            {
                FadeControl.m_Current.StartFadeIn();
                yield return new WaitForSeconds(1f);
            }
        }

        void Update()
        {
            // Esc — переключить паузу.
            if (Input.GetKeyDown(KeyCode.Escape))
                SetPaused(!m_Pausesd);
        }

        /// <summary>Ставит игру на паузу или снимает: останавливает время и показывает меню паузы.</summary>
        void SetPaused(bool paused)
        {
            m_Pausesd = paused;
            Time.timeScale = paused ? 0 : 1;
            m_PauseUI.SetActive(paused);
        }

        /// <summary>Сохраняет прогресс чекпойнта, если он дальше уже сохранённого.</summary>
        public void HandleCheckpoint(int num)
        {
            if (num > m_MainSaveData.m_CheckpointNumber)
            {
                m_MainSaveData.m_CheckpointNumber = num;
                m_MainSaveData.Save();
            }
        }

        public void HandlePlayerDeath()
        {
            StartCoroutine(Co_HandleGameOver());
        }

        /// <summary>Гибель: тряска → затемнение → перезапуск текущего уровня.</summary>
        IEnumerator Co_HandleGameOver()
        {
            CameraControl.m_Current.StartShake(.4f, .3f);
            yield return new WaitForSeconds(1);
            FadeControl.m_Current.StartFadeOut();
            yield return new WaitForSeconds(2);
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }

        public void Resume()
        {
            SetPaused(false);
        }

        public void Exit()
        {
            SetPaused(false);
            SceneManager.LoadScene("MainMenu");
        }
    }
}
