package mapping

import (
	commonsemantic "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/commonv1"
	commonv1 "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/common/v1"
)

type wireStringBudget struct {
	remaining int
}

func newWireStringBudget(maximum int) wireStringBudget {
	return wireStringBudget{remaining: maximum}
}

func (budget *wireStringBudget) take(values ...string) bool {
	if budget == nil {
		return false
	}
	for _, value := range values {
		if len(value) > budget.remaining {
			return false
		}
		budget.remaining -= len(value)
	}
	return true
}

func (budget *wireStringBudget) takeOptional(value *string) bool {
	return value == nil || budget.take(*value)
}

// takeValidatedReceiptBytes performs byte accounting only. Every caller must
// first pass the receipt through fromWireReceipts, the sole compatibility and
// error-classification owner.
func (budget *wireStringBudget) takeValidatedReceiptBytes(receipts *commonv1.ConsistencyReceipts) bool {
	return budget.take(receipts.CapabilityVersion.Name)
}

func platformLimitFailure(kind commonsemantic.LimitKind, maximum int) *commonsemantic.Failure {
	return &commonsemantic.Failure{
		Category:  commonsemantic.FailureResourceExhausted,
		LimitKind: kind,
		Maximum:   uint64(maximum),
	}
}
