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

namespace View_by_Distance.TestsWithFaceRecognitionDotNet.Models;

public class Configuration
{

    protected readonly bool? _CheckJsonForDistanceResults;
    protected readonly int? _CrossDirectoryMaxItemsInDistanceCollection;
    protected readonly int? _DistanceFactor;
    protected readonly bool? _ForceMetadataLastWriteTimeToCreationTime;
    protected readonly bool? _ForceResizeLastWriteTimeToCreationTime;
    protected readonly string[] _IgnoreExtensions;
    protected readonly string[] _IgnoreRelativePaths;
    protected readonly string[] _JuliePhares;
    protected readonly string[] _LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions;
    protected readonly string[] _LoadOrCreateThenSaveDistanceResultsForOutputResolutions;
    protected readonly string[] _LoadOrCreateThenSaveImageFacesResultsForOutputResolutions;
    protected readonly bool? _LoadOrCreateThenSaveIndex;
    protected readonly int? _LocationConfidenceFactor;
    protected readonly int? _MappedMaxIndex;
    protected readonly int? _MaxItemsInDistanceCollection;
    protected readonly string[] _MixedYearRelativePaths;
    protected readonly string _ModelDirectory;
    protected readonly string _ModelName;
    protected readonly int? _NumberOfJitters;
    protected readonly int? _NumberOfTimesToUpsample;
    protected readonly string _OutputExtension;
    protected readonly int? _OutputQuality;
    protected readonly string[] _OutputResolutions;
    protected readonly bool? _OverrideForFaceImages;
    protected readonly bool? _OverrideForFaceLandmarkImages;
    protected readonly bool? _OverrideForResizeImages;
    protected readonly int? _PaddingLoops;
    protected readonly string _PredictorModelName;
    protected readonly bool? _PropertiesChangedForDistance;
    protected readonly bool? _PropertiesChangedForFaces;
    protected readonly bool? _PropertiesChangedForIndex;
    protected readonly bool? _PropertiesChangedForMetadata;
    protected readonly bool? _PropertiesChangedForResize;
    protected Property.Models.Configuration? _PropertyConfiguration;
    protected readonly bool? _Reverse;
    protected readonly string[] _SaveFaceLandmarkForOutputResolutions;
    protected readonly bool? _SaveFullYearOfRandomFiles;
    protected readonly bool? _SaveResizedSubfiles;
    protected readonly string[] _SaveShortcutsForOutputResolutions;
    protected readonly bool? _SkipSearch;
    protected readonly bool? _TestDistanceResults;
    protected readonly string[] _ValidResolutions;
    public bool? CheckJsonForDistanceResults => _CheckJsonForDistanceResults;
    public int? CrossDirectoryMaxItemsInDistanceCollection => _CrossDirectoryMaxItemsInDistanceCollection;
    public int? DistanceFactor => _DistanceFactor;
    public bool? ForceMetadataLastWriteTimeToCreationTime => _ForceMetadataLastWriteTimeToCreationTime;
    public bool? ForceResizeLastWriteTimeToCreationTime => _ForceResizeLastWriteTimeToCreationTime;
    public string[] IgnoreExtensions => _IgnoreExtensions;
    public string[] IgnoreRelativePaths => _IgnoreRelativePaths;
    public string[] JuliePhares => _JuliePhares;
    public string[] LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions => _LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions;
    public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions => _LoadOrCreateThenSaveDistanceResultsForOutputResolutions;
    public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions => _LoadOrCreateThenSaveImageFacesResultsForOutputResolutions;
    public bool? LoadOrCreateThenSaveIndex => _LoadOrCreateThenSaveIndex;
    public int? LocationConfidenceFactor => _LocationConfidenceFactor;
    public int? MappedMaxIndex => _MappedMaxIndex;
    public int? MaxItemsInDistanceCollection => _MaxItemsInDistanceCollection;
    public string[] MixedYearRelativePaths => _MixedYearRelativePaths;
    public string ModelDirectory => _ModelDirectory;
    public string ModelName => _ModelName;
    public int? NumberOfJitters => _NumberOfJitters;
    public int? NumberOfTimesToUpsample => _NumberOfTimesToUpsample;
    public string OutputExtension => _OutputExtension;
    public int? OutputQuality => _OutputQuality;
    public string[] OutputResolutions => _OutputResolutions;
    public bool? OverrideForFaceImages => _OverrideForFaceImages;
    public bool? OverrideForFaceLandmarkImages => _OverrideForFaceLandmarkImages;
    public bool? OverrideForResizeImages => _OverrideForResizeImages;
    public int? PaddingLoops => _PaddingLoops;
    public string PredictorModelName => _PredictorModelName;
    public bool? PropertiesChangedForDistance => _PropertiesChangedForDistance;
    public bool? PropertiesChangedForFaces => _PropertiesChangedForFaces;
    public bool? PropertiesChangedForIndex => _PropertiesChangedForIndex;
    public bool? PropertiesChangedForMetadata => _PropertiesChangedForMetadata;
    public bool? PropertiesChangedForResize => _PropertiesChangedForResize;
    public Property.Models.Configuration? PropertyConfiguration => _PropertyConfiguration;
    public bool? Reverse => _Reverse;
    public string[] SaveFaceLandmarkForOutputResolutions => _SaveFaceLandmarkForOutputResolutions;
    public bool? SaveFullYearOfRandomFiles => _SaveFullYearOfRandomFiles;
    public bool? SaveResizedSubfiles => _SaveResizedSubfiles;
    public string[] SaveShortcutsForOutputResolutions => _SaveShortcutsForOutputResolutions;
    public bool? SkipSearch => _SkipSearch;
    public bool? TestDistanceResults => _TestDistanceResults;
    public string[] ValidResolutions => _ValidResolutions;

    [JsonConstructor]
    public Configuration(bool? checkJsonForDistanceResults, int? crossDirectoryMaxItemsInDistanceCollection, int? distanceFactor, bool? forceMetadataLastWriteTimeToCreationTime, bool? forceResizeLastWriteTimeToCreationTime, string[] ignoreExtensions, string[] ignoreRelativePaths, string[] juliePhares, string[] loadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions, string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, bool? loadOrCreateThenSaveIndex, int? locationConfidenceFactor, int? mappedMaxIndex, int? maxItemsInDistanceCollection, string[] mixedYearRelativePaths, string modelDirectory, string modelName, int? numberOfJitters, int? numberOfTimesToUpsample, string outputExtension, int? outputQuality, string[] outputResolutions, bool? overrideForFaceImages, bool? overrideForFaceLandmarkImages, bool? overrideForResizeImages, int? paddingLoops, string predictorModelName, bool? propertiesChangedForDistance, bool? propertiesChangedForFaces, bool? propertiesChangedForIndex, bool? propertiesChangedForMetadata, bool? propertiesChangedForResize, Property.Models.Configuration? propertyConfiguration, bool? reverse, string[] saveFaceLandmarkForOutputResolutions, bool? saveFullYearOfRandomFiles, bool? saveResizedSubfiles, string[] saveShortcutsForOutputResolutions, bool? skipSearch, bool? testDistanceResults, string[] validResolutions)
    {
        _CheckJsonForDistanceResults = checkJsonForDistanceResults;
        _CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection;
        _DistanceFactor = distanceFactor;
        _ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime;
        _ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime;
        _IgnoreExtensions = ignoreExtensions;
        _IgnoreRelativePaths = ignoreRelativePaths;
        _JuliePhares = juliePhares;
        _LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions = loadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions;
        _LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions;
        _LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions;
        _LoadOrCreateThenSaveIndex = loadOrCreateThenSaveIndex;
        _LocationConfidenceFactor = locationConfidenceFactor;
        _MappedMaxIndex = mappedMaxIndex;
        _MaxItemsInDistanceCollection = maxItemsInDistanceCollection;
        _MixedYearRelativePaths = mixedYearRelativePaths;
        _ModelDirectory = modelDirectory;
        _ModelName = modelName;
        _NumberOfJitters = numberOfJitters;
        _NumberOfTimesToUpsample = numberOfTimesToUpsample;
        _OutputExtension = outputExtension;
        _OutputQuality = outputQuality;
        _OutputResolutions = outputResolutions;
        _OverrideForFaceImages = overrideForFaceImages;
        _OverrideForFaceLandmarkImages = overrideForFaceLandmarkImages;
        _OverrideForResizeImages = overrideForResizeImages;
        _PaddingLoops = paddingLoops;
        _PredictorModelName = predictorModelName;
        _PropertiesChangedForDistance = propertiesChangedForDistance;
        _PropertiesChangedForFaces = propertiesChangedForFaces;
        _PropertiesChangedForIndex = propertiesChangedForIndex;
        _PropertiesChangedForMetadata = propertiesChangedForMetadata;
        _PropertiesChangedForResize = propertiesChangedForResize;
        _PropertyConfiguration = propertyConfiguration;
        _Reverse = reverse;
        _SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions;
        _SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles;
        _SaveResizedSubfiles = saveResizedSubfiles;
        _SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions;
        _SkipSearch = skipSearch;
        _TestDistanceResults = testDistanceResults;
        _ValidResolutions = validResolutions;
    }

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

    public void Set(Property.Models.Configuration configuration) => _PropertyConfiguration = configuration;

    public void Update() => _PropertyConfiguration?.Update();

}