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

namespace File_Folder_Helper.Models;

internal record NginxFileSystem([property: JsonPropertyName("name")] string Name,
                                DateTime? LastModified,
                                [property: JsonPropertyName("mtime")] string MTime,
                                Uri? URI,
                                [property: JsonPropertyName("type")] string Type,
                                [property: JsonPropertyName("size")] float? Length)
{

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

    public static NginxFileSystem Get(string format, TimeZoneInfo timeZoneInfo, string name, string mTime, Uri uri, string type, float? size)
    {
        NginxFileSystem result;
        DateTime dateTime;
        DateTime? nullableDateTime;
        if (mTime.Length != format.Length + 4 || !DateTime.TryParseExact(mTime[..format.Length], format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
            nullableDateTime = null;
        else
            nullableDateTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dateTime, mTime[(format.Length + 1)..], timeZoneInfo.Id);
        result = new(name, nullableDateTime, mTime, uri, type, size);
        return result;
    }

    public static string GetFormat() =>
        "ddd, dd MMM yyyy HH:mm:ss";

    public static NginxFileSystem Get(string format, TimeZoneInfo timeZoneInfo, Uri uri, NginxFileSystem nginxFileSystem) =>
        Get(format, timeZoneInfo, nginxFileSystem.Name, nginxFileSystem.MTime, uri, nginxFileSystem.Type, nginxFileSystem.Length);

}

[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
[JsonSerializable(typeof(NginxFileSystem))]
internal partial class NginxFileSystemSourceGenerationContext : JsonSerializerContext
{
}

[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
[JsonSerializable(typeof(NginxFileSystem[]))]
internal partial class NginxFileSystemCollectionSourceGenerationContext : JsonSerializerContext
{
}