using PipServices3.MongoDb.Persistence;
using MongoDB.Bson.Serialization.Attributes;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using MongoDB.Driver;

class MyObject
{
    [BsonElement("key")]
    [DataMember(Name = "key")]
    public string Key { get; set; }
    [BsonElement("name")]
    [DataMember(Name = "name")]
    public string Name { get; set; }
}

class MyMongoDbPersistence : MongoDbPersistence<MyObject>
{
    public MyMongoDbPersistence():base("mycollection") { }

    public async Task<MyObject> GetByNameAsync(string correlationId, string name)
    {
        var builder = Builders<MyObject>.Filter;
        var filter = builder.Empty;

        
        filter &= builder.Eq("name", name); ;
        var res = await GetListByFilterAsync(correlationId, filter);

        return res.Count > 0 ? res[0] : null;
    }

    public async Task<MyObject> CreateDefault(string correlationId, string name)
    {
        name ??= "unknown";
        var key = name.ToLower().Replace(" #$%^&", "_");
        var item = new MyObject { Key = key, Name = name };

        await _collection.InsertOneAsync(item, null);

        _logger.Trace(correlationId, "Created item in %s with key = %s", _collectionName, key);

        return item;
    }

    public async Task DeleteByName(string correlationId, string name)
    {
        var builder = Builders<MyObject>.Filter;
        var filter = builder.Empty;


        filter &= builder.Eq("name", name); ;
        await DeleteByFilterAsync(correlationId, filter);
    }
}