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

namespace View_by_Distance.Shared.Models;

public class Mapping : Properties.IMapping
{

    protected int? _By;
    protected MappingFromPerson? _MappingFromPerson;
    public string? _SegmentC;
    protected SortingContainer? _SortingContainer;
    public int? By => _By;
    public MappingFromItem MappingFromItem { init; get; }
    public MappingFromFilter MappingFromFilter { init; get; }
    public MappingFromLocation? MappingFromLocation { init; get; }
    public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
    public MappingFromPerson? MappingFromPerson => _MappingFromPerson;
    public string? SegmentC => _SegmentC;
    public SortingContainer? SortingContainer => _SortingContainer;

    [JsonConstructor]
    public Mapping(int? by, MappingFromItem mappingFromItem, MappingFromFilter mappingFromFilter, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, MappingFromPerson? mappingFromPerson, string? segmentC, SortingContainer? sortingContainer)
    {
        _By = by;
        _SegmentC = segmentC;
        MappingFromItem = mappingFromItem;
        MappingFromFilter = mappingFromFilter;
        MappingFromLocation = mappingFromLocation;
        MappingFromPhotoPrismCollection = mappingFromPhotoPrismCollection;
        _MappingFromPerson = mappingFromPerson;
        _SortingContainer = sortingContainer;
    }

    public Mapping(MappingFromItem mappingFromItem, MappingFromFilter mappingFromFilter, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) :
        this(null, mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection, null, null, null)
    { }

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

    public void UpdateMappingFromUnknownPerson(bool saveIndividually, SortingContainer sortingContainer)
    {
        _By = Stateless.IMapLogic.Sorting;
        _SortingContainer = sortingContainer;
        _SegmentC = !saveIndividually ? null : sortingContainer.Sorting.DistancePermyriad.ToString();
    }

    public void UpdateMappingFromPerson(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string segmentB)
    {
        _SortingContainer = null;
        _By = Stateless.IMapLogic.Mapping;
        _MappingFromPerson = new(approximateYears, displayDirectoryName, personBirthday, segmentB);
    }

    public void UpdateMappingFromPerson(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string segmentB, string segmentC, SortingContainer sortingContainer)
    {
        _SegmentC = segmentC;
        _By = Stateless.IMapLogic.Sorting;
        _SortingContainer = sortingContainer;
        _MappingFromPerson = new(approximateYears, displayDirectoryName, personBirthday, segmentB);
    }

}