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

namespace View_by_Distance.Shared.Models;

public class MappingFromItem : Properties.IMappingFromItem
{

    public DateTime[] ContainerDateTimes { init; get; }
    public DateTime? DateTimeDigitized { init; get; }
    public DateTime? DateTimeOriginal { init; get; }
    public int Id { init; get; }
    public FileHolder ImageFileHolder { init; get; }
    public bool? IsWrongYear { init; get; }
    public DateTime MinimumDateTime { init; get; }
    public string? Model { init; get; }
    public string RelativePath { init; get; }
    public FileHolder ResizedFileHolder { init; get; }

    [JsonConstructor]
    public MappingFromItem(DateTime[] containerDateTimes, DateTime? dateTimeDigitized, DateTime? dateTimeOriginal, int id, FileHolder imageFileHolder, bool? isWrongYear, DateTime minimumDateTime, string? model, string relativePath, FileHolder resizedFileHolder)
    {
        ContainerDateTimes = containerDateTimes;
        DateTimeDigitized = dateTimeDigitized;
        DateTimeOriginal = dateTimeOriginal;
        Id = id;
        ImageFileHolder = imageFileHolder;
        IsWrongYear = isWrongYear;
        MinimumDateTime = minimumDateTime;
        Model = model;
        RelativePath = relativePath;
        ResizedFileHolder = resizedFileHolder;
    }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        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.ImageFileHolder, item.Property.DateTimeOriginal, dateTimes);
        result = new(containerDateTimes, item.Property.DateTimeDigitized, item.Property.DateTimeOriginal, item.Property.Id.Value, item.ImageFileHolder, isWrongYear, minimumDateTime, item.Property.Model, item.RelativePath, resizedFileHolder);
        return result;
    }

}