package pipeline import "strings" // AutoSpanForHint returns a suggested refinement span based on the candidate hint. // It is intentionally conservative: spans are wide enough for robust demod/classify, // but not so wide that refinement becomes wasteful. func AutoSpanForHint(hint string) (float64, string) { h := strings.ToLower(hint) switch { case strings.Contains(h, "wfm"): return 200000, "auto:wfm" case strings.Contains(h, "nfm"): return 18000, "auto:nfm" case strings.Contains(h, "usb") || strings.Contains(h, "lsb") || strings.Contains(h, "ssb"): return 6000, "auto:ssb" case strings.Contains(h, "cw"): return 500, "auto:cw" case strings.Contains(h, "dmr") || strings.Contains(h, "d-star") || strings.Contains(h, "dstar"): return 15000, "auto:dig_voice" case strings.Contains(h, "ft8") || strings.Contains(h, "wspr"): return 4000, "auto:dig_weak" case strings.Contains(h, "fsk") || strings.Contains(h, "psk"): return 6000, "auto:dig" case strings.Contains(h, "am"): return 12000, "auto:am" default: return 0, "" } }