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 {
	DBObject
	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()
	Extend(typ ...string) map[string][]tools.DataType
	SetNotInCatalog(bool)
	IsNotInCatalog() bool
	SetID(id string)
	GetID() string
	GetName() string
	SetName(name string)
	SetDraft(draft bool)
	IsDrafted() bool
	CanDelete() bool
	StoreDraftDefault()
	GetCreatorID() string
	UpToDate(user string, peer string, create bool)
	CanUpdate(set DBObject) (bool, DBObject)
	VerifyAuth(callName string, request *tools.APIRequest) bool
	Serialize(obj DBObject) map[string]interface{}
	GetAccessor(request *tools.APIRequest) Accessor
	Deserialize(j map[string]interface{}, obj DBObject) DBObject
	Sign()
	Unsign()
	GetSignature() []byte
	GetObjectFilters(search string) *dbs.Filters
}

// Accessor is an interface that defines the basic methods for an Accessor
type Accessor interface {
	NewObj() DBObject
	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, offset int64, limit int64) ([]ShallowDBObject, int, error)
	UpdateOne(set map[string]interface{}, id string) (DBObject, int, error)
	Search(filters *dbs.Filters, search string, isDraft bool, offset int64, limit int64) ([]ShallowDBObject, int, error)
	GetExec(isDraft bool) func(DBObject) ShallowDBObject
}
