package tools

import "time"

// BehaviorSeverity qualifies the gravity of a peer misbehavior.
type BehaviorSeverity int

const (
	// BehaviorWarn: minor inconsistency — slight trust penalty.
	BehaviorWarn BehaviorSeverity = iota
	// BehaviorFraud: deliberate data manipulation (e.g. fake peerless Ref,
	// invalid booking) — significant trust penalty.
	BehaviorFraud
	// BehaviorCritical: severe abuse (secret exfiltration, data corruption,
	// system-level attack) — heavy penalty, near-immediate blacklist.
	BehaviorCritical
)

// scorePenalties maps each severity to a trust-score deduction (out of 100).
var scorePenalties = map[BehaviorSeverity]float64{
	BehaviorWarn:     5,
	BehaviorFraud:    20,
	BehaviorCritical: 40,
}

// Penalty returns the trust-score deduction for this severity.
func (s BehaviorSeverity) Penalty() float64 {
	if p, ok := scorePenalties[s]; ok {
		return p
	}
	return 5
}

// PeerBehaviorReport is the payload carried by PEER_BEHAVIOR_EVENT.
// Any trusted service can emit it; oc-discovery is the sole consumer.
type PeerBehaviorReport struct {
	// ReporterApp identifies the emitting service (e.g. "oc-scheduler", "oc-datacenter").
	ReporterApp string `json:"reporter_app"`
	// TargetPeerID is the MongoDB DID (_id) of the offending peer.
	TargetPeerID string `json:"target_peer_id"`
	// Severity drives how much the trust score drops.
	Severity BehaviorSeverity `json:"severity"`
	// Reason is a human-readable description shown in the blacklist warning.
	Reason string `json:"reason"`
	// Evidence is an optional reference (booking ID, resource Ref, …).
	Evidence string `json:"evidence,omitempty"`
	// At is the timestamp of the observed misbehavior.
	At time.Time `json:"at"`
}
