#!/usr/bin/env bash
set -Eeuo pipefail
export PS4='+ ${BASH_SOURCE##*/}:${LINENO}: '
trap 'ec=$?; echo "FAILED at ${BASH_SOURCE##*/}:${LINENO} running: $BASH_COMMAND (exit $ec)" >&2' ERR

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG="$SCRIPT_DIR/config"
[[ -f "$CONFIG" ]] || { echo "ERROR: Missing $CONFIG" >&2; exit 1; }
source "$CONFIG"

: "${PARSER_HOME:?ERROR: PARSER_HOME must be set in config}"
LOGDIR="$PARSER_HOME/logs/parser"
mkdir -p "$LOGDIR"

# Log stdout/stderr to a run log
exec > >(tee -a "$LOGDIR/run.log") 2>&1

# Defaults & flags
if [[ -n "${JAVA_OPTS:-}" ]]; then
  # Respect user-provided flags; split into an array
  read -r -a JAVA_FLAGS <<<"$JAVA_OPTS"
else
  JAVA_FLAGS=(
    -XX:+UseG1GC
    -XX:+UnlockExperimentalVMOptions
    -XX:G1PeriodicGCInterval=30000
    -XX:G1PeriodicGCSystemLoadThreshold=80
    -XX:+ExplicitGCInvokesConcurrent
    -XX:+UseStringDeduplication
    -XX:+ShrinkHeapInSteps
    -XX:MaxHeapFreeRatio=40
    -XX:MinHeapFreeRatio=10
    -Xms1g
    -Xmx32g
    -XX:+HeapDumpOnOutOfMemoryError
    "-XX:HeapDumpPath=${PARSER_HOME}/logs/parser"
    "-Xlog:gc*:file=${PARSER_HOME}/logs/parser/gc.log:time,uptime,level,tags"
  )
fi

PASSTHRU=()
while [[ $# -gt 0 ]]; do
  case "$1" in
    --jar)
      [[ -n "${2:-}" ]] || { echo "ERROR: --jar requires a path" >&2; exit 2; }
      JAR="$2"; shift 2 ;;
    --) shift; PASSTHRU+=("$@"); break ;;
    *) PASSTHRU+=("$1"); shift ;;
  esac
done

cd "/app";

[[ -r "$JAR" ]] || { echo "ERROR: jar not found: $JAR" >&2; exit 3; }
command -v java >/dev/null || { echo "ERROR: java not found in PATH" >&2; exit 127; }

# Run the parser; capture and report exit code explicitly
set +e
java "${JAVA_FLAGS[@]}" -DLOGBASE="$LOGDIR" -jar "$JAR" "${PASSTHRU[@]}"
rc=$?
set -e
echo "java exit code: $rc"

# Log last processed day (if file exists)
DATE=""
if [[ -n "${PROCESSED_LOG:-}" && -r "$PROCESSED_LOG" ]]; then
  DATE="$(<"$PROCESSED_LOG")"
fi
printf '%(%F %T)T Parsed: %s\n' -1 "$DATE" >> "$LOGDIR/metrics.log"

# Exit with the same code Java returned
exit "$rc"
