package core

import (
	"github.com/juju/errors"
	"github.com/pingcap/schrodinger/pkg/types"
)

// CreateObject creates object
func (mgr *Manager) CreateObject(object *types.Object) error {
	return errors.Trace(mgr.storage.CreateObject(object))
}

// UpdateObject updates object
func (mgr *Manager) UpdateObject(object *types.Object) error {
	return errors.Trace(mgr.storage.UpdateObject(object))
}

// GetObject returns object according to id
func (mgr *Manager) GetObject(id int64) (*types.Object, error) {
	obj, ok := mgr.storage.GetObject(id)
	if !ok {
		return nil, errors.NotFoundf("object %d", id)
	}

	return obj, nil
}

// ListObject returns all objects
func (mgr *Manager) ListObject() []*types.Object {
	return mgr.storage.ListObject()
}

// ListObjectByBoxID list objects by box id
func (mgr *Manager) ListObjectByBoxID(boxID int64) []*types.Object {
	var objects []*types.Object
	objs := mgr.storage.ListObject()
	for _, obj := range objs {
		if obj.BoxID == boxID {
			objects = append(objects, obj)
		}
	}
	return objects
}

// ListObjectByExperimentID list object by experiment id
func (mgr *Manager) ListObjectByExperimentID(experimentID int64) []*types.Object {
	var objects []*types.Object
	objs := mgr.storage.ListObject()
	for _, obj := range objs {
		if obj.ExperimentID == experimentID {
			objects = append(objects, obj)
		}
	}
	return objects
}
