package mapping

import (
	"errors"
	navigationsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/applicationnavigationv1"

	catalogsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/catalog/consumerv1"
	analyticsauthoringsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/analyticsauthoringv1"
	applicationresultsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/applicationresultv1"
	approvalnotificationsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/approvalnotificationflowv1"
	approvalsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/approvalv1"
	auditsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/auditlogv1"
	bulkingestsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/bulkingestv1"
	commandsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/commandv1"
	commonsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/commonv1"
	permissionsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/effectivepermissionsv1"
	externaleffectsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/externaleffectv1"
	filessemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/filesv1"
	flowsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/flowv1"
	layoutauthoringsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/layoutauthoringv1"
	layoutauthoringv2semantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/layoutauthoringv2"
	listviewsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/listviewv1"
	mailboxauthorizationsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/mailboxauthorizationv1"
	metadataadminsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/metadataadminreadv1"
	outboundintentsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/outboundintentv1"
	pagelayoutresolutionsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/pagelayoutresolutionv1"
	permissionadminsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/permissionadminv1"
	permissionauthoringsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/permissionauthoringv1"
	historysemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/queryv1"
	reportsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/reportv1"
	resourceaccesssemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/resourceaccessv1"
	searchsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/searchv1"
	servingbindingsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/servingbindingv1"
	sessionsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/sessionv1"
	"github.com/pingcap-inc/nexuscrm-contract/wire-go/envelope"
)

func platformCapability(name string) capabilitySpec {
	// name is the full immutable semantic capability identity (for example a
	// name ending in ".v2"). The numeric version below independently versions
	// that identity's wire representation; every newly published identity
	// starts at wire version 1.0.
	return capabilitySpec{
		name: name, protocolMajor: commonsemantic.ProtocolMajor, protocolMinor: commonsemantic.ProtocolMinor,
		major: 1, minor: 0,
		undetailedTransport: map[commonsemantic.FailureCategory]bool{
			commonsemantic.FailureUnauthenticated:   true,
			commonsemantic.FailureForbidden:         true,
			commonsemantic.FailureCanceled:          true,
			commonsemantic.FailureDeadlineExceeded:  true,
			commonsemantic.FailureResourceExhausted: true,
			commonsemantic.FailureUnavailable:       true,
		},
	}
}

func platformCapabilityFor(name string) (capabilitySpec, bool) {
	switch name {
	case resourceaccesssemantic.CapabilityName:
		spec := platformCapability(name)
		spec.conflict = true
		return spec, true
	case navigationsemantic.CapabilityName, layoutauthoringsemantic.CapabilityName, layoutauthoringv2semantic.CapabilityName:
		spec := platformCapability(name)
		spec.conflict = true
		return spec, true
	case applicationresultsemantic.CapabilityName,
		analyticsauthoringsemantic.CapabilityName,
		approvalnotificationsemantic.CapabilityName,
		approvalsemantic.ExecuteCapabilityName,
		approvalsemantic.ReadCapabilityName,
		auditsemantic.CapabilityName,
		bulkingestsemantic.CapabilityName,
		catalogsemantic.AppMetadataCapabilityName,
		catalogsemantic.AppMetadataV2CapabilityName,
		catalogsemantic.AppMetadataV3CapabilityName,
		catalogsemantic.IntegrationBindingCapabilityName,
		searchsemantic.CapabilityName,
		flowsemantic.CapabilityName,
		reportsemantic.CapabilityName,
		sessionsemantic.CapabilityName,
		filessemantic.CapabilityName,
		commandsemantic.CapabilityName,
		permissionsemantic.CapabilityName,
		externaleffectsemantic.CapabilityName,
		outboundintentsemantic.CapabilityName,
		mailboxauthorizationsemantic.CapabilityName,
		servingbindingsemantic.CapabilityName,
		listviewsemantic.CapabilityName,
		pagelayoutresolutionsemantic.CapabilityName,
		metadataadminsemantic.CapabilityName,
		permissionadminsemantic.CapabilityName,
		permissionauthoringsemantic.CapabilityName:
		return platformCapability(name), true
	default:
		return capabilitySpec{}, false
	}
}

// ToPlatformStatusError projects a failure only for the finite set of private
// Platform API v1 capabilities. Unknown capability identities fail closed
// rather than borrowing another service's disclosure grammar.
func ToPlatformStatusError(err error, capabilityName string) error {
	capability, ok := platformCapabilityFor(capabilityName)
	if !ok {
		return toStatusError(&commonsemantic.Failure{Category: commonsemantic.FailureInternal}, selectedRootCapability)
	}
	if shapeErr := requirePlatformSemanticShape(capabilityName); shapeErr != nil {
		err = shapeErr
	}
	var failure *commonsemantic.Failure
	if errors.As(err, &failure) && !validPlatformFailure(failure, capability, false) {
		err = &commonsemantic.Failure{Category: commonsemantic.FailureInternal}
	}
	return toStatusError(err, capability)
}

// FromPlatformStatusError decodes only safe details bound to the named
// Platform capability. A receipt or compatibility detail for another
// capability is never reinterpreted.
func FromPlatformStatusError(err error, capabilityName string) error {
	capability, ok := platformCapabilityFor(capabilityName)
	if !ok {
		return &commonsemantic.Failure{Category: commonsemantic.FailureInternal}
	}
	if shapeErr := requirePlatformSemanticShape(capabilityName); shapeErr != nil {
		return shapeErr
	}
	decoded := fromStatusError(err, capability)
	var failure *commonsemantic.Failure
	if errors.As(decoded, &failure) && !validPlatformFailure(failure, capability, true) {
		return &commonsemantic.Failure{Category: commonsemantic.FailureInternal}
	}
	return decoded
}

func validPlatformFailure(failure *commonsemantic.Failure, capability capabilitySpec, decoded bool) bool {
	if failure == nil || !commonsemantic.ValidFailureConflictReason(failure) {
		return false
	}
	switch capability.name {
	case sessionsemantic.CapabilityName:
		if !sessionsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case auditsemantic.CapabilityName:
		if !auditsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case approvalnotificationsemantic.CapabilityName:
		if !approvalnotificationsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case metadataadminsemantic.CapabilityName:
		if !metadataadminsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case pagelayoutresolutionsemantic.CapabilityName:
		if !pagelayoutresolutionsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case permissionadminsemantic.CapabilityName:
		if !permissionadminsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case permissionauthoringsemantic.CapabilityName:
		if !permissionauthoringsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case analyticsauthoringsemantic.CapabilityName:
		if !analyticsauthoringsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case resourceaccesssemantic.CapabilityName:
		if !resourceaccesssemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case layoutauthoringsemantic.CapabilityName:
		if !layoutauthoringsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case navigationsemantic.CapabilityName:
		if !navigationsemantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	case layoutauthoringv2semantic.CapabilityName:
		if !layoutauthoringv2semantic.ValidTopLevelFailure(failure.Category) {
			return false
		}
	}
	if failure.Receipts != nil && !validSemanticReceipts(*failure.Receipts, capability) {
		return false
	}
	switch failure.Category {
	case commonsemantic.FailureInvalidRequest:
		return failure.CanonicalField == "" &&
			validPlatformInvalidComponent(capability.name, failure.InvalidComponent)
	case commonsemantic.FailureResourceExhausted:
		// A transport-only ResourceExhausted status may arrive without typed
		// detail. Typed semantic failures must identify their bounded resource.
		return (decoded && failure.LimitKind == "") ||
			validPlatformLimit(capability.name, failure.LimitKind, failure.Maximum)
	case commonsemantic.FailureIncompatible:
		if !decoded {
			return true
		}
		return failure.RequiredCapability == capability.name &&
			failure.SupportedMajor == capability.protocolMajor &&
			failure.SupportedMinorMin <= capability.protocolMinor &&
			failure.SupportedMinorMax >= capability.protocolMinor
	case commonsemantic.FailureStaleState:
		return failure.StaleAxis == commonsemantic.StaleAxisCatalog ||
			failure.StaleAxis == commonsemantic.StaleAxisSecurity
	case commonsemantic.FailureUnauthenticated, commonsemantic.FailureForbidden,
		commonsemantic.FailureMissing, commonsemantic.FailureConflict, commonsemantic.FailureCanceled,
		commonsemantic.FailureDeadlineExceeded, commonsemantic.FailureUnavailable,
		commonsemantic.FailureInternal:
		return true
	default:
		return false
	}
}

func validPlatformInvalidComponent(capability string, component commonsemantic.InvalidComponent) bool {
	switch capability {
	case applicationresultsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case approvalsemantic.ExecuteCapabilityName:
		// Operation is the closed, disclosure-safe shape for an otherwise valid
		// approval operation that conflicts with the resource's current state.
		return component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case approvalsemantic.ReadCapabilityName:
		return component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentRecordID ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case approvalnotificationsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case auditsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case catalogsemantic.AppMetadataCapabilityName,
		catalogsemantic.AppMetadataV2CapabilityName,
		catalogsemantic.AppMetadataV3CapabilityName,
		catalogsemantic.IntegrationBindingCapabilityName:
		return component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case searchsemantic.CapabilityName:
		switch component {
		case commonsemantic.InvalidComponentQueryPlan, commonsemantic.InvalidComponentObjectID,
			commonsemantic.InvalidComponentQuerySelection, commonsemantic.InvalidComponentDeadline,
			commonsemantic.InvalidComponentResponse:
			return true
		default:
			return false
		}
	case flowsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case reportsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentQueryPlan ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case sessionsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentAppInstallationID ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentFieldValue ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case filessemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentRecordID ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case bulkingestsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentObjectID ||
			component == commonsemantic.InvalidComponentRecordID ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentFieldValue ||
			component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case commandsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case externaleffectsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case outboundintentsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case mailboxauthorizationsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case permissionsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case listviewsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentObjectID ||
			component == commonsemantic.InvalidComponentSavedViewID ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case permissionadminsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case permissionauthoringsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandID ||
			component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case analyticsauthoringsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandID ||
			component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentRecordID ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case resourceaccesssemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandID ||
			component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case layoutauthoringsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandID ||
			component == commonsemantic.InvalidComponentObjectID ||
			component == commonsemantic.InvalidComponentRecordID ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentFieldValue ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case navigationsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentOperation || component == commonsemantic.InvalidComponentDeadline || component == commonsemantic.InvalidComponentResponse
	case layoutauthoringv2semantic.CapabilityName:
		return component == commonsemantic.InvalidComponentCommandData ||
			component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentFieldValue ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case metadataadminsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	case pagelayoutresolutionsemantic.CapabilityName:
		return component == commonsemantic.InvalidComponentOperation ||
			component == commonsemantic.InvalidComponentDeadline ||
			component == commonsemantic.InvalidComponentResponse
	default:
		return false
	}
}

func validPlatformLimit(capability string, kind commonsemantic.LimitKind, maximum uint64) bool {
	if kind == commonsemantic.LimitAdmission {
		return true
	}
	switch capability {
	case approvalsemantic.ExecuteCapabilityName, approvalsemantic.ReadCapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == approvalsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == approvalsemantic.MaxSemanticResponseBytes)
	case approvalnotificationsemantic.CapabilityName:
		return (kind == commonsemantic.LimitRecordCount && maximum == approvalnotificationsemantic.MaxFlows) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == approvalnotificationsemantic.MaxSemanticResponseBytes)
	case auditsemantic.CapabilityName:
		return (kind == commonsemantic.LimitRecordCount && maximum == auditsemantic.MaxRows) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == auditsemantic.MaxSemanticResponseBytes)
	case catalogsemantic.AppMetadataCapabilityName,
		catalogsemantic.AppMetadataV2CapabilityName,
		catalogsemantic.IntegrationBindingCapabilityName:
		return kind == commonsemantic.LimitSemanticResponse &&
			maximum == catalogsemantic.MaxSemanticResponseBytes
	case catalogsemantic.AppMetadataV3CapabilityName:
		return kind == commonsemantic.LimitSemanticResponse &&
			maximum == catalogsemantic.MaxAppMetadataV3SemanticResponseBytes
	case searchsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == searchsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == searchsemantic.MaxSemanticResponseBytes)
	case flowsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == flowsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == flowsemantic.MaxSemanticResponseBytes)
	case reportsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == reportsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == reportsemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitQueryOffset && maximum == reportsemantic.MaxOffset)
	case sessionsemantic.CapabilityName:
		return (kind == commonsemantic.LimitAppInstallationID && maximum == sessionsemantic.MaxIdentifierBytes) ||
			(kind == commonsemantic.LimitOperationCount && maximum == sessionsemantic.MaxDocumentLinkRoutes)
	case filessemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == filessemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == filessemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitWireFrame && maximum == filessemantic.MaxChunkBytes)
	case bulkingestsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == bulkingestsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitUploadBytes && maximum == bulkingestsemantic.MaxUploadBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == bulkingestsemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitWireFrame && maximum == bulkingestsemantic.MaxChunkBytes)
	case commandsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == commandsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == commandsemantic.MaxSemanticResponseBytes)
	case externaleffectsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == externaleffectsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == externaleffectsemantic.MaxSemanticResponseBytes)
	case outboundintentsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == outboundintentsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == outboundintentsemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitWireFrame && maximum == envelope.MaxResponseWireBytes)
	case mailboxauthorizationsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == mailboxauthorizationsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == mailboxauthorizationsemantic.MaxSemanticResponseBytes)
	case permissionsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == permissionsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == permissionsemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitOperationCount && (maximum == permissionsemantic.MaxSystemPermissions ||
				maximum == permissionsemantic.MaxCustomPermissions ||
				maximum == permissionsemantic.MaxObjectPermissions ||
				maximum == permissionsemantic.MaxApplicationPermissions ||
				maximum == permissionsemantic.MaxNavigationPermissions ||
				maximum == permissionsemantic.MaxRecordTypePermissions)) ||
			(kind == commonsemantic.LimitFieldCount && maximum == permissionsemantic.MaxFieldPermissions)
	case listviewsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == listviewsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == listviewsemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitFieldCount && maximum == listviewsemantic.MaxFields)
	case permissionadminsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == permissionadminsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == permissionadminsemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitOperationCount && maximum == permissionadminsemantic.MaxGrants) ||
			(kind == commonsemantic.LimitWireFrame && maximum == envelope.MaxRequestWireBytes)
	case permissionauthoringsemantic.CapabilityName:
		return (kind == commonsemantic.LimitCommandID && maximum == permissionauthoringsemantic.MaxCommandIdentifierBytes) ||
			(kind == commonsemantic.LimitSemanticRequest && maximum == permissionauthoringsemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && (maximum == permissionauthoringsemantic.MaxSemanticResponseBytes ||
				maximum == permissionauthoringsemantic.MaxSnapshotResponseBytes)) ||
			(kind == commonsemantic.LimitOperationCount && (maximum == permissionauthoringsemantic.MaxSystemChanges ||
				maximum == permissionauthoringsemantic.MaxCustomChanges ||
				maximum == permissionauthoringsemantic.MaxObjectChanges ||
				maximum == permissionauthoringsemantic.MaxRecordTypeChanges)) ||
			(kind == commonsemantic.LimitFieldCount && maximum == permissionauthoringsemantic.MaxFieldChanges) ||
			(kind == commonsemantic.LimitWireFrame && maximum == envelope.MaxRequestWireBytes)
	case analyticsauthoringsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && (maximum == analyticsauthoringsemantic.MaxSemanticRequestBytes || maximum == analyticsauthoringsemantic.MaxDefinitionBytes)) ||
			(kind == commonsemantic.LimitOperationCount && (maximum == analyticsauthoringsemantic.MaxDashboardComponents ||
				maximum == analyticsauthoringsemantic.MaxReportDefinitionEntries)) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == analyticsauthoringsemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitWireFrame && maximum == envelope.MaxRequestWireBytes)
	case resourceaccesssemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == resourceaccesssemantic.MaxSemanticRequestBytes) ||
			(kind == commonsemantic.LimitSemanticResponse && maximum == resourceaccesssemantic.MaxSemanticResponseBytes) ||
			(kind == commonsemantic.LimitOperationCount && (maximum == resourceaccesssemantic.MaxGrants ||
				maximum == resourceaccesssemantic.MaxOwnershipTransferResources)) ||
			(kind == commonsemantic.LimitWireFrame && maximum == envelope.MaxRequestWireBytes)
	case layoutauthoringsemantic.CapabilityName:
		return validLayoutAuthoringLimit(kind, maximum)
	case navigationsemantic.CapabilityName:
		return (kind == commonsemantic.LimitSemanticRequest && maximum == navigationsemantic.MaxSemanticRequestBytes) || (kind == commonsemantic.LimitSemanticResponse && maximum == navigationsemantic.MaxSemanticResponseBytes) || (kind == commonsemantic.LimitWireFrame && maximum == envelope.MaxRequestWireBytes)
	case layoutauthoringv2semantic.CapabilityName:
		return validLayoutAuthoringV2Limit(kind, maximum)
	case metadataadminsemantic.CapabilityName:
		return (kind == commonsemantic.LimitRecordCount &&
			(maximum == metadataadminsemantic.MaxObjects ||
				maximum == metadataadminsemantic.MaxLayoutsPerObject ||
				maximum == metadataadminsemantic.MaxAssignmentsPerObject ||
				maximum == metadataadminsemantic.MaxValidationRulesPerObject ||
				maximum == metadataadminsemantic.MaxRecordSetBindingsPerRule ||
				maximum == metadataadminsemantic.MaxRecordSetFiltersPerBinding ||
				maximum == metadataadminsemantic.MaxValidationRuleProjectionEntries)) ||
			(kind == commonsemantic.LimitSemanticResponse &&
				(maximum == metadataadminsemantic.MaxStoredDocumentBytes ||
					maximum == metadataadminsemantic.MaxFilterValueBytes ||
					maximum == metadataadminsemantic.MaxSemanticResponseBytes))
	case pagelayoutresolutionsemantic.CapabilityName:
		return (kind == commonsemantic.LimitRecordCount &&
			(maximum == pagelayoutresolutionsemantic.MaxRecordTypeSelectors ||
				maximum == pagelayoutresolutionsemantic.MaxObjectSelectors ||
				maximum == pagelayoutresolutionsemantic.MaxRelatedListResolutions ||
				maximum == pagelayoutresolutionsemantic.MaxPrefillMappingsPerResolution ||
				maximum == pagelayoutresolutionsemantic.MaxResolutionProjectionEntries)) ||
			(kind == commonsemantic.LimitFieldCount &&
				(maximum == pagelayoutresolutionsemantic.MaxListFieldsPerObject ||
					maximum == pagelayoutresolutionsemantic.MaxResolutionProjectionEntries)) ||
			(kind == commonsemantic.LimitSemanticResponse &&
				(maximum == pagelayoutresolutionsemantic.MaxLayoutDocumentBytes ||
					maximum == pagelayoutresolutionsemantic.MaxSemanticResponseBytes)) ||
			(kind == commonsemantic.LimitWireFrame && maximum == envelope.MaxRequestWireBytes)
	default:
		return false
	}
}

func validLayoutAuthoringV2Limit(kind commonsemantic.LimitKind, maximum uint64) bool {
	switch kind {
	case commonsemantic.LimitSemanticRequest:
		return maximum == layoutauthoringv2semantic.MaxSemanticRequestBytes ||
			maximum == layoutauthoringsemantic.MaxLayoutDocumentSemanticBytes
	case commonsemantic.LimitSemanticResponse:
		return maximum == layoutauthoringv2semantic.MaxSemanticResponseBytes
	case commonsemantic.LimitWireFrame:
		return maximum == envelope.MaxRequestWireBytes
	case commonsemantic.LimitRecordCount:
		return maximum == metadataadminsemantic.MaxLayoutsPerObject ||
			maximum == metadataadminsemantic.MaxAssignmentsPerObject
	case commonsemantic.LimitFieldCount:
		return maximum == historysemantic.HistoryResultColumnCount || validLayoutAuthoringLimit(kind, maximum)
	case commonsemantic.LimitOperationCount:
		return maximum == layoutauthoringv2semantic.MaxHistoryRelatedListProjections || validLayoutAuthoringLimit(kind, maximum)
	case commonsemantic.LimitQueryDepth:
		return validLayoutAuthoringLimit(kind, maximum)
	default:
		return false
	}
}

func validLayoutAuthoringLimit(kind commonsemantic.LimitKind, maximum uint64) bool {
	switch kind {
	case commonsemantic.LimitSemanticRequest:
		return maximum == layoutauthoringsemantic.MaxLayoutDocumentSemanticBytes ||
			maximum == layoutauthoringsemantic.MaxSemanticRequestBytes
	case commonsemantic.LimitSemanticResponse:
		return maximum == layoutauthoringsemantic.MaxSemanticResponseBytes
	case commonsemantic.LimitWireFrame:
		return maximum == envelope.MaxRequestWireBytes
	case commonsemantic.LimitCommandID:
		return maximum == layoutauthoringsemantic.MaxCommandIdentifierBytes
	case commonsemantic.LimitQueryDepth:
		return maximum == layoutauthoringsemantic.MaxValueDepth
	case commonsemantic.LimitRecordCount:
		return maximum == layoutauthoringsemantic.MaxWorkspaceLayouts ||
			maximum == layoutauthoringsemantic.MaxWorkspaceAssignments
	case commonsemantic.LimitFieldCount:
		return maximum == layoutauthoringsemantic.MaxCompactFields ||
			maximum == layoutauthoringsemantic.MaxFieldsPerSection ||
			maximum == layoutauthoringsemantic.MaxFieldLabelsPerSection ||
			maximum == layoutauthoringsemantic.MaxFieldBehaviorGroupsPerSection ||
			maximum == layoutauthoringsemantic.MaxFieldBehaviorsPerField ||
			maximum == layoutauthoringsemantic.MaxFieldBehaviorsPerSection ||
			maximum == layoutauthoringsemantic.MaxFieldBehaviorNodesPerDocument ||
			maximum == layoutauthoringsemantic.MaxFieldsPerRelatedList ||
			maximum == layoutauthoringsemantic.MaxPrefillMappings ||
			maximum == layoutauthoringsemantic.MaxListFields
	case commonsemantic.LimitOperationCount:
		return maximum == layoutauthoringsemantic.MaxValueNodes ||
			maximum == layoutauthoringsemantic.MaxValueCollections ||
			maximum == layoutauthoringsemantic.MaxValueCollectionEntries ||
			maximum == layoutauthoringsemantic.MaxTabs ||
			maximum == layoutauthoringsemantic.MaxSections ||
			maximum == layoutauthoringsemantic.MaxRelatedLists ||
			maximum == layoutauthoringsemantic.MaxRecordPanels ||
			maximum == layoutauthoringsemantic.MaxConfigurationEntries ||
			maximum == layoutauthoringsemantic.MaxActionsPerPlacement ||
			maximum == layoutauthoringsemantic.MaxActionExtensions ||
			maximum == layoutauthoringsemantic.MaxRecordStates ||
			maximum == layoutauthoringsemantic.MaxRecordStateLinks ||
			maximum == layoutauthoringsemantic.MaxRecordStateActionOverrides ||
			maximum == layoutauthoringsemantic.MaxPrimaryHeaderActions
	default:
		return false
	}
}
