package managedruntime

import (
	"context"
	"errors"
	"os"
	"strings"
	"testing"

	"github.com/nexuscrm/permissions"
)

type lifecycleInstallTransactionStub struct{}

func (lifecycleInstallTransactionStub) IsTransactionActive(context.Context) bool { return true }
func (lifecycleInstallTransactionStub) IsPessimisticTx(context.Context) bool     { return true }
func (lifecycleInstallTransactionStub) ExtractTx(context.Context) interface{}    { return nil }

type lifecycleInstallerStub struct {
	handler permissions.AssignmentPolicyEligibilityMutationBatchHandler
	err     error
}

func (s *lifecycleInstallerStub) InstallAssignmentPolicyEligibilityLifecycle(
	handler permissions.AssignmentPolicyEligibilityMutationBatchHandler,
) error {
	s.handler = handler
	return s.err
}

func TestInstallIndependentAssignmentPolicyEligibilityLifecycleOwnsRegistration(t *testing.T) {
	installer := &lifecycleInstallerStub{}
	if err := InstallIndependentAssignmentPolicyEligibilityLifecycle(
		lifecycleInstallTransactionStub{},
		installer,
	); err != nil {
		t.Fatal(err)
	}
	if installer.handler == nil {
		t.Fatal("assignment-policy lifecycle handler was not installed")
	}

	installer.err = errors.New("duplicate")
	if err := InstallIndependentAssignmentPolicyEligibilityLifecycle(
		lifecycleInstallTransactionStub{},
		installer,
	); err == nil || !strings.Contains(err.Error(), "duplicate") {
		t.Fatalf("install error = %v, want wrapped installer failure", err)
	}
}

func TestIndependentRuntimeRolesInstallLifecycleWithoutSharedGraphFactory(t *testing.T) {
	for _, path := range []string{
		"../runtimeapi/process.go",
		"../runtimeworker/assemble.go",
	} {
		raw, err := os.ReadFile(path)
		if err != nil {
			t.Fatal(err)
		}
		source := string(raw)
		if !strings.Contains(source, "recordmutation.NewRecordsMutationEngineRuntime(") {
			t.Fatalf("independent Runtime composition %s does not own its Records graph", path)
		}
		if !strings.Contains(source, "managedruntime.InstallIndependentAssignmentPolicyEligibilityLifecycle(") {
			t.Fatalf("independent Runtime composition %s is missing assignment-policy lifecycle", path)
		}
	}
}
