#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
JULIA_BIN="${JULIA_BIN:-julia}"
SUITE="all"

usage() {
    cat <<'EOF'
Usage:
  bin/depatlas-test [all|fast]
  bin/depatlas-test --suite all
  bin/depatlas-test --suite fast

Options:
  -s, --suite   Test suite to run (all or fast)
  -h, --help    Show this help message

Notes:
  - Logs are always preserved under .depatlas-store/test_logs/<timestamp>/
  - Use DEPATLAS_TEST_LOG_DIR to override the run artifact directory
  - Use JULIA_BIN to override the Julia executable
EOF
}

while [ "$#" -gt 0 ]; do
    case "$1" in
      all|fast)
        SUITE="$1"
        shift
        ;;
      -s|--suite)
        [ "$#" -ge 2 ] || {
            echo "Missing value for $1" >&2
            usage >&2
            exit 2
        }
        case "$2" in
          all|fast)
            SUITE="$2"
            ;;
          *)
            echo "Unsupported suite: $2" >&2
            usage >&2
            exit 2
            ;;
        esac
        shift 2
        ;;
      -h|--help)
        usage
        exit 0
        ;;
      *)
        echo "Unsupported argument: $1" >&2
        usage >&2
        exit 2
        ;;
    esac
done

STAMP="$(date '+%Y%m%d-%H%M%S')"
LOG_ROOT_DEFAULT="$ROOT_DIR/.depatlas-store/test_logs"
RUN_DIR="${DEPATLAS_TEST_LOG_DIR:-$LOG_ROOT_DEFAULT/$STAMP}"

mkdir -p "$RUN_DIR"

STDOUT_LOG="$RUN_DIR/stdout.log"
STDERR_LOG="$RUN_DIR/stderr.log"
COMBINED_LOG="$RUN_DIR/combined.log"
EXITCODE_FILE="$RUN_DIR/exitcode.txt"
META_FILE="$RUN_DIR/meta.txt"

{
    printf 'started_at=%s\n' "$(date -Is)"
    printf 'root_dir=%s\n' "$ROOT_DIR"
    printf 'julia_bin=%s\n' "$JULIA_BIN"
    printf 'command=%s\n' "DEPATLAS_TEST_SUITE=$SUITE $JULIA_BIN --project=. test/runtests.jl"
    printf 'cwd=%s\n' "$ROOT_DIR"
    printf 'suite=%s\n' "$SUITE"
} >"$META_FILE"

echo "Running DependencyAtlas test suite: $SUITE"
echo "Logs will be written under: $RUN_DIR"
echo "  stdout:   $STDOUT_LOG"
echo "  stderr:   $STDERR_LOG"
echo "  combined: $COMBINED_LOG"
echo "  exitcode: $EXITCODE_FILE"

(
    cd "$ROOT_DIR" || exit 1
    DEPATLAS_TEST_SUITE="$SUITE" "$JULIA_BIN" --project=. test/runtests.jl \
        > >(tee "$STDOUT_LOG" | tee "$COMBINED_LOG") \
        2> >(tee "$STDERR_LOG" >&2 | tee -a "$COMBINED_LOG" >&2)
)
EXIT_CODE=$?

printf '%s\n' "$EXIT_CODE" >"$EXITCODE_FILE"
printf 'finished_at=%s\n' "$(date -Is)" >>"$META_FILE"
printf 'exit_code=%s\n' "$EXIT_CODE" >>"$META_FILE"

if [ "$EXIT_CODE" -eq 0 ]; then
    echo "Test suite passed."
else
    echo "Test suite failed with exit code $EXIT_CODE."
fi

echo "Run artifacts: $RUN_DIR"
exit "$EXIT_CODE"
