package managedruntime

import (
	"fmt"

	"github.com/nexuscrm/permissions"
)

// AssignmentPolicyEligibilityLifecycleInstaller is the narrow Records-engine
// seam shared by the independently deployed Runtime API and Runtime Worker.
// It deliberately does not import either service composition or the Records
// mutation graph, so retained monolith commands cannot acquire that graph
// through this package's dependency closure.
type AssignmentPolicyEligibilityLifecycleInstaller interface {
	InstallAssignmentPolicyEligibilityLifecycle(permissions.AssignmentPolicyEligibilityMutationBatchHandler) error
}

// InstallIndependentAssignmentPolicyEligibilityLifecycle installs the same
// write-side invariant in every independent Records mutation role. The
// admitted execution context supplies the exact Catalog-bound stager; this
// function neither selects metadata nor creates a second source of truth.
func InstallIndependentAssignmentPolicyEligibilityLifecycle(
	transactions AssignmentPolicyEligibilityTransaction,
	installer AssignmentPolicyEligibilityLifecycleInstaller,
) error {
	if installer == nil {
		return fmt.Errorf("independent Records mutation runtime: lifecycle installer is required")
	}
	handler, err := NewIndependentAssignmentPolicyEligibilityMutationHandler(
		transactions,
		AssignmentPolicyEligibilityAmbientStagerFromContext,
	)
	if err != nil {
		return fmt.Errorf("independent Records mutation runtime: compose assignment-policy lifecycle: %w", err)
	}
	if err := installer.InstallAssignmentPolicyEligibilityLifecycle(handler); err != nil {
		return fmt.Errorf("independent Records mutation runtime: install assignment-policy lifecycle: %w", err)
	}
	return nil
}
