package utils

import (
	"cloud.o-forge.io/core/oc-lib/dbs"
	"cloud.o-forge.io/core/oc-lib/tools"
	"github.com/rs/zerolog"
)

// ShallowDBObject is an interface that defines the basic methods shallowed version of a DBObject
type ShallowDBObject interface {
	GenerateID()
	GetID() string
	GetName() string
	Serialize(obj DBObject) map[string]interface{}
	Deserialize(j map[string]interface{}, obj DBObject) DBObject
}

// DBObject is an interface that defines the basic methods for a DBObject
type DBObject interface {
	GenerateID()
	GetID() string
	GetName() string
	IsDrafted() bool
	CanDelete() bool
	StoreDraftDefault()
	GetCreatorID() string
	UpToDate(user string, peer string, create bool)
	CanUpdate(set DBObject) (bool, DBObject)
	VerifyAuth(request *tools.APIRequest) bool
	Serialize(obj DBObject) map[string]interface{}
	GetAccessor(request *tools.APIRequest) Accessor
	Deserialize(j map[string]interface{}, obj DBObject) DBObject
}

// Accessor is an interface that defines the basic methods for an Accessor
type Accessor interface {
	GetUser() string
	GetPeerID() string
	GetGroups() []string
	ShouldVerifyAuth() bool
	GetType() tools.DataType
	GetLogger() *zerolog.Logger
	GetCaller() *tools.HTTPCaller
	GetRequest() *tools.APIRequest
	LoadOne(id string) (DBObject, int, error)
	DeleteOne(id string) (DBObject, int, error)
	CopyOne(data DBObject) (DBObject, int, error)
	StoreOne(data DBObject) (DBObject, int, error)
	LoadAll(isDraft bool) ([]ShallowDBObject, int, error)
	UpdateOne(set DBObject, id string) (DBObject, int, error)
	Search(filters *dbs.Filters, search string, isDraft bool) ([]ShallowDBObject, int, error)
}