#!/bin/bash

LOG_FILE="${TRIM_PKGVAR}/info.log"
PID_FILE="${TRIM_PKGVAR}/app.pid"
DOWNLOAD_DIR="/var/apps/fn-appdownload/shares/fn-appdownload/downloads"
SOCKET_PATH="${TRIM_APPDEST}/fn-appdownload.sock"
PYTHON_BIN="${PYTHON_BIN:-python3}"

# Serve the UI and API through a Unix socket, matching fn-terminal's gateway mode.
CMD="\"${PYTHON_BIN}\" \"${TRIM_APPDEST}/server/appdownload.py\" --unix-socket \"${SOCKET_PATH}\" --base-path \"/app/fn-appdownload\" --www-root \"${TRIM_APPDEST}/www\""

log_msg() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >>${LOG_FILE}
}

start_process() {
  if status; then
    return 0
  fi

  log_msg "Starting process ..."
  mkdir -p "${TRIM_PKGVAR}" "${DOWNLOAD_DIR}" >/dev/null 2>&1 || true
  rm -f "${SOCKET_PATH}"
  bash -c "${CMD}" >>${LOG_FILE} 2>&1 &
  printf "%s" "$!" >${PID_FILE}
  return 0
}

stop_process() {
  log_msg "Stopping process ..."

  if [ -r "${PID_FILE}" ]; then
    pid=$(head -n 1 "${PID_FILE}" | tr -d '[:space:]')

    log_msg "pid=${pid}"
    if ! check_process "${pid}"; then
      # process not exist, delete pidfile
      rm -f "${PID_FILE}"
      rm -f "${SOCKET_PATH}"
      log_msg "remove pid file 1"
      return
    fi

    log_msg "send TERM signal to PID:${pid}..."
    kill -TERM ${pid} >>${LOG_FILE} 2>&1

    local count=0
    while check_process "${pid}" && [ $count -lt 10 ]; do
      sleep 1
      count=$((count + 1))
      log_msg "waiting process terminal... (${count}s/10s)"
    done

    if check_process "${pid}"; then
      log_msg "send KILL signal to PID:${pid}..."
      kill -KILL "${pid}"
      sleep 1
      rm -f "${PID_FILE}"
      rm -f "${SOCKET_PATH}"
    else
      log_msg "process killed... "
      rm -f "${PID_FILE}"
      rm -f "${SOCKET_PATH}"
    fi
  fi

  return 0
}

check_process() {
  local pid=$1
  if kill -0 "${pid}" 2>/dev/null; then
    return 0 # process exist
  else
    return 1 # process not exist
  fi
}

status() {
  if [ -f "${PID_FILE}" ]; then
    pid=$(head -n 1 "${PID_FILE}" | tr -d '[:space:]')
    if check_process "${pid}"; then
      return 0
    fi
    rm -f "${PID_FILE}"
    rm -f "${SOCKET_PATH}"
  fi

  return 1
}

case $1 in
  start)
    # run start command. exit 0 if success, exit 1 if failed
    start_process
    ;;
  stop)
    # run stop command. exit 0 if success, exit 1 if failed
    stop_process
    ;;
  status)
    # check application status command. exit 0 if running, exit 3 if not running
    if status; then
      exit 0
    else
      exit 3
    fi
    ;;
  *)
    exit 1
    ;;
esac
