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

namespace View_by_Distance.Instance.Models;

public class Configuration
{

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

    public bool CheckJsonForDistanceResults { init; get; }
    public int CrossDirectoryMaxItemsInDistanceCollection { init; get; }
    public int DistanceFactor { 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[] JuliePhares { init; get; }
    public string[] LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions { init; get; }
    public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; }
    public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; }
    public bool LoadOrCreateThenSaveIndex { init; get; }
    public int LocationConfidenceFactor { init; get; }
    public int? MappedMaxIndex { init; get; }
    public int MaxItemsInDistanceCollection { 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 PaddingLoops { 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 bool Reverse { init; get; }
    public string[] SaveFaceLandmarkForOutputResolutions { init; get; }
    public bool SaveFullYearOfRandomFiles { init; get; }
    public bool SaveResizedSubfiles { init; get; }
    public string[] SaveShortcutsForOutputResolutions { init; get; }
    public bool SkipSearch { init; get; }
    public bool TestDistanceResults { init; get; }
    public string[] ValidResolutions { init; get; }

    [JsonConstructor]
    public Configuration(Property.Models.Configuration propertyConfiguration, bool checkJsonForDistanceResults, int crossDirectoryMaxItemsInDistanceCollection, int distanceFactor, bool forceFaceLastWriteTimeToCreationTime, 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, bool reverse, string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, bool saveResizedSubfiles, string[] saveShortcutsForOutputResolutions, bool skipSearch, bool testDistanceResults, string[] validResolutions)
    {
        _PropertyConfiguration = propertyConfiguration;
        CheckJsonForDistanceResults = checkJsonForDistanceResults;
        CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection;
        DistanceFactor = distanceFactor;
        ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime;
        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;
        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();

}