package permissions

import (
	"context"
	"database/sql"
	"strings"
	"testing"

	"github.com/nexuscrm/shared/pkg/contract"
)

type assignmentPolicyEligibilityLifecycleTxStub struct {
	tx *sql.Tx
}

func (s assignmentPolicyEligibilityLifecycleTxStub) IsTransactionActive(context.Context) bool {
	return true
}
func (s assignmentPolicyEligibilityLifecycleTxStub) IsPessimisticTx(context.Context) bool {
	return true
}
func (s assignmentPolicyEligibilityLifecycleTxStub) ExtractTx(context.Context) interface{} {
	return s.tx
}

type assignmentPolicyEligibilityLifecycleHandlerStub struct {
	mutations []AssignmentPolicyEligibilityMutation
}

func (s *assignmentPolicyEligibilityLifecycleHandlerStub) ApplyAssignmentPolicyEligibilityMutation(
	ctx context.Context,
	mutation AssignmentPolicyEligibilityMutation,
) error {
	return s.ApplyAssignmentPolicyEligibilityMutations(ctx, []AssignmentPolicyEligibilityMutation{mutation})
}

func (s *assignmentPolicyEligibilityLifecycleHandlerStub) ApplyAssignmentPolicyEligibilityMutations(
	_ context.Context,
	mutations []AssignmentPolicyEligibilityMutation,
) error {
	s.mutations = append([]AssignmentPolicyEligibilityMutation(nil), mutations...)
	return nil
}

func TestAssignmentPolicyEligibilityLifecycleRejectsAmbiguousObjectDelimiterWithoutRestrictingRecordIDs(t *testing.T) {
	valid, err := mapAssignmentPolicyEligibilityLifecycleMutation(
		assignmentPolicyEligibilityLifecycleEvent{event: contract.RecordLifecycleBatchEvent{Event: contract.RecordLifecycleEvent{
			ObjectName: "Member", RecordID: "other/member-one",
		}}},
		nil,
	)
	if err != nil {
		t.Fatalf("slash-bearing record ID was rejected: %v", err)
	}
	if valid.SourceIdentity != "member/other/member-one" {
		t.Fatalf("slash-bearing record source identity = %q", valid.SourceIdentity)
	}

	_, err = mapAssignmentPolicyEligibilityLifecycleMutation(
		assignmentPolicyEligibilityLifecycleEvent{event: contract.RecordLifecycleBatchEvent{Event: contract.RecordLifecycleEvent{
			ObjectName: "Member/Other", RecordID: "member-one",
		}}},
		nil,
	)
	if err == nil || !strings.Contains(err.Error(), "ObjectAPIName must match") {
		t.Fatalf("invalid Catalog object API name error = %v, want ObjectKey v1 rejection", err)
	}
}
