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

ENV_FILE="${ENV_FILE:-/etc/xlx/xlxd.env}"
if [[ -f "$ENV_FILE" ]]; then
  # shellcheck disable=SC1090
  source "$ENV_FILE"
fi

XLX_INSTALL_PATH="${XLX_INSTALL_PATH:-/xlxd}"
XLX_LOG_PATH="${XLX_LOG_PATH:-/var/log/xlxd.log}"
XLX_MODULES="${XLX_MODULES:-ABCDEFGHIJKLMNOPQRSTUVWXYZ}"
PID_FILE="/var/run/xlxd.pid"

usage() {
  echo "Usage: xlx-control {start|stop|restart|status|render-modules}"
}

render_modules() {
  mkdir -p "$XLX_INSTALL_PATH"
  local module_file="$XLX_INSTALL_PATH/xlxd.module"
  : > "$module_file"
  local i char
  for ((i = 0; i < ${#XLX_MODULES}; i++)); do
    char="${XLX_MODULES:$i:1}"
    printf "%s\n" "$char" >> "$module_file"
  done
}

start() {
  render_modules
  if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
    echo "xlxd already running with pid $(cat "$PID_FILE")"
    exit 0
  fi

  mkdir -p "$(dirname "$XLX_LOG_PATH")"
  cd "$XLX_INSTALL_PATH"
  ./xlxd -d -p "$PID_FILE" >> "$XLX_LOG_PATH" 2>&1
}

stop() {
  if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
    kill "$(cat "$PID_FILE")"
    rm -f "$PID_FILE"
    return
  fi

  pkill -f "$XLX_INSTALL_PATH/xlxd" || true
  rm -f "$PID_FILE"
}

status() {
  if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
    echo "xlxd is running with pid $(cat "$PID_FILE")"
    exit 0
  fi
  echo "xlxd is not running"
  exit 3
}

case "${1:-}" in
  start) start ;;
  stop) stop ;;
  restart) stop; start ;;
  status) status ;;
  render-modules) render_modules ;;
  *) usage; exit 2 ;;
esac
