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

namespace View_by_Distance.Tests.Models;

public class Configuration
{

    protected Property.Models.Configuration _PropertyConfiguration;
    public Property.Models.Configuration PropertyConfiguration => _PropertyConfiguration;

    public bool CheckDFaceAndUpWriteDates { init; get; }
    public bool CheckJsonForDistanceResults { init; get; }
    public int CrossDirectoryMaxItemsInDistanceCollection { init; get; }
    public int DistanceFactor { init; get; }
    public bool DistanceMoveUnableToMatch { init; get; }
    public int DistancePixelDistanceTolerance { init; get; }
    public bool DistanceRenameToMatch { init; get; }
    public int FaceDistanceHiddenImageFactor { init; get; }
    public int FaceConfidencePercent { init; get; }
    public int FaceDistancePermyriad { init; get; }
    public bool ForceFaceLastWriteTimeToCreationTime { init; get; }
    public bool ForceMetadataLastWriteTimeToCreationTime { init; get; }
    public bool ForceResizeLastWriteTimeToCreationTime { init; get; }
    public string[] IgnoreExtensions { init; get; }
    public string[] IgnoreRelativePaths { init; get; }
    public string[] JLinks { init; get; }
    public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; }
    public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; }
    public int LocationDigits { init; get; }
    public int LocationFactor { init; get; }
    public string MappingDefaultName { init; get; }
    public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { init; get; }
    public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { init; get; }
    public string[] MixedYearRelativePaths { init; get; }
    public string ModelDirectory { init; get; }
    public string ModelName { init; get; }
    public int NumberOfJitters { init; get; }
    public int NumberOfTimesToUpsample { init; get; }
    public string OutputExtension { init; get; }
    public int OutputQuality { init; get; }
    public string[] OutputResolutions { init; get; }
    public bool OverrideForFaceImages { init; get; }
    public bool OverrideForFaceLandmarkImages { init; get; }
    public bool OverrideForResizeImages { init; get; }
    public int PersonBirthdayFirstYear { init; get; }
    public string PersonBirthdayFormat { init; get; }
    public string PersonKeyFormat { init; get; }
    public string PredictorModelName { init; get; }
    public bool PropertiesChangedForDistance { init; get; }
    public bool PropertiesChangedForFaces { init; get; }
    public bool PropertiesChangedForIndex { init; get; }
    public bool PropertiesChangedForMetadata { init; get; }
    public bool PropertiesChangedForResize { init; get; }
    public int[] RangeDaysDeltaTolerance { init; get; }
    public float[] RangeFaceAreaTolerance { init; get; }
    public float[] RangeFaceConfidence { init; get; }
    public float[] RangeDistanceTolerance { init; get; }
    public bool Reverse { init; get; }
    public string[] SaveFaceLandmarkForOutputResolutions { init; get; }
    public bool SaveFullYearOfRandomFiles { init; get; }
    public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; }
    public bool SaveResizedSubfiles { init; get; }
    public string[] SaveShortcutsForOutputResolutions { init; get; }
    public bool SkipSearch { init; get; }
    public int SortingMaximumPerFaceShouldBeHigh { init; get; }
    public int SortingMaximumPerKey { init; get; }
    public int SortingMinimumToUseSigma { init; get; }
    public bool TestDistanceResults { init; get; }
    public string[] ValidResolutions { init; get; }

    [JsonConstructor]
    public Configuration(Property.Models.Configuration propertyConfiguration,
                         bool checkDFaceAndUpWriteDates,
                         bool checkJsonForDistanceResults,
                         int crossDirectoryMaxItemsInDistanceCollection,
                         int distanceFactor,
                         bool distanceMoveUnableToMatch,
                         int distancePixelDistanceTolerance,
                         bool distanceRenameToMatch,
                         int faceDistanceHiddenImageFactor,
                         int faceConfidencePercent,
                         int faceDistancePermyriad,
                         bool forceFaceLastWriteTimeToCreationTime,
                         bool forceMetadataLastWriteTimeToCreationTime,
                         bool forceResizeLastWriteTimeToCreationTime,
                         string[] ignoreExtensions,
                         string[] ignoreRelativePaths,
                         string[] jLinks,
                         string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions,
                         string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions,
                         int locationDigits,
                         int locationFactor,
                         string mappingDefaultName,
                         bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping,
                         bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping,
                         string[] mixedYearRelativePaths,
                         string modelDirectory,
                         string modelName,
                         int numberOfJitters,
                         int numberOfTimesToUpsample,
                         string outputExtension,
                         int outputQuality,
                         string[] outputResolutions,
                         bool overrideForFaceImages,
                         bool overrideForFaceLandmarkImages,
                         bool overrideForResizeImages,
                         int personBirthdayFirstYear,
                         string personBirthdayFormat,
                         string personKeyFormat,
                         string predictorModelName,
                         bool propertiesChangedForDistance,
                         bool propertiesChangedForFaces,
                         bool propertiesChangedForIndex,
                         bool propertiesChangedForMetadata,
                         bool propertiesChangedForResize,
                         int[] rangeDaysDeltaTolerance,
                         float[] rangeFaceAreaPermyriadTolerance,
                         float[] rangeFaceConfidence,
                         float[] rangeDistanceTolerance,
                         bool reverse,
                         string[] saveFaceLandmarkForOutputResolutions,
                         bool saveFullYearOfRandomFiles,
                         string[] saveFilteredOriginalImagesFromJLinksForOutputResolutions,
                         bool saveResizedSubfiles,
                         string[] saveShortcutsForOutputResolutions,
                         bool skipSearch,
                         int sortingMaximumPerFaceShouldBeHigh,
                         int sortingMaximumPerKey,
                         int sortingSigma,
                         bool testDistanceResults,
                         string[] validResolutions)
    {
        _PropertyConfiguration = propertyConfiguration;
        CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates;
        CheckJsonForDistanceResults = checkJsonForDistanceResults;
        CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection;
        DistanceFactor = distanceFactor;
        DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
        DistancePixelDistanceTolerance = distancePixelDistanceTolerance;
        DistanceRenameToMatch = distanceRenameToMatch;
        FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor;
        FaceConfidencePercent = faceConfidencePercent;
        FaceDistancePermyriad = faceDistancePermyriad;
        ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime;
        ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime;
        ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime;
        IgnoreExtensions = ignoreExtensions;
        IgnoreRelativePaths = ignoreRelativePaths;
        JLinks = jLinks;
        LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions;
        LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions;
        LocationDigits = locationDigits;
        LocationFactor = locationFactor;
        MappingDefaultName = mappingDefaultName;
        MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping;
        MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping;
        MixedYearRelativePaths = mixedYearRelativePaths;
        ModelDirectory = modelDirectory;
        ModelName = modelName;
        NumberOfJitters = numberOfJitters;
        NumberOfTimesToUpsample = numberOfTimesToUpsample;
        OutputExtension = outputExtension;
        OutputQuality = outputQuality;
        OutputResolutions = outputResolutions;
        OverrideForFaceImages = overrideForFaceImages;
        OverrideForFaceLandmarkImages = overrideForFaceLandmarkImages;
        OverrideForResizeImages = overrideForResizeImages;
        PersonBirthdayFirstYear = personBirthdayFirstYear;
        PersonBirthdayFormat = personBirthdayFormat;
        PersonKeyFormat = personKeyFormat;
        PredictorModelName = predictorModelName;
        PropertiesChangedForDistance = propertiesChangedForDistance;
        PropertiesChangedForFaces = propertiesChangedForFaces;
        PropertiesChangedForIndex = propertiesChangedForIndex;
        PropertiesChangedForMetadata = propertiesChangedForMetadata;
        PropertiesChangedForResize = propertiesChangedForResize;
        RangeDaysDeltaTolerance = rangeDaysDeltaTolerance;
        RangeFaceAreaTolerance = rangeFaceAreaPermyriadTolerance;
        RangeFaceConfidence = rangeFaceConfidence;
        RangeDistanceTolerance = rangeDistanceTolerance;
        Reverse = reverse;
        SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions;
        SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles;
        SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions;
        SaveResizedSubfiles = saveResizedSubfiles;
        SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions;
        SkipSearch = skipSearch;
        SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh;
        SortingMaximumPerKey = sortingMaximumPerKey;
        SortingMinimumToUseSigma = sortingSigma;
        TestDistanceResults = testDistanceResults;
        ValidResolutions = validResolutions;
    }

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

    public void SetAndUpdate(Property.Models.Configuration configuration, int? numberOfJitters, int? numberOfTimesToUpsample, string? modelName, string? predictorModelName)
    {
        _PropertyConfiguration = configuration;
        _PropertyConfiguration.Update(numberOfJitters, numberOfTimesToUpsample, modelName, predictorModelName);
    }

}