package auth

import (
	"context"

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

// ArchivableDB implements archive operations with permission checking
type ArchivableDB[T model.PermissionBoundStorable] interface {
	// SetArchived sets the archived status of an entity with permission checking
	SetArchived(ctx context.Context, accountRef, objectRef bson.ObjectID, archived bool) error
	// IsArchived checks if an entity is archived with permission checking
	IsArchived(ctx context.Context, accountRef, objectRef bson.ObjectID) (bool, error)

	// Archive archives an entity with permission checking (sets archived to true)
	Archive(ctx context.Context, accountRef, objectRef bson.ObjectID) error

	// Unarchive unarchives an entity with permission checking (sets archived to false)
	Unarchive(ctx context.Context, accountRef, objectRef bson.ObjectID) error
}

// NewArchivableDB creates a new auth.ArchivableDB instance
func NewArchivableDB[T model.PermissionBoundStorable](
	dbImp *template.DBImp[T],
	logger mlogger.Logger,
	enforcer Enforcer,
	createEmpty func() T,
	getArchivable func(T) model.Archivable,
) ArchivableDB[T] {
	return newArchivableDBImp(dbImp, logger, enforcer, createEmpty, getArchivable)
}
