package managedruntime

import (
	"context"
	"testing"

	"github.com/nexuscrm/metadata/catalogsnapshot"
	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
)

type assignmentPolicyEligibilityTransactionStub struct{}

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

func TestIndependentAssignmentPolicyEligibilityInstallsAdmittedBindingResolver(t *testing.T) {
	handler, err := NewIndependentAssignmentPolicyEligibilityMutationHandler(
		assignmentPolicyEligibilityTransactionStub{},
		func(context.Context) (AssignmentPolicyEligibilityAmbientStager, bool) { return nil, false },
	)
	if err != nil {
		t.Fatal(err)
	}
	if handler == nil {
		t.Fatal("independent assignment-policy lifecycle handler is nil")
	}
}

func testAssignmentPolicyEligibilityRuntimeView(t *testing.T) *catalogsnapshot.RuntimeMetadataView {
	t.Helper()
	workspace := &models.ObjectMetadata{
		APIName: "Workspace", Label: "Workspace", PluralLabel: "Workspaces",
		ReadSource: &models.ObjectReadSourceConfig{Kind: "physical_table", PhysicalTable: "workspace_rows"},
		Fields: []models.FieldMetadata{
			{APIName: "Id", Type: constants.FieldTypeString, PhysicalName: "workspace_id", IsSystem: true},
			{APIName: "Name", Type: constants.FieldTypeString, PhysicalName: "display_name"},
			{APIName: "Active", Type: constants.FieldTypeBoolean, PhysicalName: "is_active"},
		},
		AccessPolicy: &models.ObjectAccessPolicy{Lifecycle: &models.RecordLifecycleAccessPolicy{
			AssignmentPolicyEligibility: &models.AssignmentPolicyEligibilityLifecyclePolicy{
				Role:        models.AssignmentPolicyEligibilitySelectorAuthority,
				EnabledWhen: []models.AssignmentPolicyEligibilityBoolCondition{{Field: "Active", Equals: true}},
				Selector:    models.AssignmentPolicyEligibilitySelector{Field: "Name"},
			},
		}},
	}
	member := &models.ObjectMetadata{
		APIName: "Member", Label: "Member", PluralLabel: "Members",
		ReadSource: &models.ObjectReadSourceConfig{Kind: "physical_table", PhysicalTable: "member_rows"},
		Fields: []models.FieldMetadata{
			{APIName: "Id", Type: constants.FieldTypeString, PhysicalName: "member_id", IsSystem: true},
			{APIName: "Enabled", Type: constants.FieldTypeBoolean, PhysicalName: "is_enabled"},
			{APIName: "WorkspaceId", Type: constants.FieldTypeReference, PhysicalName: "workspace_fk", ReferenceTo: []string{"Workspace"}},
		},
		AccessPolicy: &models.ObjectAccessPolicy{Lifecycle: &models.RecordLifecycleAccessPolicy{
			AssignmentPolicyEligibility: &models.AssignmentPolicyEligibilityLifecyclePolicy{
				Role: models.AssignmentPolicyEligibilitySubjectPopulation, SubjectIDField: "Id",
				EnabledWhen: []models.AssignmentPolicyEligibilityBoolCondition{{Field: "Enabled", Equals: true}},
				Selector: models.AssignmentPolicyEligibilitySelector{Reference: &models.AssignmentPolicyEligibilityReferenceSelector{
					SourceField: "WorkspaceId", TargetObject: "Workspace", TargetField: "Name",
				}},
			},
		}},
	}
	lineage := catalogsnapshot.Lineage{CatalogRevision: 7, SchemaGeneration: 8, EngineGeneration: 9}
	snapshotArtifact, err := catalogsnapshot.CompileCatalogSnapshot(catalogsnapshot.CompileInput{
		OrgID: "org-test", Lineage: lineage,
		Objects: []catalogsnapshot.ObjectInput{
			{CatalogRevision: 7, Metadata: workspace},
			{CatalogRevision: 7, Metadata: member},
		},
		Projections: []catalogsnapshot.RuntimeProjectionInput{{
			CatalogRevision: 7, AppInstallationID: "app-test",
			CapabilityID: "runtime.records.mutation.v1", Profile: catalogsnapshot.ProjectionRecordMutationV1,
			ObjectAPINames: []string{"Member", "Workspace"},
		}},
	})
	if err != nil {
		t.Fatal(err)
	}
	snapshot, err := catalogsnapshot.OpenCatalogSnapshot(snapshotArtifact)
	if err != nil {
		t.Fatal(err)
	}
	viewArtifact, err := catalogsnapshot.ProjectRuntimeMetadataView(snapshot, catalogsnapshot.ProjectionKey{
		AppInstallationID: "app-test", CapabilityID: "runtime.records.mutation.v1",
	})
	if err != nil {
		t.Fatal(err)
	}
	view, err := catalogsnapshot.OpenRuntimeMetadataView(viewArtifact)
	if err != nil {
		t.Fatal(err)
	}
	return view
}
