package permissionstatev1

type FailureCategory string

const (
	// FailureInvalidValue classifies a structurally invalid contract value.
	FailureInvalidValue FailureCategory = "INVALID_VALUE"
	// FailureIncomparableLineage classifies an attempted cross-lineage ordering.
	FailureIncomparableLineage FailureCategory = "INCOMPARABLE_LINEAGE"
	// FailureStaleSnapshot classifies a valid snapshot older than its required floor.
	FailureStaleSnapshot FailureCategory = "STALE_SNAPSHOT"
	// FailureAuthorityUnavailable classifies inability to establish current authority.
	FailureAuthorityUnavailable FailureCategory = "AUTHORITY_UNAVAILABLE"
)

// Valid reports whether category is part of the closed v1 classification.
func (category FailureCategory) Valid() bool {
	switch category {
	case FailureInvalidValue, FailureIncomparableLineage,
		FailureStaleSnapshot, FailureAuthorityUnavailable:
		return true
	default:
		return false
	}
}

// Failure carries a neutral classification only. Implementations retain
// internal causes, SQL details, credentials, and topology outside this value.
type Failure struct {
	Category FailureCategory
}

func (failure *Failure) Error() string {
	if failure == nil {
		return ""
	}
	return string(failure.Category)
}

func invalidValue() *Failure {
	return &Failure{Category: FailureInvalidValue}
}

func incomparableLineage() *Failure {
	return &Failure{Category: FailureIncomparableLineage}
}
