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

SERVICE_NAME="local-webserver.service"
SERVICE_PATH="/etc/systemd/system/${SERVICE_NAME}"
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
RUN_USER="${SUDO_USER:-${USER}}"
HOST="${HOST:-0.0.0.0}"
PORT="${PORT:-8808}"

if [[ "${EUID}" -ne 0 ]]; then
  echo "Run as root: sudo bash scripts/install_systemd_service.sh"
  exit 1
fi

port_in_use() {
  local port="$1"
  if command -v ss >/dev/null 2>&1; then
    ss -ltn "( sport = :${port} )" | awk 'NR>1 {exit 0} END {exit 1}'
    return $?
  fi
  if command -v netstat >/dev/null 2>&1; then
    netstat -ltn 2>/dev/null | awk '{print $4}' | grep -E "[:.]${port}$" >/dev/null 2>&1
    return $?
  fi
  if command -v lsof >/dev/null 2>&1; then
    lsof -iTCP:"${port}" -sTCP:LISTEN >/dev/null 2>&1
    return $?
  fi
  return 1
}

if port_in_use "${PORT}"; then
  echo "Port ${PORT} is already in use on this host."
  if command -v docker >/dev/null 2>&1; then
    echo "Published Docker ports:"
    docker ps --format 'table {{.Names}}\t{{.Ports}}' || true
  fi
  echo "Pick a free port, for example: PORT=8810 sudo bash scripts/install_systemd_service.sh"
  exit 1
fi

cat > "${SERVICE_PATH}" <<UNIT
[Unit]
Description=Local Webserver Service
After=network.target

[Service]
Type=simple
User=${RUN_USER}
WorkingDirectory=${REPO_DIR}
Environment=HOST=${HOST}
Environment=PORT=${PORT}
ExecStart=/usr/bin/env python3 ${REPO_DIR}/server.py
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
UNIT

systemctl daemon-reload
systemctl enable "${SERVICE_NAME}"
systemctl restart "${SERVICE_NAME}"

echo "Installed ${SERVICE_PATH}"
echo "Checking service status..."
systemctl --no-pager --full status "${SERVICE_NAME}" || true
