package auth

import (
	"context"

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

// IndexableDB implements reordering with permission checking
type IndexableDB[T storable.Storable] interface {
	// Reorder implements reordering with permission checking using EnforceBatch
	Reorder(ctx context.Context, accountRef, objectRef bson.ObjectID, newIndex int, filter builder.Query) error
}

// NewIndexableDB creates a new auth.IndexableDB instance
func NewIndexableDB[T storable.Storable](
	repo repository.Repository,
	logger mlogger.Logger,
	enforcer Enforcer,
	createEmpty func() T,
	getIndexable func(T) *model.Indexable,
) IndexableDB[T] {
	return newIndexableDBImp(repo, logger, enforcer, createEmpty, getIndexable)
}
