using SRMultiplayer.Networking;
using SRMultiplayer.Packets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace SRMultiplayer
{
    public static class Globals
    {
        public static int Version;
        public static UserData UserData;
        public static GameObject BeatrixModel;
        public static RuntimeAnimatorController BeatrixController;
        public static GameObject IngameMultiplayerMenuPrefab;
        public static GameObject MainMultiplayerMenuPrefab;
        public static Dictionary<byte, NetworkPlayer> Players = new Dictionary<byte, NetworkPlayer>();
        public static string Username;
        public static string ServerCode;
        public static byte LocalID;
        public static NetworkPlayer LocalPlayer;
        public static bool HandlePacket;
        public static Guid PartyID;
        public static bool IsClient { get { return NetworkClient.Instance.Status == NetworkClient.ConnectionStatus.Connected; } }
        public static bool IsServer { get { return NetworkServer.Instance.Status == NetworkServer.ServerStatus.Running; } }
        public static bool IsMultiplayer { get { return IsClient || IsServer; } }
        public static bool GameLoaded;
        public static bool ClientLoaded;
        public static bool DisableAchievements;
        public static string CurrentGameName;
        public static PauseState PauseState;
        public static Dictionary<string, SECTR_AudioCue> Audios = new Dictionary<string, SECTR_AudioCue>();
        public static Dictionary<int, NetworkActor> Actors = new Dictionary<int, NetworkActor>();
        public static Dictionary<int, NetworkRegion> Regions = new Dictionary<int, NetworkRegion>();
        public static Dictionary<string, NetworkLandplot> LandPlots = new Dictionary<string, NetworkLandplot>();
        public static Dictionary<string, GameObject> FXPrefabs = new Dictionary<string, GameObject>();
        public static Dictionary<string, NetworkAccessDoor> AccessDoors = new Dictionary<string, NetworkAccessDoor>();
        public static Dictionary<string, NetworkGordo> Gordos = new Dictionary<string, NetworkGordo>();
        public static Dictionary<int, NetworkSpawnResource> SpawnResources = new Dictionary<int, NetworkSpawnResource>();
        public static Dictionary<string, NetworkPuzzleSlot> PuzzleSlots = new Dictionary<string, NetworkPuzzleSlot>();
        public static Dictionary<string, NetworkWorldStateMasterSwitch> Switches = new Dictionary<string, NetworkWorldStateMasterSwitch>();
        public static Dictionary<string, NetworkGadgetSite> GadgetSites = new Dictionary<string, NetworkGadgetSite>();
        public static Dictionary<int, NetworkDirectedActorSpawner> Spawners = new Dictionary<int, NetworkDirectedActorSpawner>();
        public static Dictionary<string, NetworkTreasurePod> TreasurePods = new Dictionary<string, NetworkTreasurePod>();
        public static Dictionary<int, NetworkExchangeAcceptor> ExchangeAcceptors = new Dictionary<int, NetworkExchangeAcceptor>();
        public static Dictionary<int, NetworkFireColumn> FireColumns = new Dictionary<int, NetworkFireColumn>();
        public static Dictionary<int, NetworkKookadobaPatchNode> Kookadobas = new Dictionary<int, NetworkKookadobaPatchNode>();
        public static Dictionary<int, NetworkNutcracker> Nutcrackers = new Dictionary<int, NetworkNutcracker>();
        public static Dictionary<int, NetworkRaceTrigger> RaceTriggers = new Dictionary<int, NetworkRaceTrigger>();
        public static List<string> LemonTrees = new List<string>();
        public static Dictionary<PacketType, long> PacketSize = new Dictionary<PacketType, long>();

        public static List<string> Mods
        {
            get
            {
                List<string> mods = new List<string>();
                var assemblies = AppDomain.CurrentDomain.GetAssemblies();
                foreach (var assembly in assemblies)
                {
                    if (!assembly.GetName().Name.Contains("Unity") && !assembly.GetName().Name.Contains("InControl") && !assembly.GetName().Name.Contains("DOTween") &&
                        !assembly.GetName().Name.Contains("mscorlib") && !assembly.GetName().Name.Contains("System") && !assembly.GetName().Name.Contains("Assembly-CSharp") &&
                        !assembly.GetName().Name.Contains("Logger") && !assembly.GetName().Name.Contains("Mono.") && !assembly.GetName().Name.Contains("Harmony") &&
                        !assembly.GetName().Name.Equals("SRML") && !assembly.GetName().Name.Equals("SRML.Editor") && !assembly.GetName().Name.Equals("Newtonsoft.Json") &&
                        !assembly.GetName().Name.Equals("INIFileParser") && !assembly.GetName().Name.Equals("SRMultiplayer") && !assembly.GetName().Name.Contains("Microsoft.") &&
                        !assembly.GetName().Name.Equals("SRMP") && !assembly.GetName().Name.Equals("XGamingRuntime") && !Globals.UserData.IgnoredMods.Contains(assembly.GetName().Name))
                    {
                        mods.Add(assembly.GetName().Name);
                    }
                }
                return mods;
            }
        }
    }
}
