package rest

import (
	"testing"

	"github.com/nexuscrm/backend/internal/features/permissions"
	"github.com/nexuscrm/shared/pkg/models"
)

func TestShouldDeferBulkJobObjectPermissionCheck(t *testing.T) {
	permSvc := &permissions.PermissionService{}
	derivedSchema := &models.ObjectMetadata{
		APIName: "CaseComment",
		AccessPolicy: &models.ObjectAccessPolicy{
			Mode: "derived",
			ObjectEdit: &models.AccessPolicyExpr{
				AllOf: []models.AccessPolicyExpr{
					{Kind: "systemPermission", APIName: "EditCaseComments"},
					{Kind: "recordFieldEqualsCurrentUser", Field: "CreatedById"},
				},
			},
			ObjectDelete: &models.AccessPolicyExpr{
				AllOf: []models.AccessPolicyExpr{
					{Kind: "systemPermission", APIName: "EditCaseComments"},
					{Kind: "recordFieldEqualsCurrentUser", Field: "CreatedById"},
				},
			},
		},
	}
	nonDerivedSchema := &models.ObjectMetadata{APIName: "Account"}

	tests := []struct {
		name      string
		schema    *models.ObjectMetadata
		operation models.BulkOperation
		want      bool
	}{
		{name: "derived update defers to record-aware gate", schema: derivedSchema, operation: models.OperationUpdate, want: true},
		{name: "derived delete defers to record-aware gate", schema: derivedSchema, operation: models.OperationDelete, want: true},
		{name: "derived insert does not defer", schema: derivedSchema, operation: models.OperationInsert, want: false},
		{name: "derived upsert defers edit gate to record-aware path", schema: derivedSchema, operation: models.OperationUpsert, want: true},
		{name: "non-derived update does not defer", schema: nonDerivedSchema, operation: models.OperationUpdate, want: false},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := shouldDeferBulkJobObjectPermissionCheck(tt.schema, tt.operation, permSvc); got != tt.want {
				t.Fatalf("shouldDeferBulkJobObjectPermissionCheck() = %v, want %v", got, tt.want)
			}
		})
	}
}
