using System.Text.Json;
using System.Text.Json.Serialization;

namespace Parsing_Packets.Models.Binder;

public class PhysicalAddressConfiguration
{

    public string? Description { get; set; }
    public string? DeviceName { get; set; }
    public string? Directory { get; set; }
    public string? IPV4Filter { get; set; }
    public int? ReadTimeoutMilliseconds { get; set; }
    public string? StringOutputType { get; set; }
    public bool? UseARP { get; set; }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, BinderPhysicalAddressConfigurationSourceGenerationContext.Default.PhysicalAddressConfiguration);
        return result;
    }

    private static void PreVerify(IConfigurationRoot configurationRoot, PhysicalAddressConfiguration? configuration)
    {
        if (configuration?.Description is null)
        {
            foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers)
            {
                if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider)
                    continue;
                if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider)
                    continue;
                if (!physicalFileProvider.Root.Contains("UserSecrets"))
                    continue;
                throw new NotSupportedException(physicalFileProvider.Root);
            }
            throw new NotSupportedException("Not Found!");
        }
    }

    private static void Verify(PhysicalAddressConfiguration _)
    {
    }

    private static Models.PhysicalAddressConfiguration Get(PhysicalAddressConfiguration? configuration)
    {
        Models.PhysicalAddressConfiguration result;
        if (configuration is null) throw new NullReferenceException(nameof(configuration));
        if (configuration.Description is null) throw new NullReferenceException(nameof(configuration.Description));
        if (configuration.DeviceName is null) throw new NullReferenceException(nameof(configuration.DeviceName));
        if (configuration.Directory is null) throw new NullReferenceException(nameof(configuration.Directory));
        if (configuration.IPV4Filter is null) throw new NullReferenceException(nameof(configuration.IPV4Filter));
        if (configuration.ReadTimeoutMilliseconds is null) throw new NullReferenceException(nameof(configuration.ReadTimeoutMilliseconds));
        if (configuration.StringOutputType is null) throw new NullReferenceException(nameof(configuration.StringOutputType));
        if (configuration.UseARP is null) throw new NullReferenceException(nameof(configuration.UseARP));
        Verify(configuration);
        result = new(configuration.Description,
                     configuration.DeviceName,
                     configuration.Directory,
                     configuration.IPV4Filter,
                     configuration.ReadTimeoutMilliseconds.Value,
                     configuration.StringOutputType,
                     configuration.UseARP.Value);
        return result;
    }

    public static Models.PhysicalAddressConfiguration Get(IConfigurationRoot configurationRoot)
    {
        Models.PhysicalAddressConfiguration result;
        IConfigurationSection configurationSection = configurationRoot.GetSection(nameof(Models.PhysicalAddressConfiguration));
#pragma warning disable IL3050, IL2026
        PhysicalAddressConfiguration? configuration = configurationSection.Get<PhysicalAddressConfiguration>();
#pragma warning restore IL3050, IL2026
        PreVerify(configurationRoot, configuration);
        result = Get(configuration);
        return result;
    }

}

[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(PhysicalAddressConfiguration))]
internal partial class BinderPhysicalAddressConfigurationSourceGenerationContext : JsonSerializerContext
{
}