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

namespace LibHac.Tests.Fs.FileSystemClientTests.ShimTests;

public class BcatSaveData
{
    [Fact]
    public void MountBcatSaveData_SaveDoesNotExist_ReturnsTargetNotFound()
    {
        var applicationId = new Ncm.ApplicationId(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 Ncm.ApplicationId(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 Ncm.ApplicationId(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);
    }
}
