using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using Player;
using System;

public class CustomNetworkManager : NetworkManager
{
    public List<GameObject> players;

    // public event Action RestartCallback;

    public List<Pawn> alive;
    public List<Pawn> dead;

    public event Action OnSceneChanged;
    public event Action OnLiveStateCallback;

    private float _restartTime = 5f;
    public int maxMonsters;

    public override void OnServerSceneChanged(string sceneName)
    {
        // foreach (var player in players)
        // {
        //     player.GetComponent<Pawn>().OnLiveState -= OnLiveState;
        // }

        base.OnServerSceneChanged(sceneName);

        players.Clear();
        alive.Clear();
        dead.Clear();

        foreach (NetworkConnectionToClient conn in NetworkServer.connections.Values)
        {
            NetworkServer.SetClientReady(conn);
            NetworkClient.ready = true;

            if (conn.identity != null)
            {
                this.OnServerAddPlayer(conn);
            }
        }

        OnSceneChanged?.Invoke();
    }

    public override void OnServerAddPlayer(NetworkConnectionToClient conn)
    {
        base.OnServerAddPlayer(conn);
        players.Add(conn.identity.gameObject);

        Pawn player = conn.identity.GetComponent<Pawn>();

        player.OnLiveState += OnLiveState;
    }

    public override void OnServerDisconnect(NetworkConnectionToClient conn)
    {
        players.Remove(conn.identity.gameObject);
        Pawn player = conn.identity.GetComponent<Pawn>();

        player.OnLiveState -= OnLiveState;

        if (alive.Contains(player))
            alive.Remove(player);

        if (dead.Contains(player))
            dead.Remove(player);

        base.OnServerDisconnect(conn);
    }

    [Server]
    public void CallLiveStateCallback()
    {
        OnLiveStateCallback?.Invoke();
    }

    [Server]
    private void OnLiveState(Pawn player, bool state)
    {
        if (state)
        {
            if (!alive.Contains(player))
                alive.Add(player);

            if (dead.Contains(player))
                dead.Remove(player);
        }
        else
        {
            if (alive.Contains(player))
                alive.Remove(player);

            if (!dead.Contains(player))
                dead.Add(player);
        }

        CallLiveStateCallback();
    }

    [Server]
    public void RestartScene()
    {
        StartCoroutine(RestartTimer());
    }

    IEnumerator RestartTimer()
    {
        yield return new WaitForSeconds(_restartTime);

        this.ServerChangeScene(NetworkManager.networkSceneName);
        StopCoroutine(RestartTimer());
    }

    // private List<GameObject> alive2 {
    //     get {
    //         return players.FindAll(player => player.GetComponent<Pawn>().Alive == true).ConvertAll();
    //     }
    // }
}