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

namespace View_by_Distance.Shared.Models;

public class MappingFromItem : Properties.IMappingFromItem
{

    public int Id { init; get; }
    public FileHolder ImageFileHolder { init; get; }
    public bool? IsWrongYear { init; get; }
    public DateTime MinimumDateTime { init; get; }
    public FileHolder ResizedFileHolder { init; get; }

    [JsonConstructor]
    public MappingFromItem(int id, FileHolder imageFileHolder, bool? isWrongYear, DateTime minimumDateTime, FileHolder resizedFileHolder)
    {
        Id = id;
        ImageFileHolder = imageFileHolder;
        IsWrongYear = isWrongYear;
        MinimumDateTime = minimumDateTime;
        ResizedFileHolder = resizedFileHolder;
    }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    }

}

public class MappingFromLocation : Properties.IMappingFromLocation
{

    public double Confidence { init; get; }
    public string DeterministicHashCodeKeyDisplay { init; get; }
    public int NormalizedPixelPercentage { init; get; }

    [JsonConstructor]
    public MappingFromLocation(double confidence, string deterministicHashCodeKeyDisplay, int normalizedPixelPercentage)
    {
        Confidence = confidence;
        DeterministicHashCodeKeyDisplay = deterministicHashCodeKeyDisplay;
        NormalizedPixelPercentage = normalizedPixelPercentage;
    }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    }

}

public class MappingFromPerson : Properties.IMappingFromPerson
{

    public int? ApproximateYears { init; get; }
    public int? By { init; get; }
    public string DisplayDirectoryName { init; get; }
    public PersonBirthday? PersonBirthday { init; get; }
    public string SegmentB { init; get; }

    [JsonConstructor]
    public MappingFromPerson(int? approximateYears, int? by, string displayDirectoryName, PersonBirthday? personBirthday, string segmentB)
    {
        ApproximateYears = approximateYears;
        By = by;
        DisplayDirectoryName = displayDirectoryName;
        PersonBirthday = personBirthday;
        SegmentB = segmentB;
    }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    }

}

public class Mapping : Properties.IMapping
{

    protected MappingFromPerson _MappingFromPerson;
    public MappingFromItem MappingFromItem { init; get; }
    public MappingFromLocation MappingFromLocation { init; get; }
    public MappingFromPerson MappingFromPerson => _MappingFromPerson;

    [JsonConstructor]
    public Mapping(MappingFromItem mappingFromItem, MappingFromLocation mappingFromLocation, MappingFromPerson mappingFromPerson)
    {
        MappingFromItem = mappingFromItem;
        MappingFromLocation = mappingFromLocation;
        _MappingFromPerson = mappingFromPerson;
    }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    }

    public void UpdateMappingFromPerson(int? approximateYears, int? by, string displayDirectoryName, PersonBirthday personBirthday, string segmentB) => _MappingFromPerson = new(approximateYears, by, displayDirectoryName, personBirthday, segmentB);

}