#!/usr/bin/env zsh
# Собирает агент NetBird для macOS 10.15 и 11 на Intel: официальные сборки на Go 1.25 и новее там не запускаются, причина и заплатка — в scripts/nb_macos_legacy_patch_go.py.
# Флаги и Go — как у официальной сборки (.goreleaser.yaml NetBird, toolchain в go.mod); сверх неё заплатка тулчейна и -trimpath.
# После сборки: файл залить на d.dsa.one рядом с этим скриптом под именем из LEGACY_URL, версию и sha256 вписать в LEGACY_* в install-netbird-legacy.sh там же.
#
#   zsh nb_macos_legacy_build.zsh 0.80.0
set -euo pipefail

NB=${1:?версия NetBird, например 0.79.0}
HERE=${0:A:h}
WORK=$HOME/.cache/nb_macos_legacy
SRC=$WORK/netbird-$NB
OUT=$WORK/netbird-$NB-dsa-darwin-amd64
mkdir -p $WORK

step() { print "  -> $1" }

step "исходники NetBird v$NB — $SRC"
[[ -d $SRC ]] || git clone -q --depth 1 --branch v$NB https://github.com/netbirdio/netbird $SRC
GOVER=$(awk '$1 == "toolchain" {sub(/^go/, "", $2); print $2}' $SRC/go.mod)
[[ -n $GOVER ]] || { print -u2 "в $SRC/go.mod нет строки toolchain"; exit 1 }

GOROOT=$WORK/go$GOVER
if [[ ! -x $GOROOT/bin/go ]]; then
    step "скачиваю Go $GOVER"
    arch=$(uname -m); [[ $arch == x86_64 ]] && arch=amd64
    tgz=go$GOVER.darwin-$arch.tar.gz
    sha=$(curl -fsSL 'https://go.dev/dl/?mode=json&include=all' | python3 -c "import json,sys; print(next(f['sha256'] for r in json.load(sys.stdin) for f in r['files'] if f['filename'] == '$tgz'))")
    curl -fsSL -o $WORK/$tgz https://go.dev/dl/$tgz
    [[ $(shasum -a 256 $WORK/$tgz | awk '{print $1}') == $sha ]] || { print -u2 "sha256 $tgz не совпал с go.dev"; exit 1 }
    rm -rf $GOROOT.tmp && mkdir $GOROOT.tmp
    tar -xzf $WORK/$tgz -C $GOROOT.tmp
    mv $GOROOT.tmp/go $GOROOT && rmdir $GOROOT.tmp
fi

step "накладываю заплатку на Go $GOVER"
python3 $HERE/nb_macos_legacy_patch_go.py $GOROOT
export GOROOT GOTOOLCHAIN=local GOPATH=$WORK/gopath GOMODCACHE=$WORK/gomod GOCACHE=$WORK/gocache
# Линкер лежит в тулчейне готовым бинарником — после заплатки его исходника пересобираем, стандартная библиотека собирается из исходников сама.
step "пересобираю линкер Go"
$GOROOT/bin/go install cmd/link

step "собираю агент NetBird $NB под darwin/amd64"
GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 $GOROOT/bin/go build -C $SRC/client -trimpath -tags load_wgnt_from_rsrc \
    -ldflags "-s -w -X github.com/netbirdio/netbird/version.version=$NB" -o $OUT .

step "проверяю бинарник: минимальная macOS и вызов SecTrustCopyCertificateChain"
minos=$(otool -l $OUT | awk '/LC_BUILD_VERSION/ {f=1} f && $1 == "minos" {print $2; exit}')
[[ $minos == 10.15 ]] || { print -u2 "в $OUT минимальная macOS $minos вместо 10.15 — заплатка линкера не сработала"; exit 1 }
nm -u $OUT | grep -q SecTrustCopyCertificateChain && { print -u2 "в $OUT остался вызов SecTrustCopyCertificateChain — заплатка crypto/x509 не сработала"; exit 1 }

print "Готово: $OUT"
print "sha256: $(shasum -a 256 $OUT | awk '{print $1}')"
