#!/bin/sh

# Verify pgfplots-autonode without LuaCoolProp or CoolProp.  With a TDS archive
# argument, every runtime file must resolve from that isolated installation.

set -eu

fail()
{
    printf 'error: %s\n' "$*" >&2
    exit 1
}

need_command()
{
    command -v "$1" >/dev/null 2>&1 \
        || fail "required command not found: $1"
}

[ "$#" -le 1 ] || fail "usage: $0 [pgfplots-autonode.tds.zip]"
for command_name in awk context cp dirname grep kpsewhich lualatex luatex \
    mkdir mktemp rm tail texlua unzip; do
    need_command "$command_name"
done
SCRIPT_DIR=$(CDPATH= cd -P "$(dirname "$0")" && pwd)
PROJECT_DIR=$(CDPATH= cd -P "$SCRIPT_DIR/.." && pwd)
TEMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/pgfplots-autonode-test.XXXXXX")
cleanup()
{
    rm -rf "$TEMP_DIR"
}
trap cleanup 0
trap 'exit 1' HUP INT TERM

TEXMF_TREE=$TEMP_DIR/texmf
WORK_DIR=$TEMP_DIR/work
LOG_DIR=$TEMP_DIR/logs
mkdir -p "$TEXMF_TREE" "$WORK_DIR" "$LOG_DIR"
TEXMF_TREE=$(CDPATH= cd -P "$TEXMF_TREE" && pwd) \
    || fail "could not canonicalize the isolated TEXMF tree"
WORK_DIR=$(CDPATH= cd -P "$WORK_DIR" && pwd) \
    || fail "could not canonicalize the isolated work directory"

if [ "$#" -eq 1 ]; then
    ARCHIVE_DIR=$(CDPATH= cd -P "$(dirname "$1")" && pwd)
    ARCHIVE=$ARCHIVE_DIR/${1##*/}
    [ -f "$ARCHIVE" ] || fail "TDS archive not found: $ARCHIVE"
    [ "${ARCHIVE##*/}" = pgfplots-autonode.tds.zip ] \
        || fail "archive must be named pgfplots-autonode.tds.zip"
    unzip -q "$ARCHIVE" -d "$TEXMF_TREE"
else
    mkdir -p "$TEXMF_TREE/tex/generic/pgfplots-autonode" \
        "$TEXMF_TREE/tex/latex/pgfplots-autonode" \
        "$TEXMF_TREE/tex/luatex/pgfplots-autonode"
    cp "$PROJECT_DIR/pgflibrarypgfplots.autonode.code.tex" \
        "$PROJECT_DIR/pgfplots-autonode.code.tex" \
        "$TEXMF_TREE/tex/generic/pgfplots-autonode/"
    cp "$PROJECT_DIR/pgfplots-autonode.sty" \
        "$TEXMF_TREE/tex/latex/pgfplots-autonode/"
    cp "$PROJECT_DIR/pgfplots-autonode.lua" \
        "$TEXMF_TREE/tex/luatex/pgfplots-autonode/"
fi

for fixture in autonode autonode-missing-hook autonode-multi-axis \
    autonode-node-geometry autonode-viewport; do
    cp "$PROJECT_DIR/tests/tds/$fixture.tex" "$WORK_DIR/$fixture.tex"
done
cp "$PROJECT_DIR/tests/test-pgfplots-autonode.lua" "$WORK_DIR/"

TEXMFHOME=$TEXMF_TREE
TEXMFCACHE=$TEMP_DIR/cache
export TEXMFHOME TEXMFCACHE
unset TEXINPUTS LUAINPUTS LUACOOLPROP_LIB TEXMFVAR TEXMFCONFIG
mkdir -p "$TEXMFCACHE"

for installed_file in pgfplots-autonode.sty \
    pgflibrarypgfplots.autonode.code.tex pgfplots-autonode.lua; do
    resolved=$(CDPATH= cd -P "$WORK_DIR" && kpsewhich "$installed_file") \
        || fail "kpathsea did not find $installed_file"
    case $resolved in
        "$TEXMF_TREE"/*) ;;
        *) fail "$installed_file resolved outside the isolated tree: $resolved" ;;
    esac
done

(CDPATH= cd -P "$WORK_DIR" && texlua test-pgfplots-autonode.lua) \
    >"$LOG_DIR/lua.log" 2>&1 \
    || { tail -n 20 "$LOG_DIR/lua.log" >&2; fail "autonode Lua tests failed"; }

run_latex_fixture()
{
    fixture=$1
    log=$LOG_DIR/$fixture.log
    (CDPATH= cd -P "$WORK_DIR" && lualatex --interaction=nonstopmode \
        --halt-on-error --file-line-error "$fixture.tex") >"$log" 2>&1 \
        || { tail -n 20 "$log" >&2; fail "LuaLaTeX failed for $fixture"; }
}

for fixture in autonode autonode-multi-axis autonode-node-geometry \
    autonode-viewport; do
    run_latex_fixture "$fixture"
    if [ "$fixture" != autonode-viewport ] && \
        grep -F 'pgfplots-autonode warning:' "$LOG_DIR/$fixture.log" \
            >/dev/null 2>&1; then
        fail "$fixture reported an unexpected autonode warning"
    fi
    grep -F 'pgfplots-autonode: final status:' "$LOG_DIR/$fixture.log" \
        >/dev/null || fail "$fixture did not run the autonode solver"
done

solve_count=$(awk '/pgfplots-autonode: solve:/ { count++ }
  END { print count + 0 }' "$LOG_DIR/autonode-multi-axis.log")
[ "$solve_count" -eq 2 ] \
    || fail "multi-axis fixture expected two independent solves (got $solve_count)"
awk '
  /final status: overlaps=0 outside=0 hidden=0/ { status++ }
  /final label #1: pos=/ { first++ }
  /final label #2:/ { stale++ }
  END { exit !(status == 2 && first == 2 && stale == 0) }
' "$LOG_DIR/autonode-multi-axis.log" \
    || fail "autonode did not reset between consecutive axes"
awk '
  /final status: overlaps=0 outside=0 hidden=0/ { status = 1 }
  /final label #1: pos=/ { first = 1 }
  /final label #2: pos=/ { second = 1 }
  END { exit !(status && first && second) }
' "$LOG_DIR/autonode-node-geometry.log" \
    || fail "measured-node geometry fixture failed"
awk '
  /final status: overlaps=0 outside=0 hidden=1/ { status = 1 }
  /final label #1: pos=/ { crossing = 1 }
  /final label #2: pos=/ { inside = 1 }
  /final label #3: hidden/ { hidden = 1 }
  END { exit !(status && crossing && inside && hidden) }
' "$LOG_DIR/autonode-viewport.log" \
    || fail "visible-path sampling or hard axis-border constraint failed"
viewport_warning_count=$(awk '/^pgfplots-autonode warning:/ { count++ }
  END { print count + 0 }' "$LOG_DIR/autonode-viewport.log")
[ "$viewport_warning_count" -eq 1 ] \
    || fail "viewport fixture expected one deliberate hidden-label warning (got $viewport_warning_count)"
run_latex_fixture autonode-missing-hook
missing_count=$(awk '/label registered without/ { count++ }
  END { print count + 0 }' "$LOG_DIR/autonode-missing-hook.log")
[ "$missing_count" -eq 1 ] \
    || fail "missing lifecycle fixture expected one warning (got $missing_count)"

cp "$PROJECT_DIR/examples/plain-autonode-basic.tex" "$WORK_DIR/plain.tex"
(CDPATH= cd -P "$WORK_DIR" && luatex --interaction=nonstopmode \
    --halt-on-error --file-line-error plain.tex) >"$LOG_DIR/plain.log" 2>&1 \
    || { tail -n 20 "$LOG_DIR/plain.log" >&2; fail "plain LuaTeX test failed"; }

cp "$PROJECT_DIR/examples/context-autonode-basic.tex" "$WORK_DIR/context.tex"
CONTEXT_PATHS=$TEXMF_TREE/tex/generic/pgfplots-autonode,$TEXMF_TREE/tex/luatex/pgfplots-autonode
unset TEXMFCACHE
(CDPATH= cd -P "$WORK_DIR" && context --luatex --once --batchmode \
    --path="$CONTEXT_PATHS" --result=context context.tex) \
    >"$LOG_DIR/context.log" 2>&1 \
    || { tail -n 20 "$LOG_DIR/context.log" >&2; fail "ConTeXt test failed"; }

if grep -Fir 'luacoolprop' "$LOG_DIR" "$WORK_DIR" >/dev/null 2>&1; then
    fail "standalone autonode test resolved or mentioned LuaCoolProp"
fi
printf 'pgfplots-autonode passed isolated Lua, LuaLaTeX, plain LuaTeX, and ConTeXt tests.\n'
