using System.Text.Json.Serialization;
using SPTarkov.Server.Core.Models.Eft.Common;

namespace SPTarkov.Server.Core.Models.Spt.Server;

public record SettingsBase
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("config")]
    public Config Configuration { get; set; }
}

public record Config
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("AFKTimeoutSeconds")]
    public int AFKTimeoutSeconds { get; set; }

    [JsonPropertyName("AdditionalRandomDelaySeconds")]
    public int AdditionalRandomDelaySeconds { get; set; }

    [JsonPropertyName("AudioSettings")]
    public AudioSettings AudioSettings { get; set; }

    [JsonPropertyName("ClientSendRateLimit")]
    public int ClientSendRateLimit { get; set; }

    [JsonPropertyName("CriticalRetriesCount")]
    public int CriticalRetriesCount { get; set; }

    [JsonPropertyName("DefaultRetriesCount")]
    public int DefaultRetriesCount { get; set; }

    [JsonPropertyName("FirstCycleDelaySeconds")]
    public int FirstCycleDelaySeconds { get; set; }

    [JsonPropertyName("FramerateLimit")]
    public FramerateLimit FramerateLimit { get; set; }

    [JsonPropertyName("GroupStatusInterval")]
    public int GroupStatusInterval { get; set; }

    [JsonPropertyName("GroupStatusButtonInterval")]
    public int GroupStatusButtonInterval { get; set; }

    [JsonPropertyName("KeepAliveInterval")]
    public int KeepAliveInterval { get; set; }

    [JsonPropertyName("LobbyKeepAliveInterval")]
    public int LobbyKeepAliveInterval { get; set; }

    [JsonPropertyName("Mark502and504AsNonImportant")]
    public bool Mark502and504AsNonImportant { get; set; }

    [JsonPropertyName("MemoryManagementSettings")]
    public MemoryManagementSettings MemoryManagementSettings { get; set; }

    [JsonPropertyName("NVidiaHighlights")]
    public bool NVidiaHighlights { get; set; }

    [JsonPropertyName("NextCycleDelaySeconds")]
    public int NextCycleDelaySeconds { get; set; }

    [JsonPropertyName("PingServerResultSendInterval")]
    public int PingServerResultSendInterval { get; set; }

    [JsonPropertyName("PingServersInterval")]
    public int PingServersInterval { get; set; }

    [JsonPropertyName("ReleaseProfiler")]
    public ReleaseProfiler ReleaseProfiler { get; set; }

    [JsonPropertyName("RequestConfirmationTimeouts")]
    public List<double> RequestConfirmationTimeouts { get; set; }

    [JsonPropertyName("RequestsMadeThroughLobby")]
    public List<string> RequestsMadeThroughLobby { get; set; }

    [JsonPropertyName("SecondCycleDelaySeconds")]
    public int SecondCycleDelaySeconds { get; set; }

    [JsonPropertyName("ShouldEstablishLobbyConnection")]
    public bool ShouldEstablishLobbyConnection { get; set; }

    [JsonPropertyName("TurnOffLogging")]
    public bool TurnOffLogging { get; set; }

    [JsonPropertyName("WeaponOverlapDistanceCulling")]
    public int WeaponOverlapDistanceCulling { get; set; }

    [JsonPropertyName("WebDiagnosticsEnabled")]
    public bool WebDiagnosticsEnabled { get; set; }

    [JsonPropertyName("NetworkStateView")]
    public NetworkStateView NetworkStateView { get; set; }

    [JsonPropertyName("WsReconnectionDelays")]
    public List<int> WsReconnectionDelays { get; set; }
}

public record AudioSettings
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("AudioGroupPresets")]
    public List<AudioGroupPreset> AudioGroupPresets { get; set; }

    [JsonPropertyName("EnvironmentSettings")]
    public EnvironmentSettings EnvironmentSettings { get; set; }

    [JsonPropertyName("HeadphonesSettings")]
    public HeadphoneSettings HeadphonesSettings { get; set; }

    [JsonPropertyName("MetaXRAudioPluginSettings")]
    public MetaXRAudioPluginSettings MetaXRAudioPluginSettings { get; set; }

    [JsonPropertyName("PlayerSettings")]
    public PlayerSettings PlayerSettings { get; set; }

    [JsonPropertyName("RadioBroadcastSettings")]
    public RadioBroadcastSettings RadioBroadcastSettings { get; set; }
}

public record FramerateLimit
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("MaxFramerateGameLimit")]
    public int MaxFramerateGameLimit { get; set; }

    [JsonPropertyName("MaxFramerateLobbyLimit")]
    public int MaxFramerateLobbyLimit { get; set; }

    [JsonPropertyName("MinFramerateLimit")]
    public int MinFramerateLimit { get; set; }
}

public record MemoryManagementSettings
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("AggressiveGC")]
    public bool AggressiveGC { get; set; }

    [JsonPropertyName("GigabytesRequiredToDisableGCDuringRaid")]
    public int GigabytesRequiredToDisableGCDuringRaid { get; set; }

    [JsonPropertyName("HeapPreAllocationEnabled")]
    public bool HeapPreAllocationEnabled { get; set; }

    [JsonPropertyName("HeapPreAllocationMB")]
    public int HeapPreAllocationMB { get; set; }

    [JsonPropertyName("OverrideRamCleanerSettings")]
    public bool OverrideRamCleanerSettings { get; set; }

    [JsonPropertyName("RamCleanerEnabled")]
    public bool RamCleanerEnabled { get; set; }
}

public record ReleaseProfiler
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("Enabled")]
    public bool Enabled { get; set; }

    [JsonPropertyName("MaxRecords")]
    public int MaxRecords { get; set; }

    [JsonPropertyName("RecordTriggerValue")]
    public int RecordTriggerValue { get; set; }
}

public record NetworkStateView
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("LossThreshold")]
    public int LossThreshold { get; set; }

    [JsonPropertyName("RttThreshold")]
    public int RttThreshold { get; set; }
}

public record AudioGroupPreset
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("AngleToAllowBinaural")]
    public double? AngleToAllowBinaural { get; set; }

    [JsonPropertyName("DisabledBinauralByDistance")]
    public bool? DisabledBinauralByDistance { get; set; }

    [JsonPropertyName("DistanceToAllowBinaural")]
    public double? DistanceToAllowBinaural { get; set; }

    [JsonPropertyName("GroupType")]
    public double? GroupType { get; set; }

    [JsonPropertyName("HeightToAllowBinaural")]
    public double? HeightToAllowBinaural { get; set; }

    [JsonPropertyName("Name")]
    public string? Name { get; set; }

    [JsonPropertyName("OcclusionEnabled")]
    public bool? OcclusionEnabled { get; set; }

    [JsonPropertyName("OcclusionIntensity")]
    public double? OcclusionIntensity { get; set; }

    [JsonPropertyName("OcclusionRolloffScale")]
    public double? OcclusionRolloffScale { get; set; }

    [JsonPropertyName("OverallVolume")]
    public double? OverallVolume { get; set; }
}

public record EnvironmentSettings
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("AutumnLateSettings")]
    public SeasonEnvironmentSettings AutumnLateSettings { get; set; }

    [JsonPropertyName("AutumnSettings")]
    public SeasonEnvironmentSettings AutumnSettings { get; set; }

    [JsonPropertyName("SpringEarlySettings")]
    public SeasonEnvironmentSettings SpringEarlySettings { get; set; }

    [JsonPropertyName("SpringSettings")]
    public SeasonEnvironmentSettings SpringSettings { get; set; }

    [JsonPropertyName("StormSettings")]
    public SeasonEnvironmentSettings StormSettings { get; set; }

    [JsonPropertyName("SummerSettings")]
    public SeasonEnvironmentSettings SummerSettings { get; set; }

    [JsonPropertyName("WinterSettings")]
    public SeasonEnvironmentSettings WinterSettings { get; set; }

    [JsonPropertyName("SurfaceMultipliers")]
    public List<SurfaceMultiplier>? SurfaceMultipliers { get; set; }
}

public record SeasonEnvironmentSettings
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("RainSettings")]
    public List<RainSetting> RainSettings { get; set; }

    [JsonPropertyName("StepsVolumeMultiplier")]
    public double StepsVolumeMultiplier { get; set; }

    [JsonPropertyName("WindMultipliers")]
    public List<WindMultiplier> WindMultipliers { get; set; }
}

public record SurfaceMultiplier
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    public string SurfaceType { get; set; }

    public double VolumeMult { get; set; }
}

public record WindMultiplier
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("VolumeMult")]
    public double VolumeMult { get; set; }

    [JsonPropertyName("WindSpeed")]
    public string WindSpeed { get; set; }
}

public record RainSetting
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    [JsonPropertyName("IndoorVolumeMult")]
    public int IndoorVolumeMult { get; set; }

    [JsonPropertyName("OutdoorVolumeMult")]
    public double OutdoorVolumeMult { get; set; }

    [JsonPropertyName("RainIntensity")]
    public string RainIntensity { get; set; }
}

public record HeadphoneSettings
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    public double FadeDuration { get; set; }

    public string FadeIn { get; set; }

    public string FadeOut { get; set; }
}

public record MetaXRAudioPluginSettings
{
    [JsonExtensionData]
    public Dictionary<string, object>? ExtensionData { get; set; }

    public bool? EnabledPluginErrorChecker { get; set; }

    public double? OutputVolumeCheckCooldown { get; set; }
}
