#!/bin/sh
# script/fmt-check: check formatting (read-only).
set -eu

ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"

# Must match the pin in script/bootstrap.
NODE_VERSION="22.17.0"

# script/bootstrap installs node and yarn under nvm and leaves neither
# on the PATH of the shell that called it, so resolve the pinned
# toolchain here the way bootstrap's own install step does. nvm is a
# bash script, hence the subshell.
run_yarn() {
    if command -v yarn >/dev/null 2>&1; then
        exec yarn "$@"
    fi
    if [ ! -s "$HOME/.nvm/nvm.sh" ]; then
        echo "fmt-check: no yarn; run script/bootstrap first" >&2
        exit 1
    fi
    exec bash -c '. "$HOME/.nvm/nvm.sh" && nvm use "$1" >/dev/null &&
        shift && exec yarn "$@"' bash "$NODE_VERSION" "$@"
}

main() {
    cd "$ROOT"
    status=0

    # gofmt and prettier both run every time, so the output names each
    # one that fails. Under set -e a bare assignment would end the
    # script when gofmt fails (a Go file it cannot parse).
    if ! files="$(gofmt -s -l .)"; then
        echo "gofmt: failed; see its errors above" >&2
        status=1
    fi
    if [ -n "$files" ]; then
        echo "gofmt: files not formatted:" >&2
        echo "$files" >&2
        status=1
    fi

    # run_yarn ends in exec; the subshell returns here afterwards.
    (run_yarn run prettier --check '**/*.md' --tab-width 4 --prose-wrap always) ||
        status=1

    exit "$status"
}

main "$@"
