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 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 bool LoadOrCreateThenSaveIndex { init; get; }
    public int? MappedMaxIndex { 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 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 string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; }
    public string[] SaveShortcutsForOutputResolutions { init; get; }
    public bool SaveResizedSubfiles { 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 checkDFaceAndUpWriteDates,
                         bool checkJsonForDistanceResults,
                         int crossDirectoryMaxItemsInDistanceCollection,
                         int distanceFactor,
                         bool forceFaceLastWriteTimeToCreationTime,
                         bool forceMetadataLastWriteTimeToCreationTime,
                         bool forceResizeLastWriteTimeToCreationTime,
                         string[] ignoreExtensions,
                         string[] ignoreRelativePaths,
                         string[] jLinks,
                         string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions,
                         string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions,
                         bool loadOrCreateThenSaveIndex,
                         int? mappedMaxIndex,
                         string[] mixedYearRelativePaths,
                         string modelDirectory,
                         string modelName,
                         int numberOfJitters,
                         int numberOfTimesToUpsample,
                         string outputExtension,
                         int outputQuality,
                         string[] outputResolutions,
                         bool overrideForFaceImages,
                         bool overrideForFaceLandmarkImages,
                         bool overrideForResizeImages,
                         string predictorModelName,
                         bool propertiesChangedForDistance,
                         bool propertiesChangedForFaces,
                         bool propertiesChangedForIndex,
                         bool propertiesChangedForMetadata,
                         bool propertiesChangedForResize,
                         bool reverse,
                         string[] saveFaceLandmarkForOutputResolutions,
                         bool saveFullYearOfRandomFiles,
                         string[] saveFilteredOriginalImagesFromJLinksForOutputResolutions,
                         string[] saveShortcutsForOutputResolutions,
                         bool saveResizedSubfiles,
                         bool skipSearch,
                         bool testDistanceResults,
                         string[] validResolutions)
    {
        _PropertyConfiguration = propertyConfiguration;
        CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates;
        CheckJsonForDistanceResults = checkJsonForDistanceResults;
        CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection;
        DistanceFactor = distanceFactor;
        ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime;
        ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime;
        ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime;
        IgnoreExtensions = ignoreExtensions;
        IgnoreRelativePaths = ignoreRelativePaths;
        JLinks = jLinks;
        LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions;
        LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions;
        LoadOrCreateThenSaveIndex = loadOrCreateThenSaveIndex;
        MappedMaxIndex = mappedMaxIndex;
        MixedYearRelativePaths = mixedYearRelativePaths;
        ModelDirectory = modelDirectory;
        ModelName = modelName;
        NumberOfJitters = numberOfJitters;
        NumberOfTimesToUpsample = numberOfTimesToUpsample;
        OutputExtension = outputExtension;
        OutputQuality = outputQuality;
        OutputResolutions = outputResolutions;
        OverrideForFaceImages = overrideForFaceImages;
        OverrideForFaceLandmarkImages = overrideForFaceLandmarkImages;
        OverrideForResizeImages = overrideForResizeImages;
        PredictorModelName = predictorModelName;
        PropertiesChangedForDistance = propertiesChangedForDistance;
        PropertiesChangedForFaces = propertiesChangedForFaces;
        PropertiesChangedForIndex = propertiesChangedForIndex;
        PropertiesChangedForMetadata = propertiesChangedForMetadata;
        PropertiesChangedForResize = propertiesChangedForResize;
        Reverse = reverse;
        SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions;
        SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles;
        SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions;
        SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions;
        SaveResizedSubfiles = saveResizedSubfiles;
        SkipSearch = skipSearch;
        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)
    {
        _PropertyConfiguration = configuration;
        _PropertyConfiguration.Update();
    }

}