import (
	ccomand "github.com/pip-services3-gox/pip-services3-commons-gox/commands"
	cdata "github.com/pip-services3-gox/pip-services3-commons-gox/data"
)

type MyDataController struct {
	commandSet *MyDataCommandSet
	entities   []MyData
}

func NewMyDataController() *MyDataController {
	dc := MyDataController{}
	dc.entities = make([]MyData, 0)
	return &dc
}

func (c *MyDataController) GetCommandSet() *ccomand.CommandSet {
	if c.commandSet == nil {
		c.commandSet = NewMyDataCommandSet(c)
	}
	return c.commandSet.CommandSet
}

func (c *MyDataController) GetPageByFilter(correlationId string, filter *cdata.FilterParams,
	paging *cdata.PagingParams) (items *cdata.DataPage[MyData], err error) {

	if filter == nil {
		filter = cdata.NewEmptyFilterParams()
	}
	var key string = filter.GetAsString("key")

	if paging == nil {
		paging = cdata.NewEmptyPagingParams()
	}
	var skip int64 = paging.GetSkip(0)
	var take int64 = paging.GetTake(100)

	var result []MyData
	for i := 0; i < len(c.entities); i++ {
		var entity MyData = c.entities[i]
		if key != "" && key != entity.Key {
			continue
		}

		skip--
		if skip >= 0 {
			continue
		}

		take--
		if take < 0 {
			break
		}

		result = append(result, entity)
	}
	var total int64 = (int64)(len(result))
	return cdata.NewDataPage[MyData](result, int(total)), nil
}

func (c *MyDataController) GetOneById(correlationId string, id string) (result *MyData, err error) {
	for i := 0; i < len(c.entities); i++ {
		var entity MyData = c.entities[i]
		if id == entity.Id {
			return &entity, nil
		}
	}
	return nil, nil
}

func (c *MyDataController) Create(correlationId string, entity MyData) (result *MyData, err error) {
	if entity.Id == "" {
		entity.Id = cdata.IdGenerator.NextLong()
	}

	c.entities = append(c.entities, entity)
	return &entity, nil
}

func (c *MyDataController) Update(correlationId string, newEntity MyData) (result *MyData, err error) {
	for index := 0; index < len(c.entities); index++ {
		var entity MyData = c.entities[index]
		if entity.Id == newEntity.Id {
			c.entities[index] = newEntity
			return &newEntity, nil

		}
	}
	return nil, nil
}

func (c *MyDataController) DeleteById(correlationId string, id string) (result *MyData, err error) {
	var entity MyData

	for i := 0; i < len(c.entities); {
		entity = c.entities[i]
		if entity.Id == id {
			if i == len(c.entities)-1 {
				c.entities = c.entities[:i]
			} else {
				c.entities = append(c.entities[:i], c.entities[i+1:]...)
			}
			return &entity, nil
		} else {
			i++
		}
	}
	return nil, nil
}