package engine import ( "path" "strings" "aiaa-notification-service/internal/model" ) // PickEventRule selects the best enabled rule for an event. // Exact event wins; otherwise glob patterns (* and ?) via path.Match. // Among globs, more literal characters win; ties go to the smaller ID. func PickEventRule(event string, rules []model.Rule) *model.Rule { var exact *model.Rule var best *model.Rule bestScore := -1 for i := range rules { r := &rules[i] if r.Enabled == 0 { continue } if r.Event == event { if exact == nil || r.ID < exact.ID { exact = r } continue } if !strings.ContainsAny(r.Event, "*?") { continue } ok, err := path.Match(r.Event, event) if err != nil || !ok { continue } score := globSpecificity(r.Event) if score > bestScore || (score == bestScore && (best == nil || r.ID < best.ID)) { bestScore = score best = r } } if exact != nil { return exact } return best } func globSpecificity(pattern string) int { n := 0 for _, r := range pattern { if r != '*' && r != '?' { n++ } } return n }