using LibHac.Common;
using LibHac.Fs;
using LibHac.Fs.Shim;
using LibHac.Ncm;
using Xunit;

namespace LibHac.Tests.Fs.FileSystemClientTests.ShimTests
{
    public class BcatSaveData
    {
        [Fact]
        public void MountBcatSaveData_SaveDoesNotExist_ReturnsTargetNotFound()
        {
            var applicationId = new TitleId(1);
            FileSystemClient fs = FileSystemServerFactory.CreateClient(true);

            Assert.Result(ResultFs.TargetNotFound, fs.MountBcatSaveData("bcat_test".ToU8Span(), applicationId));
        }

        [Fact]
        public void MountBcatSaveData_SaveExists_ReturnsSuccess()
        {
            var applicationId = new TitleId(1);
            FileSystemClient fs = FileSystemServerFactory.CreateClient(true);

            Assert.Success(fs.CreateBcatSaveData(applicationId, 0x400000));
            Assert.Success(fs.MountBcatSaveData("bcat_test".ToU8Span(), applicationId));
        }

        [Fact]
        public void MountBcatSaveData_WrittenDataPersists()
        {
            var applicationId = new TitleId(1);
            FileSystemClient fs = FileSystemServerFactory.CreateClient(true);

            Assert.Success(fs.CreateBcatSaveData(applicationId, 0x400000));
            Assert.Success(fs.MountBcatSaveData("bcat_test".ToU8Span(), applicationId));

            // Check that the path doesn't exist
            Assert.Result(ResultFs.PathNotFound, fs.GetEntryType(out _, "bcat_test:/file".ToU8Span()));

            fs.CreateFile("bcat_test:/file".ToU8Span(), 0);
            fs.Commit("bcat_test".ToU8Span());
            fs.Unmount("bcat_test".ToU8Span());

            Assert.Success(fs.MountBcatSaveData("bcat_test".ToU8Span(), applicationId));
            Assert.Success(fs.GetEntryType(out DirectoryEntryType type, "bcat_test:/file".ToU8Span()));
            Assert.Equal(DirectoryEntryType.File, type);
        }
    }
}