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

namespace View_by_Distance.Shared.Models;

public class SaveContainer
{

    public string CheckFile { init; get; }
    public string Directory { init; get; }
    public FileHolder? FaceFileHolder { init; get; }
    public FileHolder? HiddenFaceFileHolder { init; get; }
    public FileHolder? FacePartsFileHolder { init; get; }
    public bool MakeAllHidden { init; get; }
    public FileHolder? ResizedFileHolder { init; get; }
    public string ShortcutFile { init; get; }

    [JsonConstructor]
    public SaveContainer(string checkFile, string directory, FileHolder? faceFileHolder, FileHolder? hiddenFaceFileHolder, FileHolder? facePartsFileHolder, bool makeAllHidden, FileHolder? resizedFileHolder, string shortcutFile)
    {
        CheckFile = checkFile;
        Directory = directory;
        FaceFileHolder = faceFileHolder;
        HiddenFaceFileHolder = hiddenFaceFileHolder;
        FacePartsFileHolder = facePartsFileHolder;
        MakeAllHidden = makeAllHidden;
        ResizedFileHolder = resizedFileHolder;
        ShortcutFile = shortcutFile;
    }

    public SaveContainer(string directory) :
        this(string.Empty, directory, null, null, null, false, null, string.Empty)
    { }

    public SaveContainer(string directory, string locationContainersFile) :
        this(string.Empty, directory, null, null, null, false, Stateless.Methods.IFileHolder.Get(locationContainersFile), Path.Combine(directory, $"{Path.GetFileName(locationContainersFile)}.lnk"))
    { }

    public SaveContainer(string directory, FileHolder? faceFileHolder, FileHolder? resizedFileHolder, string shortcutFile) :
        this(string.Empty, directory, faceFileHolder, null, null, true, resizedFileHolder, shortcutFile)
    { }

    public SaveContainer(string checkFile, string directory, FileHolder faceFileHolder) :
        this(checkFile, directory, faceFileHolder, null, null, false, null, string.Empty)
    { }

    public SaveContainer(FileHolder resizedFileHolder, string checkFile, string directory) :
        this(checkFile, directory, null, null, null, false, resizedFileHolder, string.Empty)
    { }

    public SaveContainer(string checkFile, string directory, FileHolder? faceFileHolder, FileHolder? hiddenFaceFileHolder, FileHolder? facePartsFileHolder, FileHolder? resizedFileHolder, string shortcutFile) :
        this(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, false, resizedFileHolder, shortcutFile)
    { }

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

}