package datastore

import (
	"context"
	"errors"
	"git.itzana.me/strafesnet/maps-service/pkg/model"
)

var (
	ErrNotExist = errors.New("resource does not exist")
)

type Datastore interface {
	Submissions() Submissions
	Scripts() Scripts
	ScriptPolicy() ScriptPolicy
}

type Submissions interface {
	Get(ctx context.Context, id int64) (model.Submission, error)
	GetList(ctx context.Context, id []int64) ([]model.Submission, error)
	Create(ctx context.Context, smap model.Submission) (model.Submission, error)
	Update(ctx context.Context, id int64, values OptionalMap) error
	IfStatusThenUpdate(ctx context.Context, id int64, statuses []model.Status, values OptionalMap) error
	IfStatusThenUpdateAndGet(ctx context.Context, id int64, statuses []model.Status, values OptionalMap) (model.Submission, error)
	Delete(ctx context.Context, id int64) error
	List(ctx context.Context, filters OptionalMap, page model.Page) ([]model.Submission, error)
}

type Scripts interface {
	Get(ctx context.Context, id int64) (model.Script, error)
	Create(ctx context.Context, smap model.Script) (model.Script, error)
	Update(ctx context.Context, id int64, values OptionalMap) error
	Delete(ctx context.Context, id int64) error
}

type ScriptPolicy interface {
	Get(ctx context.Context, id int64) (model.ScriptPolicy, error)
	GetFromHash(ctx context.Context, hash uint64) (model.ScriptPolicy, error)
	Create(ctx context.Context, smap model.ScriptPolicy) (model.ScriptPolicy, error)
	Update(ctx context.Context, id int64, values OptionalMap) error
	Delete(ctx context.Context, id int64) error
}