using LibHac.Fs;
using LibHac.FsSystem;
using Ryujinx.HLE.HOS;
using System.IO;

namespace Ryujinx.HLE.FileSystem
{
    static class SaveHelper
    {
        public static IFileSystem OpenSystemSaveData(ServiceCtx context, ulong saveId)
        {
            SaveInfo saveInfo = new SaveInfo(0, (long)saveId, SaveDataType.SystemSaveData, SaveSpaceId.NandSystem);
            string   savePath = context.Device.FileSystem.GetSavePath(context, saveInfo, false);

            if (File.Exists(savePath))
            {
                string tempDirectoryPath = $"{savePath}_temp";

                Directory.CreateDirectory(tempDirectoryPath);

                IFileSystem outputFolder = new LocalFileSystem(tempDirectoryPath);

                using (LocalStorage systemSaveData = new LocalStorage(savePath, FileAccess.Read, FileMode.Open))
                {
                    IFileSystem saveFs = new LibHac.FsSystem.Save.SaveDataFileSystem(context.Device.System.KeySet, systemSaveData, IntegrityCheckLevel.None, false);

                    saveFs.CopyDirectory(outputFolder, "/", "/");
                }

                File.Delete(savePath);

                Directory.Move(tempDirectoryPath, savePath);
            }
            else
            {
                if (!Directory.Exists(savePath))
                {
                    Directory.CreateDirectory(savePath);
                }
            }

            return new LocalFileSystem(savePath);
        }
    }
}