using Assets.Scripts;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using static GameHandler;

public class GameController : SingletonMB<GameController>
{
#region PROPERTIES

    public bool IsExiting { get; private set; }
    public SessionData Session { get; private set; } = new SessionData();

#endregion
#region VARIABLES

    private GameHandler _gameHandler;
    private ScoreHandler _scoreHandler;
    private LevelSpawner _LevelSpawner;
    private PlayersHandler _playerHandler;
    private DataBearer _dataBearer;

    private int maxSessionTime;
    private float currentSessionTime;
    private int maxAttempts;
    private int currentAttempts;
#endregion
    #region EVENTS
    public event EventHandler<SessionEventArgs> OnSessionEnded;
    public class SessionEventArgs : EventArgs
    {
        public SessionData session;
        public SessionEventArgs(SessionData session)
        {
            this.session = session;
        }  
    }

    private void ProcessNextAttempt_OnAttemptEnded(object sender, AttemptEventArgs args)
    {
        if(!IsExiting)
        {
            PrepareNextRound();
        }
    }
#endregion
#region METHODS
    /// <summary>
    /// Initialize a new round if there are more available attempts
    /// </summary>
    public void PrepareNextRound()
    {
        currentAttempts+=1;
        

        if(maxAttempts == 0 || _dataBearer.Session.Attempts.Count < maxAttempts)
        {
            _gameHandler.InitAttempt();
        }
        else
        {
            ExitToMenu("Nombre maximum d'essais atteint");
        }
    }

    public void ExitToMenu(string message)
    {
        IsExiting = true;
        Debug.Log("Session END");
        //StartCoroutine(ExitToMenuCoroutine(message));
        _gameHandler.ResumeGame();
        //yield return null;
        if (!_gameHandler.AttemptEnding) _gameHandler.HaltAttempt(message);
        Clean();
        SceneManager.LoadScene("MainMenu");
        _dataBearer.ResetSession();

    }


    //private IEnumerator ExitToMenuCoroutine(string message)
    //{
    //    _gameHandler.ResumeGame();
    //    //yield return null;
    //    if(!_gameHandler.AttemptEnding) _gameHandler.HaltAttempt(message);
    //    _dataBearer.ResetSession();
    //    Clean();
    //    SceneManager.LoadScene("MainMenu");
    //}



#endregion
#region LIFECYCLE
// Start is called before the first frame update
private void Start()
    {
        Debug.Log($"Start session for {Session.Rules.MaxAttempts} rounds");
        _dataBearer.RecordSessionDate(DateTime.Now);


        currentSessionTime = 0f;
        PrepareNextRound();
    }

    // Awake is called before Start
    protected override void Awake()
    {
        base.Awake();

        _gameHandler = GameHandler.Instance;
        _scoreHandler = ScoreHandler.Instance;
        _playerHandler = PlayersHandler.Instance;
        _dataBearer = DataBearer.Instance;

        _gameHandler.OnAttemptEnded += ProcessNextAttempt_OnAttemptEnded;

        maxAttempts = _dataBearer.Rules.MaxAttempts;
        maxSessionTime = _dataBearer.Rules.MaxSessionTime;
        currentAttempts = 0;
    }


    // Update is called once per frame
    void Update()
    {
        currentSessionTime += Time.deltaTime;
        _dataBearer.RecordSessionTime(currentSessionTime);


        if (maxSessionTime > 0 && currentSessionTime >= maxSessionTime)
        {
            currentSessionTime = maxSessionTime;
            _dataBearer.RecordSessionTime(currentSessionTime);
            ExitToMenu("Temps �coul�");
        }
    }

    //Unsubscribe events, save databearer;
    private void OnDestroy()
    {
        Clean();
    }
    private void OnApplicationQuit()
    {
        Clean();
    }

    public void Clean()
    {
        _gameHandler.OnAttemptEnded -= ProcessNextAttempt_OnAttemptEnded;

        if (!_dataBearer.DataSaved)
        {
            //datasaving logic
            _dataBearer.RecordSessionTime(currentSessionTime);

            _dataBearer.SaveData();
        }
    }
    #endregion
}