using UnityEngine;
using GeoSus.Client;
using Subsystems;
using System.Collections;
using System;
using TMPro;
/*
    GameManager - hlavní třida pro správu hry
    GameManager_Network - subsystém pro správu komunikace se serverem
    GameManager_Game - subsystém pro správu logiky hry (sabotáže, tasky, atd.)
    GameManager_Map - subsystém pro správu mapy a prostředí
    GameManager_Input - subsystém pro správu vstupu od hráče
    GameManager_UI - subsystém pro správu uživatelského rozhraní
    GamaManager_Stats - subsystém pro správu statistik pro server 
 */
public class GameManager : MonoBehaviour
{
    [Header("Subsystems")]
    protected GameManager_Network networkSubsystem;
    protected GameManager_UI uiSubsystem;
    protected GameManager_Map mapSubsystem;
    protected GameManager_Input inputSubsystem;

    protected GameClient gameClient;

    [Header("Player Info")]
    public string displayName;

    [Header("UI Elements")]
    public Canvas JoinCreateLobby;
    public Canvas InLobby;
    public Canvas LoadingScreen;
    public Canvas GameScreen;


    [Header("Map")]
    public GameObject MapCenterPoint;
    public BuildingSettings buildingSettings;
    public PathwaySettings pathwaySettings;
    public AreaSettings areaSettings;

    [Header("GPS")]
    public GameObject Player;

    [Header("Debug")]
    public bool testMode = false;
    private GameClient _secondClient;
    private GameClient _thirdClient;
    private GameManager_Network _secondNetwork;
    private GameManager_Network _thirdNetwork;


    void Start()
    {
        DontDestroyOnLoad(this);
        if (displayName == null || displayName == "")
        {
            displayName = GenerateUsername();
        }
        if (testMode)
        {
            _secondClient = new GameClient(GenerateUUID(), GenerateUsername());
            _secondNetwork = new GameManager_Network(_secondClient);
            _thirdClient = new GameClient(GenerateUUID(), GenerateUsername());
            _thirdNetwork = new GameManager_Network(_thirdClient);

            _secondNetwork.OpenConection();
            _thirdNetwork.OpenConection();
        }
        gameClient = new GameClient(GenerateUUID(), displayName);
        uiSubsystem = new GameManager_UI(gameClient, JoinCreateLobby, InLobby, LoadingScreen, GameScreen);
        networkSubsystem = new GameManager_Network(gameClient);
        mapSubsystem = new GameManager_Map(gameClient, MapCenterPoint, buildingSettings, pathwaySettings, areaSettings);
        inputSubsystem = new GameManager_Input(gameClient, Player, testMode);
        networkSubsystem.OpenConection();
    }
    private void Update()
    {
        if (gameClient.CurrentLobbyState != null)
        {
            uiSubsystem.UpdateLobbyUI();
        }
        try
        {
            if (gameClient.CurrentLobbyState.MapDataReady)
            {
                mapSubsystem.BuildMap();
                gameClient.CurrentLobbyState.MapDataReady = false;
            }
        }
        catch (NullReferenceException ex) { }
        inputSubsystem.positionCheck();
    }


    protected string GenerateUUID()
    {
        string UUID = System.Guid.NewGuid().ToString();
        Debug.Log(UUID);
        return UUID;
    }
    protected string GenerateUsername()
    {
        string Username = UnityEngine.Random.Range(0,10).ToString() + UnityEngine.Random.Range(0, 10).ToString() + UnityEngine.Random.Range(0, 10).ToString() + UnityEngine.Random.Range(0, 10).ToString();
        Debug.Log(Username);
        return Username;
    }
    public void CreateLobbyButton()
    {
        networkSubsystem.CrateLobby(50.7727264, 15.0719876);
        if (testMode)
        {
            StartCoroutine(ConnectTestClients());
        }
    }
    public void JoinLobbyButton()
    {
        TMP_InputField joinCode = JoinCreateLobby.transform.Find("InputCode").GetComponent<TMP_InputField>();
        if (joinCode.text != null && joinCode.text != "")
        {
            networkSubsystem.JoinLobby(joinCode.text);
        }
        else
        {
            Debug.Log("Join code is empty!");
        }
    }
    public void LeaveLobbyButton()
    {
        networkSubsystem.LeaveLobby();
    }
    public void StartGameButton()
    {
        networkSubsystem.StartGame();
    }
    void OnApplicationQuit()
    {
        gameClient.Disconnect();
        _secondClient?.Disconnect();
        _thirdClient?.Disconnect();
    }
    IEnumerator ConnectTestClients()
    {
        yield return new WaitForSeconds(2f);
        _secondNetwork.JoinLobby(gameClient.CurrentLobbyState.JoinCode);
        _thirdNetwork.JoinLobby(gameClient.CurrentLobbyState.JoinCode);
    }
}
