package auth

import (
	"context"

	"github.com/tech/sendico/pkg/db/policy"
	"github.com/tech/sendico/pkg/db/repository/builder"
	"github.com/tech/sendico/pkg/db/template"
	"github.com/tech/sendico/pkg/mlogger"
	"github.com/tech/sendico/pkg/model"
	"github.com/tech/sendico/pkg/mservice"
	"go.mongodb.org/mongo-driver/v2/bson"
	"go.mongodb.org/mongo-driver/v2/mongo"
)

type ProtectedDB[T model.PermissionBoundStorable] interface {
	Create(ctx context.Context, accountRef, organizationRef bson.ObjectID, object T) error
	InsertMany(ctx context.Context, accountRef, organizationRef bson.ObjectID, objects []T) error
	Get(ctx context.Context, accountRef, objectRef bson.ObjectID, result T) error
	Update(ctx context.Context, accountRef bson.ObjectID, object T) error
	Delete(ctx context.Context, accountRef, objectRef bson.ObjectID) error
	DeleteCascadeAuth(ctx context.Context, accountRef, objectRef bson.ObjectID) error
	Patch(ctx context.Context, accountRef, objectRef bson.ObjectID, patch builder.Patch) error
	PatchMany(ctx context.Context, accountRef bson.ObjectID, query builder.Query, patch builder.Patch) (int, error)
	Unprotected() template.DB[T]
	ListIDs(ctx context.Context, action model.Action, accountRef bson.ObjectID, query builder.Query) ([]bson.ObjectID, error)
}

func CreateDB[T model.PermissionBoundStorable](
	ctx context.Context,
	l mlogger.Logger,
	pdb policy.DB,
	enforcer Enforcer,
	collection mservice.Type,
	db *mongo.Database,
) (ProtectedDB[T], error) {
	return CreateDBImp[T](ctx, l, pdb, enforcer, collection, db)
}
