using PipServices3.Commons.Commands;
using PipServices3.Commons.Data;
using PipServices3.Commons.Refer;

public class MyDataController : IMyDataController, ICommandable
{
    private IList<MyData> _entities = new List<MyData>();
    private CommandSet _commandSet;

    public CommandSet GetCommandSet()
    {
        if (this._commandSet == null)
            this._commandSet = new MyDataCommandSet(this);
        return this._commandSet;
    }

    public async Task<DataPage<MyData>> GetPageByFilterAsync(string correlationId, FilterParams filter, PagingParams paging)
    {
        filter = filter != null ? filter : new FilterParams();
        var key = filter.GetAsNullableString("key");

        paging = paging != null ? paging : new PagingParams();
        var skip = paging.GetSkip(0);
        var take = paging.GetTake(100);

        List<MyData> result = new List<MyData>();
        for (var i = 0; i < this._entities.Count; i++)
        {
            var entity = this._entities[i];
            if (key != null && key != entity.Key)
                continue;

            skip--;
            if (skip >= 0) continue;

            take--;
            if (take < 0) break;

            result.Add(entity);
        }

        return new DataPage<MyData>(result);
    }

    public async Task<MyData> GetOneByIdAsync(string correlationId, string id)
    {
        for (var i = 0; i < this._entities.Count; i++)
        {
            var entity = this._entities[i];
            if (id == entity.Id)
                return entity;
        }
        return null;
    }

    public async Task<MyData> CreateAsync(string correlationId, MyData entity)
    {
        if (entity.Id == null || entity.Id == "")
            entity.Id = IdGenerator.NextLong();
        _entities.Add(entity);
        return entity;
    }

    public async Task<MyData> DeleteByIdAsync(string correlationId, string id)
    {
        for (var index = 0; index < this._entities.Count; index++)
        {
            var entity = this._entities[index];
            if (entity.Id == id)
            {
                this._entities.RemoveAt(index);
                return entity;
            }
        }
        return null;
    }


    public async Task<MyData> UpdateAsync(string correlationId, MyData newEntity)
    {
        for (var index = 0; index < this._entities.Count; index++)
        {
            var entity = this._entities[index];
            if (entity.Id == newEntity.Id)
            {
                this._entities[index] = newEntity;
                return newEntity;
            }
        }
        return null;
    }
}