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

namespace View_by_Distance.Shared.Models;

public record SaveContainer(string CheckFile,
                            string Directory,
                            FileHolder? FaceFileHolder,
                            FileHolder? HiddenFaceFileHolder,
                            FileHolder? FacePartsFileHolder,
                            bool MakeAllHidden,
                            FileHolder? ResizedFileHolder,
                            string ShortcutFile)
{
    public static SaveContainer Get(string directory) =>
        new(string.Empty, directory, null, null, null, false, null, string.Empty);

    public static SaveContainer Get(string directory, string locationContainersFile) =>
        new(string.Empty, directory, null, null, null, false, FileHolder.Get(locationContainersFile), Path.Combine(directory, $"{Path.GetFileName(locationContainersFile)}.lnk"));

    public static SaveContainer Get(string directory, FileHolder? faceFileHolder, FileHolder? resizedFileHolder, string shortcutFile) =>
        new(string.Empty, directory, faceFileHolder, null, null, true, resizedFileHolder, shortcutFile);

    public static SaveContainer Get(string checkFile, string directory, FileHolder faceFileHolder) =>
        new(checkFile, directory, faceFileHolder, null, null, false, null, string.Empty);

    public static SaveContainer Get(FileHolder resizedFileHolder, string checkFile, string directory) =>
        new(checkFile, directory, null, null, null, false, resizedFileHolder, string.Empty);

    public static SaveContainer Get(string checkFile, string directory, FileHolder? faceFileHolder, FileHolder? hiddenFaceFileHolder, FileHolder? facePartsFileHolder, FileHolder? resizedFileHolder, string shortcutFile) =>
        new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, false, resizedFileHolder, shortcutFile);

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, ResultSettingsSourceGenerationContext.Default.ResultSettings);
        return result;
    }

}

[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(SaveContainer))]
internal partial class SaveContainerSourceGenerationContext : JsonSerializerContext
{
}