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

namespace View_by_Distance.Shared.Models;

public record MappingFromItem(DateTime[] ContainerDateTimes,
                              DateTime? DateTimeDigitized,
                              DateTime? DateTimeOriginal,
                              int Id,
                              FilePath FilePath,
                              bool? IsWrongYear,
                              string[] Keywords,
                              DateTime MinimumDateTime,
                              string? Model,
                              string RelativePath,
                              FileHolder ResizedFileHolder)
{

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

    public DateTime GetDateTimeOriginalThenMinimumDateTime() =>
        DateTimeOriginal is not null ? DateTimeOriginal.Value : MinimumDateTime;

    internal static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Item item, FileHolder? resizedFileHolder)
    {
        MappingFromItem result;
        if (item.Property?.Id is null)
            throw new NotSupportedException();
        if (resizedFileHolder is null)
            throw new NotSupportedException();
        List<DateTime> dateTimes = item.Property.GetDateTimes();
        DateTime minimumDateTime = Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
        (bool? isWrongYear, _) = Stateless.Methods.IProperty.IsWrongYear(item.FilePath, item.Property.DateTimeOriginal, dateTimes);
        result = new(containerDateTimes, item.Property.DateTimeDigitized, item.Property.DateTimeOriginal, item.Property.Id.Value, item.FilePath, isWrongYear, item.Property.Keywords ?? [], minimumDateTime, item.Property.Model, item.RelativePath, resizedFileHolder);
        return result;
    }

}

[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MappingFromItem))]
public partial class MappingFromItemGenerationContext : JsonSerializerContext
{
}