#!/bin/bash

# ==============================================================================
# GoMonitor 自动化部署/更新/卸载脚本
# 支持版本管理、Systemd 服务配置及 GitHub 国内加速镜像
# ==============================================================================

# 默认变量定义
APP_NAME="GoMonitor"
INSTALL_DIR="/usr/local/bin"
SERVICE_NAME="gomonitor"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
TMP_DIR="/tmp/gomonitor_install"
GITHUB_REPO="Hopetree/GoMonitor"
MIRROR_PREFIX=""
TARGET_VERSION=""  # 指定版本，为空则自动获取最新版

# ------------------------------------------------------------------------------
# 帮助信息与用法说明
# ------------------------------------------------------------------------------
usage() {
  cat <<EOF
用法: $0 [选项] <动作>

动作 (Actions):
  install     安装 GoMonitor 并配置为系统服务
  update      更新 GoMonitor 到最新版本
  uninstall   卸载 GoMonitor 并清理相关文件

选项 (Options):
  -m, --mirror <URL>   使用 GitHub 国内加速镜像前缀
                       常用选项:
                         https://ghproxy.net/
                         https://gh-proxy.com/
                         https://mirror.ghproxy.com/
  -v, --version <VER>  指定安装/更新的版本号（如 v0.1.2），
                       不传则自动下载最新版
  -k, --key <KEY>      直接指定客户端 Key (-k 参数)
  -s, --secret <SECRET>直接指定客户端 Secret (-s 参数)
  -h, --help           显示帮助信息

示例:
  # 安装最新版本
  $0 install

  # 使用镜像站安装
  $0 -m https://ghproxy.net/ install

  # 安装指定版本
  $0 -v v0.1.2 install

  # 非交互式安装指定版本
  $0 -m https://ghproxy.net/ -v v0.1.2 -k "YOUR_KEY" -s "YOUR_SECRET" install

  # 使用镜像加速更新
  $0 -m https://ghproxy.net/ update

  # 更新到指定版本
  $0 -v v0.1.3 update
EOF
  exit 1
}

# ------------------------------------------------------------------------------
# 环境与权限检查
# ------------------------------------------------------------------------------
check_root() {
  if [[ $EUID -ne 0 ]]; then
    echo "错误: 此脚本必须以 root 权限运行。" >&2
    exit 1
  fi
}

check_systemd() {
  if ! command -v systemctl &> /dev/null; then
    echo "错误: 当前系统未检测到 systemd 支持。" >&2
    exit 1
  fi
}

cleanup() {
  if [[ -d "$TMP_DIR" ]]; then
    rm -rf "$TMP_DIR"
  fi
}

# ------------------------------------------------------------------------------
# 获取版本信息与下载链接
# ------------------------------------------------------------------------------
get_version_info() {
  if [[ -n "$TARGET_VERSION" ]]; then
    # 使用用户指定的版本
    echo "使用指定版本: ${TARGET_VERSION}"
    LATEST_TAG="$TARGET_VERSION"
    TAG_VERSION="${LATEST_TAG#v}"
  else
    # 自动获取最新版本
    echo "正在获取 ${APP_NAME} 最新版本信息..."

    LATEST_TAG=$(curl -s "https://api.github.com/repos/${GITHUB_REPO}/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')

    if [[ -z "$LATEST_TAG" ]]; then
      echo "警告: 无法通过 API 自动获取最新版本，降级使用默认版本 v0.1.1。"
      LATEST_TAG="v0.1.1"
    fi

    TAG_VERSION="${LATEST_TAG#v}"
  fi

  RAW_DOWNLOAD_URL="https://github.com/${GITHUB_REPO}/releases/download/${LATEST_TAG}/GoMonitor_${TAG_VERSION}_linux_x86_64.tar.gz"

  # 处理镜像地址前缀逻辑
  if [[ -n "$MIRROR_PREFIX" ]]; then
    [[ "$MIRROR_PREFIX" != */ ]] && MIRROR_PREFIX="${MIRROR_PREFIX}/"
    DOWNLOAD_URL="${MIRROR_PREFIX}${RAW_DOWNLOAD_URL}"
  else
    DOWNLOAD_URL="${RAW_DOWNLOAD_URL}"
  fi

  FILENAME="GoMonitor_${TAG_VERSION}_linux_x86_64.tar.gz"
  DIRNAME="GoMonitor_${TAG_VERSION}_linux_x86_64"
}

# ------------------------------------------------------------------------------
# 核心功能：安装
# ------------------------------------------------------------------------------
install_app() {
  check_systemd
  get_version_info

  echo "=== 开始安装 ${APP_NAME} (${LATEST_TAG}) ==="

  if [[ -f "${INSTALL_DIR}/${APP_NAME}" ]]; then
    read -p "${APP_NAME} 二进制文件已存在，是否覆盖安装？[y/N] " confirm
    if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
      echo "已取消安装。"
      exit 0
    fi
  fi

  mkdir -p "$TMP_DIR" && cd "$TMP_DIR" || exit 1

  echo "下载地址: ${DOWNLOAD_URL}"
  wget --no-check-certificate -O "$FILENAME" "$DOWNLOAD_URL"
  if [[ $? -ne 0 ]]; then
    echo "错误: 文件下载失败，请检查网络或更换镜像源 (-m 参数)。" >&2
    cleanup
    exit 1
  fi

  echo "正在解压..."
  tar -zxvf "$FILENAME"
  cd "$DIRNAME" || exit 1

  echo "安装程序至 ${INSTALL_DIR}..."
  cp -f "${APP_NAME}" "${INSTALL_DIR}/"
  chmod 755 "${INSTALL_DIR}/${APP_NAME}"

  # 配置密钥信息
  if [[ -z "$PUSH_KEY" ]]; then
    read -p "请输入服务端 Key (-k): " PUSH_KEY
  fi
  if [[ -z "$PUSH_SECRET" ]]; then
    read -p "请输入服务端 Secret (-s): " PUSH_SECRET
  fi

  if [[ -z "$PUSH_KEY" || -z "$PUSH_SECRET" ]]; then
    echo "错误: Key 或 Secret 不能为空，安装中断。" >&2
    cleanup
    exit 1
  fi

  # 创建 Systemd 服务配置
  echo "创建系统服务配置文件 ${SERVICE_FILE}..."
  cat > "$SERVICE_FILE" <<EOF
[Unit]
Description = go monitor agent
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
ExecStart = ${INSTALL_DIR}/${APP_NAME} report -i 5 -k ${PUSH_KEY} -s ${PUSH_SECRET}
Restart = always
RestartSec = 5s

[Install]
WantedBy = multi-user.target
EOF

  echo "启动服务并设置开机自启..."
  systemctl daemon-reload
  systemctl enable "$SERVICE_NAME"
  systemctl restart "$SERVICE_NAME"

  sleep 1
  systemctl status "$SERVICE_NAME" --no-pager

  echo -e "\n✅ ${APP_NAME} 安装成功！"
  cleanup
}

# ------------------------------------------------------------------------------
# 核心功能：更新
# ------------------------------------------------------------------------------
update_app() {
  check_systemd

  if [[ ! -f "${INSTALL_DIR}/${APP_NAME}" ]]; then
    echo "错误: 未找到现有的 ${APP_NAME} 安装，请先执行 install。" >&2
    exit 1
  fi

  get_version_info

  CURRENT_VERSION=$("${INSTALL_DIR}/${APP_NAME}" -v 2>/dev/null | head -n 1 | awk '{print $NF}')
  echo "当前版本: ${CURRENT_VERSION:-未知}"
  echo "目标版本: ${TAG_VERSION}"

  if [[ "$CURRENT_VERSION" == "$TAG_VERSION" ]]; then
    echo "当前已是目标版本 (${TAG_VERSION})，无需更新。"
    exit 0
  fi

  echo "=== 开始更新 ${APP_NAME} 至 ${LATEST_TAG} ==="

  mkdir -p "$TMP_DIR" && cd "$TMP_DIR" || exit 1

  echo "下载地址: ${DOWNLOAD_URL}"
  wget --no-check-certificate -O "$FILENAME" "$DOWNLOAD_URL"
  if [[ $? -ne 0 ]]; then
    echo "错误: 升级包下载失败。" >&2
    cleanup
    exit 1
  fi

  echo "解压并替换核心文件..."
  tar -zxvf "$FILENAME"
  cd "$DIRNAME" || exit 1

  # 暂停服务后替换程序
  systemctl stop "$SERVICE_NAME"
  cp -f "${APP_NAME}" "${INSTALL_DIR}/"
  chmod 755 "${INSTALL_DIR}/${APP_NAME}"

  echo "重启服务..."
  systemctl daemon-reload
  systemctl restart "$SERVICE_NAME"

  sleep 1
  systemctl status "$SERVICE_NAME" --no-pager

  echo -e "\n✅ ${APP_NAME} 升级成功！"
  cleanup
}

# ------------------------------------------------------------------------------
# 核心功能：卸载
# ------------------------------------------------------------------------------
uninstall_app() {
  echo "=== 开始卸载 ${APP_NAME} ==="

  read -p "确定要彻底删除 ${APP_NAME} 及其服务配置吗？[y/N] " confirm
  if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
    echo "已取消卸载。"
    exit 0
  fi

  echo "停止并禁用服务..."
  systemctl stop "$SERVICE_NAME" &>/dev/null
  systemctl disable "$SERVICE_NAME" &>/dev/null

  echo "删除相关文件..."
  rm -f "$SERVICE_FILE"
  rm -f "${INSTALL_DIR}/${APP_NAME}"

  systemctl daemon-reload
  systemctl reset-failed &>/dev/null

  echo -e "\n✅ ${APP_NAME} 卸载完成。"
}

# ------------------------------------------------------------------------------
# 参数解析逻辑
# ------------------------------------------------------------------------------
check_root

# 解析全局参数
ARGS=()
while [[ $# -gt 0 ]]; do
  case "$1" in
    -m|--mirror)
      MIRROR_PREFIX="$2"
      shift 2
      ;;
    -v|--version)
      TARGET_VERSION="$2"
      shift 2
      ;;
    -k|--key)
      PUSH_KEY="$2"
      shift 2
      ;;
    -s|--secret)
      PUSH_SECRET="$2"
      shift 2
      ;;
    -h|--help)
      usage
      ;;
    *)
      ARGS+=("$1")
      shift
      ;;
  esac
done

# 还原非选项参数（动作指令）
set -- "${ARGS[@]}"

# 命令分发
ACTION="$1"

case "$ACTION" in
  install)
    install_app
    ;;
  update)
    update_app
    ;;
  uninstall)
    uninstall_app
    ;;
  *)
    usage
    ;;
esac