#!/bin/sh
# Dynamically backport Go 1.24/1.25 syntax to Go 1.22 for RHEL builds

# Downgrade metadata
sed -i 's/^go 1.2[3-6]/go 1.22/' go.mod
find vendor -name "go.mod" -exec sed -i 's/^go 1.2[3-6]/go 1.22/g' {} + 2>/dev/null
[ -f vendor/modules.txt ] && sed -i 's/^## explicit.*/## explicit; go 1.22/' vendor/modules.txt
[ -f vendor/modules.txt ] && sed -i '/## go >=/d' vendor/modules.txt

# Helper for global fixes
run_global_sed() {
    find . -name "*.go" -exec sed -i "$1" {} +
}

# Helper for restricted fixes (skips vendor/ and perf_linux.go for safety)
run_restricted_sed() {
    find . \( -type d -path "./vendor" -o -name "perf_linux.go" \) -prune -o -name "*.go" -exec sed -i "$1" {} +
}

# Rename Go 1.24 iterator functions to standard Go 1.22 slices
run_global_sed '
    s/strings\.SplitSeq/strings\.Split/g;
    s/bytes\.SplitSeq/bytes\.Split/g;
    s/strings\.FieldsSeq/strings\.Fields/g;
'

# Catch-all for any variable iterating over those specific inline function calls
run_global_sed '
    s/for \([a-zA-Z0-9_]*\) := range strings\.Split/for _, \1 := range strings\.Split/g;
    s/for \([a-zA-Z0-9_]*\) := range strings\.Fields/for _, \1 := range strings\.Fields/g;
    s/for \([a-zA-Z0-9_]*\) := range bytes\.Split/for _, \1 := range bytes\.Split/g;
'

# Fix detached range over slice logic where variable is intended to be the value.
run_restricted_sed '
    s/for line := range /for _, line := range /g;
    s/for g := range /for _, g := range /g;
    s/for master := range /for _, master := range /g;
    s/for slave := range /for _, slave := range /g;
    s/for mode := range /for _, mode := range /g;
    s/for ptype := range /for _, ptype := range /g;
    s/for block := range /for _, block := range /g;
    s/for mountOptions := range /for _, mountOptions := range /g;
    s/for subset := range /for _, subset := range /g;
'
