package recordsv1

import common "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/commonv1"

type FailureCategory = common.FailureCategory

const (
	FailureInvalidRequest    = common.FailureInvalidRequest
	FailureUnauthenticated   = common.FailureUnauthenticated
	FailureForbidden         = common.FailureForbidden
	FailureMissing           = common.FailureMissing
	FailureCanceled          = common.FailureCanceled
	FailureDeadlineExceeded  = common.FailureDeadlineExceeded
	FailureResourceExhausted = common.FailureResourceExhausted
	FailureIncompatible      = common.FailureIncompatible
	FailureStaleState        = common.FailureStaleState
	FailureUnavailable       = common.FailureUnavailable
	FailureInternal          = common.FailureInternal
)

type InvalidComponent = common.InvalidComponent

const (
	InvalidComponentUnspecified = common.InvalidComponentUnspecified
	InvalidComponentObjectID    = common.InvalidComponentObjectID
	InvalidComponentRecordID    = common.InvalidComponentRecordID
	InvalidComponentField       = common.InvalidComponentField
	InvalidComponentDeadline    = common.InvalidComponentDeadline
	InvalidComponentResponse    = common.InvalidComponentResponse
)

type LimitKind = common.LimitKind

const (
	LimitSelectedFields   = common.LimitSelectedFields
	LimitSemanticRequest  = common.LimitSemanticRequest
	LimitSemanticResponse = common.LimitSemanticResponse
	LimitObjectID         = common.LimitObjectID
	LimitFieldID          = common.LimitFieldID
	LimitRecordID         = common.LimitRecordID
	LimitAdmission        = common.LimitAdmission
)

type StaleAxis = common.StaleAxis

const (
	StaleAxisCatalog  = common.StaleAxisCatalog
	StaleAxisSecurity = common.StaleAxisSecurity
)

type Failure = common.Failure

func invalid(component InvalidComponent, canonicalField string) *Failure {
	return &Failure{Category: FailureInvalidRequest, InvalidComponent: component, CanonicalField: canonicalField}
}

func exhausted(kind LimitKind, maximum uint64) *Failure {
	return &Failure{Category: FailureResourceExhausted, LimitKind: kind, Maximum: maximum}
}

func incompatible() *Failure {
	return &Failure{
		Category: FailureIncompatible, RequiredCapability: CapabilityName,
		SupportedMajor: ProtocolMajor, SupportedMinorMin: ProtocolMinor, SupportedMinorMax: ProtocolMinor,
	}
}
