#!/bin/bash
# apm-euspace - APM Euspace eBPF Agent service management script
# Supports: start | stop | restart | status | exec

set -o pipefail

AGENT_DIR="/opt/apm/euspace/current"
AGENT_BIN="${AGENT_DIR}/bin/euspace"
PID_FILE="${AGENT_DIR}/bin/euspace.pid"
LOG_DIR="${AGENT_DIR}/logs"
STOP_TIMEOUT=240

# NON_ROOT_MODE support
readonly PARAM_NON_ROOT_MODE=false

get_pid() {
  if [ -f "${PID_FILE}" ]; then
    cat "${PID_FILE}" 2>/dev/null
  fi
}

is_running() {
  local pid
  pid="$(get_pid)"
  if [ -n "${pid}" ] && kill -0 "${pid}" 2>/dev/null; then
    return 0
  fi
  return 1
}

do_start() {
  if is_running; then
    echo "euspace is already running (PID: $(get_pid))"
    return 0
  fi

  echo "Starting euspace..."

  if [ ! -x "${AGENT_BIN}" ]; then
    echo "Error: ${AGENT_BIN} not found or not executable"
    return 1
  fi

  mkdir -p "${LOG_DIR}" 2>/dev/null

  # Start the agent in background
  nohup "${AGENT_BIN}" >> "${LOG_DIR}/euspace.log" 2>&1 &
  local pid=$!

  # Write PID file
  echo "${pid}" > "${PID_FILE}"

  # Verify process started successfully
  sleep 1
  if kill -0 "${pid}" 2>/dev/null; then
    echo "euspace started successfully (PID: ${pid})"
    return 0
  else
    echo "Error: euspace failed to start"
    rm -f "${PID_FILE}"
    return 1
  fi
}

do_stop() {
  if ! is_running; then
    echo "euspace is not running"
    rm -f "${PID_FILE}"
    return 0
  fi

  local pid
  pid="$(get_pid)"
  echo "Stopping euspace (PID: ${pid})..."

  # Send SIGTERM for graceful shutdown
  kill -15 "${pid}" 2>/dev/null

  # Wait up to 240 seconds for the process to exit
  local waited=0
  while [ ${waited} -lt ${STOP_TIMEOUT} ]; do
    if ! kill -0 "${pid}" 2>/dev/null; then
      echo "euspace stopped gracefully"
      rm -f "${PID_FILE}"
      return 0
    fi
    sleep 1
    waited=$((waited + 1))
  done

  # Timeout reached, force kill with SIGKILL
  echo "Timeout (${STOP_TIMEOUT}s) reached, sending SIGKILL..."
  kill -9 "${pid}" 2>/dev/null
  sleep 1

  if ! kill -0 "${pid}" 2>/dev/null; then
    echo "euspace killed"
    rm -f "${PID_FILE}"
    return 0
  else
    echo "Error: failed to kill euspace (PID: ${pid})"
    return 1
  fi
}

do_restart() {
  do_stop
  do_start
}

do_status() {
  if is_running; then
    echo "euspace is running (PID: $(get_pid))"
    return 0
  else
    echo "euspace is not running"
    rm -f "${PID_FILE}" 2>/dev/null
    return 3
  fi
}

do_exec() {
  # Foreground execution for systemd ExecStart (Type=simple alternative)
  if [ ! -x "${AGENT_BIN}" ]; then
    echo "Error: ${AGENT_BIN} not found or not executable"
    exit 1
  fi

  echo "Starting euspace in foreground..."
  exec "${AGENT_BIN}"
}

case "$1" in
  start)
    do_start
    ;;
  stop)
    do_stop
    ;;
  restart)
    do_restart
    ;;
  status)
    do_status
    ;;
  exec)
    do_exec
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status|exec}"
    exit 1
    ;;
esac
