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

public class NetworkGameManager : NetworkBehaviour
{
    public static NetworkGameManager singleton { get; private set; }
    private CustomNetworkManager networkManager;
    
    private int _level;
    
    public GameObject enemyPrefab;
    public List<GameObject> enemyList = new();

    public GameObject winner;
    public bool gameStart = false;
    public event Action RestartCallback;

    void Awake()
    {
        if (singleton != null && singleton != this)
        {
            Destroy(this);
        }
        else
        {
            singleton = this;
        }
    }

    void Start()
    {
        _level = PlayerPrefs.GetInt("Level");
        
        networkManager = NetworkManager.singleton.GetComponent<CustomNetworkManager>();

        networkManager.OnLiveStateCallback += OnLiveStateCallback;

        // foreach (var playerObject in networkManager.players)
        // {
        //     var player = playerObject.GetComponent<Pawn>();
        //     player.OnLiveState += OnLiveState;
        // }
    }

    [Server]
    void OnLiveStateCallback()
    {
        if (networkManager.dead.Count == networkManager.players.Count)
        {
            CmdRestartScene();
        }

        if (networkManager.alive.Count == 1 && networkManager.players.Count > 1)
        {
            SetWinner(networkManager.alive[0].gameObject);
        }
    }

    [ClientRpc]
    public void SetWinner(GameObject gameObject)
    {
        winner = gameObject;
        CmdRestartScene();
    }


    [ClientRpc]
    void RpcResetScene()
    {
        RestartCallback?.Invoke();
    }

    [Command(requiresAuthority = false)]
    public void CmdRestartScene()
    {
        RpcResetScene();
        networkManager.RestartScene();
    }

    private void FixedUpdate()
    {
        if (enemyList.Count == networkManager.maxMonsters || _level != 0) return;
        
        if (networkManager.players.Count == networkManager.maxConnections )
        {
            for (int i = 0; i < networkManager.maxMonsters; i++)
            {
                GameObject go = Instantiate(enemyPrefab, new Vector3(80 + i, 0, 30.7f), Quaternion.identity);

                NetworkServer.Spawn(go);
                enemyList.Add(go);
            }
        }
    }
}