using Grand.Domain;
using LiteDB;

namespace Grand.Data.LiteDb;

public class LiteDBStoreFilesContext : IStoreFilesContext
{
    protected LiteDatabase _database;

    public LiteDBStoreFilesContext(LiteDatabase database)
    {
        _database = database;
    }

    public async Task<byte[]> BucketDownload(string id)
    {
        var fs = _database.FileStorage;
        var file = fs.FindById(id);

        if (file == null)
            throw new ArgumentNullException(nameof(file));

        using (var stream = file.OpenRead())
        using (MemoryStream mstream = new())
        {
            stream.CopyTo(mstream);
            return await Task.FromResult(mstream.ToArray());
        }
    }

    public Task BucketDelete(string id)
    {
        var fs = _database.FileStorage;
        fs.Delete(id);

        return Task.CompletedTask;
    }

    public async Task<string> BucketUploadFromBytes(string filename, byte[] source)
    {
        var id = UniqueIdentifier.New;
        var fs = _database.FileStorage;
        fs.Upload(id, filename, new MemoryStream(source));

        return await Task.FromResult(id);
    }
}