#!/bin/bash
set -e

unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=linux ;;
Darwin*) machine=macosx ;;
MINGW*) machine=windows ;;
*) machine="unhandled:${unameOut}" ;;
esac

CONFIG=debug
MATCH=
COVERAGE=
EXTRA_CONFIG=()
UTILITY=
TOOLSET_ARG=
while [[ $# -gt 0 ]]; do
  case $1 in
  -m | --match)
    MATCH="$2"
    shift # past argument
    shift # past value
    ;;
  lldb)
    if [[ $machine = "windows" ]]; then
      echo "Warning: Ignoring 'lldb' command-line argument, which does not work on Windows."
    else
      echo Starting debugger...
      if [[ ! -z $UTILITY ]]; then
        echo "Warning: 'lldb' parameter overrides '$UTILITY' parameter."
      fi
      UTILITY='lldb'
    fi
    shift # past argument
    ;;
  memory)
    if [[ $machine = "macosx" ]]; then
      echo Will perform memory checks...
      if [[ ! -z $UTILITY ]]; then
        echo "Warning: 'memory' parameter overrides '$UTILITY' parameter."
      fi
      UTILITY='leaks --atExit --'
    else
      echo "Warning: Ignoring 'memory' command-line argument, which only works on Mac."
    fi
    shift # past argument
    ;;
  asan)
    echo Will perform address sanitization...
    EXTRA_CONFIG+=(--with-asan)
    shift # past argument
    ;;
  release)
    CONFIG=release
    shift # past argument
    ;;
  coverage)
    if [[ $machine = "macosx" ]]; then
      COVERAGE=true
    else
      echo "Warning: Ignoring 'coverage' command-line argument, which only works on Mac."
    fi
    shift # past argument
    ;;
  rebaseline)
    export REBASELINE_SILVERS=true
    shift # past argument
    ;;
  clean)
    rm -fR out
    shift # past argument
    ;;
  --toolset=*)
    # Windows build specifies a default toolset but allow it to be overridden.
    echo "Toolset has been specified."
    TOOLSET_ARG=$1
    shift
    ;;
  --with_vulkan)
    echo "Vulkan is added"
    EXTRA_CONFIG+=(--with_vulkan)
    shift
    ;;
  *)
    # Pass any unrecognized arguments.
    EXTRA_CONFIG+=("$1")
    shift # past argument
    ;;
  esac
done

if [[ $machine = "windows" ]] && [[ -z $TOOLSET_ARG ]]; then
  echo "Using default Windows toolset of clang"
  TOOLSET_ARG="--toolset=clang"
fi

pushd ../../
RUNTIME=$PWD
popd

# Keep this an array: forwarded arguments reach build_rive.sh as-is, instead of being
# word-split and glob-expanded against the current directory on the way out.
BUILD_RIVE_COMMANDS=("$CONFIG" --with_rive_tools --with_rive_audio=external
                     --with_rive_scripting --no_ffp_contract)
if [[ -n $TOOLSET_ARG ]]; then
  BUILD_RIVE_COMMANDS+=("$TOOLSET_ARG")
fi
BUILD_RIVE_COMMANDS+=("${EXTRA_CONFIG[@]}")
"$RUNTIME/build/build_rive.sh" "${BUILD_RIVE_COMMANDS[@]}"

rm -fR silvers/tarnished
mkdir -p silvers/tarnished

OUT_DIR="out/$CONFIG"

# Run the unit tests with a watchdog that captures stacks if the binary
# hangs (macOS only, when no other UTILITY wrapper is in use). On hang we
# dump `sample`, `vmmap`, and `ps -M` to the log, then SIGABRT so CI fails
# with diagnostics instead of timing out blind.
run_with_watchdog() {
    if [[ $machine != "macosx" ]]; then
        "$@"
        return $?
    fi

    export MallocNanoZone=0
    export ASAN_OPTIONS="${ASAN_OPTIONS:+$ASAN_OPTIONS:}verbosity=2:print_stats=1"

    "$@" &
    local test_pid=$!
    (
        sleep 300
        if kill -0 "$test_pid" 2>/dev/null; then
            echo "==== HANG DETECTED at $(date) — capturing diagnostics ===="
            echo "---- sample (5s) ----"
            /usr/bin/sample "$test_pid" 5 -mayDie 2>&1 || true
            echo "---- vmmap --summary ----"
            /usr/bin/vmmap --summary "$test_pid" 2>&1 | head -200 || true
            echo "---- ps -M ----"
            /bin/ps -M "$test_pid" 2>&1 || true
            echo "==== killing ===="
            kill -ABRT "$test_pid"
        fi
    ) &
    local watch_pid=$!

    local status=0
    wait "$test_pid" || status=$?
    kill "$watch_pid" 2>/dev/null || true
    wait "$watch_pid" 2>/dev/null || true
    return $status
}

# Actually run the unit tests
if [[ -z $UTILITY ]]; then
    run_with_watchdog $OUT_DIR/unit_tests "$MATCH"
else
    $UTILITY $OUT_DIR/unit_tests "$MATCH"
fi

if [[ $COVERAGE = "true" ]]; then
  if [[ $machine = "macosx" ]]; then
    xcrun llvm-profdata merge -sparse default.profraw -o default.profdata
    xcrun llvm-cov report $OUT_DIR/unit_tests -instr-profile=default.profdata
    # xcrun llvm-cov export out/debug/unit_tests -instr-profile=default.profdata -format=text >coverage.json
    xcrun llvm-cov export out/debug/unit_tests -instr-profile=default.profdata -format=lcov >coverage.txt
    sed -i '' -e 's?'$RUNTIME'?packages/runtime?g' coverage.txt
  else
    echo "'coverage' command line argument was specified but it only works on Mac so it was ignored"
  fi
fi  
