#!/usr/bin/env bash

set -euo pipefail

if [[ "${EUID}" -ne 0 ]]; then
  echo "ERROR: run as root (for example: sudo ./deploy/install.sh)" >&2
  exit 1
fi

require_cmd() {
  local cmd="$1"
  if ! command -v "${cmd}" >/dev/null 2>&1; then
    echo "ERROR: required command not found: ${cmd}" >&2
    exit 1
  fi
}

require_cmd go
require_cmd install
require_cmd systemctl

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
APP_USER="${APP_USER:-yansu}"
APP_GROUP="${APP_GROUP:-yansu}"
APP_DIR="${APP_DIR:-${APP_ROOT}}"
APP_BINARY="${APP_BINARY:-manus_active_cluster_monitor}"
ENV_FILE="${ENV_FILE:-${APP_DIR}/.env}"
SERVICE_NAME="${SERVICE_NAME:-manus_active_cluster_monitor.service}"
SYSTEMD_UNIT_DIR="${SYSTEMD_UNIT_DIR:-/etc/systemd/system}"

if [[ ! -d "${APP_DIR}" ]]; then
  echo "ERROR: app directory not found: ${APP_DIR}" >&2
  exit 1
fi

echo ">>> Building binary in ${APP_DIR}"
su -s /bin/bash -c "cd \"${APP_DIR}\" && go build -o \"${APP_BINARY}\" main.go" "${APP_USER}"
chmod 0755 "${APP_DIR}/${APP_BINARY}"

if [[ ! -f "${ENV_FILE}" ]]; then
  echo ">>> Creating environment file at ${ENV_FILE}"
  install -m 0600 "${APP_ROOT}/.env.example" "${ENV_FILE}"
  chown "${APP_USER}:${APP_GROUP}" "${ENV_FILE}"
fi

echo ">>> Installing systemd unit"
cat > "${SYSTEMD_UNIT_DIR}/${SERVICE_NAME}" <<EOF
[Unit]
Description=Manus active cluster monitor
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=${APP_USER}
Group=${APP_GROUP}
WorkingDirectory=${APP_DIR}
EnvironmentFile=-${ENV_FILE}
ExecStart=${APP_DIR}/${APP_BINARY}
Restart=always
RestartSec=5
StartLimitIntervalSec=0
NoNewPrivileges=true
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable "${SERVICE_NAME}"

if grep -qE '^(GITHUB_TOKEN|DB_DSN)=($|.*example)' "${ENV_FILE}"; then
  echo ">>> ${ENV_FILE} still contains placeholder values"
  echo ">>> Edit the file, then run: sudo systemctl restart ${SERVICE_NAME}"
  exit 0
fi

echo ">>> Restarting service"
systemctl restart "${SERVICE_NAME}"
systemctl status "${SERVICE_NAME}" --no-pager
