package management

import (
	"context"

	"github.com/tech/sendico/pkg/model"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

type Role interface {
	// Create a new role in an organization (returns the created Role with its ID).
	Create(
		ctx context.Context,
		orgRef primitive.ObjectID,
		description *model.Describable,
	) (*model.RoleDescription, error)

	// Delete a role entirely. This will cascade and remove all associated
	Delete(
		ctx context.Context,
		roleRef primitive.ObjectID,
	) error

	// Assign a role to a user in a specific organization.
	Assign(
		ctx context.Context,
		role *model.Role,
	) error

	// Revoke a role from a user in a specific organization.
	Revoke(
		ctx context.Context,
		roleRef, accountRef, orgRef primitive.ObjectID,
	) error

	// List all roles in an organization or globally if orgRef is primitive.NilObjectID.
	List(
		ctx context.Context,
		orgRef primitive.ObjectID,
	) ([]model.RoleDescription, error)
}
