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

namespace View_by_Distance.Map.Models;

public class Configuration
{

    public int FaceDistanceHiddenImageFactor { init; get; }
    public int FaceDistancePermyriad { init; get; }
    public double FaceDistanceMinimumConfidence { init; get; }
    public double FaceDistanceTolerance { init; get; }
    public int LocationDigits { init; get; }
    public int LocationFactor { init; get; }
    public int MapLogicSigma { init; get; }
    public string MappingDefaultName { init; get; }
    public bool MappingMoveUnableToMatch { init; get; }
    public bool MappingSaveNotMapped { init; get; }
    public bool MappingSaveMapped { init; get; }
    public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { init; get; }
    public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { init; get; }
    public int PersonBirthdayFirstYear { init; get; }
    public string PersonBirthdayFormat { init; get; }
    public string PersonKeyFormat { init; get; }
    public int SortingDaysDeltaTolerance { init; get; }
    public int SortingMaximumPerFaceShouldBeHigh { init; get; }
    public int SortingMaximumPerKey { init; get; }
    public int SortingSigma { init; get; }

    [JsonConstructor]
    public Configuration(int faceDistanceHiddenImageFactor,
                         int faceDistancePermyriad,
                         double faceDistanceMinimumConfidence,
                         double faceDistanceTolerance,
                         int locationDigits,
                         int locationFactor,
                         int mapLogicSigma,
                         string mappingDefaultName,
                         bool mappingMoveUnableToMatch,
                         bool mappingSaveNotMapped,
                         bool mappingSaveMapped,
                         bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping,
                         bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping,
                         int personBirthdayFirstYear,
                         string personBirthdayFormat,
                         string personKeyFormat,
                         int sortingDaysDeltaTolerance,
                         int sortingMaximumPerFaceShouldBeHigh,
                         int sortingMaximumPerKey,
                         int sortingSigma)
    {
        FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor;
        FaceDistancePermyriad = faceDistancePermyriad;
        FaceDistanceMinimumConfidence = faceDistanceMinimumConfidence;
        FaceDistanceTolerance = faceDistanceTolerance;
        LocationDigits = locationDigits;
        LocationFactor = locationFactor;
        MapLogicSigma = mapLogicSigma;
        MappingDefaultName = mappingDefaultName;
        MappingMoveUnableToMatch = mappingMoveUnableToMatch;
        MappingSaveNotMapped = mappingSaveNotMapped;
        MappingSaveMapped = mappingSaveMapped;
        MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping;
        MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping;
        PersonBirthdayFirstYear = personBirthdayFirstYear;
        PersonBirthdayFormat = personBirthdayFormat;
        PersonKeyFormat = personKeyFormat;
        SortingDaysDeltaTolerance = sortingDaysDeltaTolerance;
        SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh;
        SortingMaximumPerKey = sortingMaximumPerKey;
        SortingSigma = sortingSigma;
    }

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

}