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 FilePath FilePath { init; get; }
    public MappingFromFilterPost MappingFromFilterPost { init; get; }
    public MappingFromFilterPre MappingFromFilterPre { init; get; }
    public MappingFromItem MappingFromItem { init; get; }
    public MappingFromLocation? MappingFromLocation { init; get; }
    public MappingFromPerson? MappingFromPerson => _MappingFromPerson;
    public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
    public string? SegmentC => _SegmentC;
    public SortingContainer? SortingContainer => _SortingContainer;

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

    public Mapping(FilePath filePath, MappingFromFilterPost mappingFromFilterPost, MappingFromFilterPre mappingFromFilterPre, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) :
        this(null, filePath, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, null, mappingFromPhotoPrismCollection, 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, long personKey, string segmentB)
    {
        _SortingContainer = null;
        _By = Stateless.IMapLogic.Mapping;
        _MappingFromPerson = new(approximateYears, displayDirectoryName, personKey, segmentB);
    }

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

}