//go:build crm && runtime_l1_integration

package crm

import (
	"context"
	"database/sql"

	"github.com/nexuscrm/permissions"
	"github.com/nexuscrm/shared/pkg/models"
)

func crmUserAssignmentPolicyEligibilityTestPolicy() *models.RecordLifecycleAccessPolicy {
	return &models.RecordLifecycleAccessPolicy{AssignmentPolicyEligibility: &models.AssignmentPolicyEligibilityLifecyclePolicy{
		EnabledWhen: []models.AssignmentPolicyEligibilityBoolCondition{
			{Field: "IsActive", Equals: true},
			{Field: "IsDeleted", Equals: false},
		},
		Selector: models.AssignmentPolicyEligibilitySelector{Reference: &models.AssignmentPolicyEligibilityReferenceSelector{
			SourceField: "ProfileId", TargetObject: "Profile", TargetField: "Name",
		}},
	}}
}

type assignmentPolicyEligibilityMutationHandlerStub struct {
	batchCalls int
	mutations  []permissions.AssignmentPolicyEligibilityMutation
	err        error
}

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

func (s *assignmentPolicyEligibilityMutationHandlerStub) ApplyAssignmentPolicyEligibilityMutations(
	_ context.Context,
	mutations []permissions.AssignmentPolicyEligibilityMutation,
) error {
	s.batchCalls++
	s.mutations = append([]permissions.AssignmentPolicyEligibilityMutation(nil), mutations...)
	return s.err
}

type lifecycleTxManagerStub struct {
	tx          *sql.Tx
	active      bool
	pessimistic bool
}

func (s lifecycleTxManagerStub) WithTransaction(ctx context.Context, fn func(context.Context) error) error {
	return fn(ctx)
}

func (s lifecycleTxManagerStub) WithPessimisticTransaction(ctx context.Context, fn func(context.Context) error) error {
	return fn(ctx)
}

func (s lifecycleTxManagerStub) WithRetry(ctx context.Context, fn func(context.Context) error, _ int) error {
	return fn(ctx)
}

func (s lifecycleTxManagerStub) WithPessimisticRetry(ctx context.Context, fn func(context.Context) error, _ int) error {
	return fn(ctx)
}

func (s lifecycleTxManagerStub) IsTransactionActive(context.Context) bool { return s.active }

func (s lifecycleTxManagerStub) IsPessimisticTx(context.Context) bool { return s.pessimistic }

func (s lifecycleTxManagerStub) ExtractTx(context.Context) interface{} { return s.tx }

func (s lifecycleTxManagerStub) DetachTx(ctx context.Context) context.Context { return ctx }
