package pipeline import ( "strings" ) const ( PriorityTierCritical = "critical" PriorityTierHigh = "high" PriorityTierMedium = "medium" PriorityTierLow = "low" PriorityTierBackground = "background" ) const ( AdmissionClassPlanned = "plan" AdmissionClassAdmit = "admit" AdmissionClassHold = "hold" AdmissionClassDefer = "defer" AdmissionClassDisplace = "displace" AdmissionClassDrop = "drop" ) type PriorityAdmission struct { Tier string `json:"tier,omitempty"` Class string `json:"class,omitempty"` Score float64 `json:"score,omitempty"` Cutoff float64 `json:"cutoff,omitempty"` Basis string `json:"basis,omitempty"` Reason string `json:"reason,omitempty"` } func PriorityTierFromRange(score, min, max float64) string { if max <= min { return PriorityTierHigh } norm := (score - min) / (max - min) switch { case norm >= 0.85: return PriorityTierCritical case norm >= 0.65: return PriorityTierHigh case norm >= 0.45: return PriorityTierMedium case norm >= 0.25: return PriorityTierLow default: return PriorityTierBackground } } func priorityTierRank(tier string) int { switch tier { case PriorityTierCritical: return 4 case PriorityTierHigh: return 3 case PriorityTierMedium: return 2 case PriorityTierLow: return 1 default: return 0 } } func admissionReason(base string, policy Policy, holdPolicy HoldPolicy, extras ...string) string { tags := uniqueReasonTags(policy, holdPolicy, extras...) if len(tags) == 0 { return base } return base + ":" + strings.Join(tags, ":") } func uniqueReasonTags(policy Policy, holdPolicy HoldPolicy, extras ...string) []string { seen := map[string]struct{}{} tags := make([]string, 0, 6) add := func(tag string) { if tag == "" { return } if _, ok := seen[tag]; ok { return } seen[tag] = struct{}{} tags = append(tags, tag) } if policy.Profile != "" { add("profile:" + slugToken(policy.Profile)) } if policy.Intent != "" { add("intent:" + slugToken(policy.Intent)) } if policy.RefinementStrategy != "" { add("strategy:" + slugToken(policy.RefinementStrategy)) } for _, reason := range holdPolicy.Reasons { add(reason) } for _, extra := range extras { add(extra) } return tags } func slugToken(input string) string { input = strings.TrimSpace(strings.ToLower(input)) if input == "" { return "" } parts := strings.Fields(input) return strings.Join(parts, "-") }