#!/bin/bash
# 创建快捷命令 'x'
SCRIPT_PATH="$(readlink -f "$0")"
if [ ! -f "/usr/local/bin/x" ]; then
  sudo ln -sf "$SCRIPT_PATH" /usr/local/bin/x
  sudo chmod +x /usr/local/bin/x
fi

# 检测操作系统类型和发行版
if [ -f /etc/os-release ]; then
  . /etc/os-release
  DISTRO=$ID
else
  DISTRO="unknown"
fi

# 检测并安装必要的依赖项
install_dependencies() {
  local DEPENDENCIES="curl openssl bc"
  local PKG_MANAGER=""
  local INSTALL_CMD=""
  local UPDATE_CMD=""

  case $DISTRO in
    ubuntu|debian|kali)
      PKG_MANAGER="apt-get"
      INSTALL_CMD="sudo $PKG_MANAGER install -y"
      UPDATE_CMD="sudo $PKG_MANAGER update"
      ;;
    centos|fedora|rhel|rocky|almalinux)
      PKG_MANAGER="yum"
      INSTALL_CMD="sudo $PKG_MANAGER install -y"
      UPDATE_CMD="sudo $PKG_MANAGER update -y"
      ;;
    alpine)
      PKG_MANAGER="apk"
      INSTALL_CMD="sudo $PKG_MANAGER add"
      UPDATE_CMD="sudo $PKG_MANAGER update"
      ;;
    arch|manjaro)
      PKG_MANAGER="pacman"
      INSTALL_CMD="sudo $PKG_MANAGER -S --noconfirm"
      UPDATE_CMD="sudo $PKG_MANAGER -Sy"
      ;;
    *)
      echo "不支持的发行版: $DISTRO"
      exit 1
      ;;
  esac

  # 检查并安装缺少的依赖
  local MISSING_PKGS=()
  for package in $DEPENDENCIES; do
    if ! command -v $package &> /dev/null; then
      MISSING_PKGS+=("$package")
    fi
  done

  if [ ${#MISSING_PKGS[@]} -gt 0 ]; then
    echo "检测到缺少依赖项，正在安装：${MISSING_PKGS[*]}"
    $UPDATE_CMD
    $INSTALL_CMD "${MISSING_PKGS[@]}"
  fi
}

# 定义BBR相关函数
check_bbr_status() {
  echo "当前可用的拥塞控制算法："
  cat /proc/sys/net/ipv4/tcp_available_congestion_control
  echo -e "\n当前使用的拥塞控制算法："
  cat /proc/sys/net/ipv4/tcp_congestion_control
}

enable_bbr() {
  if ! lsmod | grep -q "^tcp_bbr "; then
    echo "正在加载BBR模块..."
    sudo modprobe tcp_bbr
  fi
  
  sudo sysctl -w net.core.default_qdisc=fq
  sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
  
  echo "net.core.default_qdisc=fq" | sudo tee /etc/sysctl.d/50-bbr.conf
  echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/50-bbr.conf
  
  sudo sysctl -p /etc/sysctl.d/50-bbr.conf
  
  echo "BBR 配置完成，当前状态："
  check_bbr_status
}

# 返回菜单函数
pause_and_return_menu() {
  read -n 1 -s -r -p "按任意键返回菜单..."
  echo
}

# 脚本主循环
while true; do
  clear
  echo "==================================="
  echo "        系统管理工具菜单"
  echo "==================================="
  echo "1. 一键安装Hysteria2"
  echo "2. 自签证书"
  echo "3. 协议配置生成"
  echo "4. 重启Hysteria2"
  echo "5. 查看Hysteria2状态"
  echo "6. 停止Hysteria2"
  echo "7. 设置Hysteria2开机自启"
  echo "8. 查看Hysteria2日志"
  echo "9. 移除Hysteria2"
  echo "10. BBR配置"
  echo "11. 查看BBR状态"
  echo "12. 退出"
  echo "==================================="
  echo "提示：输入 'x' 可随时唤起此菜单"
  echo "==================================="

  read -p "请输入选项 (1-12): " choice

  case $choice in
    1)
      echo "正在安装Hysteria2..."
      bash <(curl -fsSL https://get.hy2.sh/)
      if [ $? -eq 0 ]; then
        echo "Hysteria2 安装成功"
      else
        echo "Hysteria2 安装失败"
      fi
      ;;
    2)
      echo "正在生成自签证书..."
      read -p "请输入域名 (默认为 12371.cn): " domain
      domain=${domain:-12371.cn}
      sudo mkdir -p /etc/hysteria
      TEMP_EC_PARAM=$(mktemp)
      openssl ecparam -name prime256v1 > "$TEMP_EC_PARAM"
      sudo openssl req -x509 -nodes -newkey ec:"$TEMP_EC_PARAM" \
        -keyout /etc/hysteria/server.key -out /etc/hysteria/server.crt \
        -subj "/CN=$domain" -days 36500
      rm -f "$TEMP_EC_PARAM"
      sudo chown hysteria /etc/hysteria/server.key /etc/hysteria/server.crt
      if [ $? -eq 0 ]; then
        echo "自签证书生成成功"
      else
        echo "自签证书生成失败"
      fi
      ;;
    3)
      echo "正在生成协议配置..."
      read -p "请输入密码 (默认为 1234): " password
      password=${password:-1234}

      read -p "请输入伪装网址 (默认为 12371.cn): " url
      url=${url:-12371.cn}

      while true; do
        read -p "请输入 RTT (单位为 ms): " rtt
        if [[ $rtt =~ ^[0-9]+(.[0-9]+)?$ ]]; then
          break
        else
          echo "无效的 RTT 值,请重新输入。"
        fi
      done

      while true; do
        read -p "请输入期望的速度 (单位为 MB/s): " speed
        if [[ $speed =~ ^[0-9]+(.[0-9]+)?$ ]]; then
          break
        else
          echo "无效的速度值,请重新输入。"
        fi
      done

      while true; do
        read -p "请输入系统缓冲区大小 (单位为 MB,默认为 16): " buffer_size
        buffer_size=${buffer_size:-16}
        if [[ $buffer_size =~ ^[0-9]+$ ]]; then
          break
        else
          echo "无效的缓冲区大小,请重新输入。"
        fi
      done

      while true; do
        read -p "请输入监听端口 (默认为 443): " port
        port=${port:-443}
        if [[ $port =~ ^[0-9]+$ ]]; then
          break
        else
          echo "无效的端口号，请输入有效的数字。"
        fi
      done

      speed_in_bytes=$(echo "$speed * 1048576" | bc)
      init_conn_window=$(echo "$speed_in_bytes * $rtt / 1000" | bc)
      max_conn_window=$init_conn_window
      init_stream_window=$(echo "$init_conn_window * 2 / 5" | bc)
      max_stream_window=$init_stream_window
      buffer_size_bytes=$(echo "$buffer_size * 1048576" | bc)

      sudo mkdir -p /etc/hysteria
      sudo bash -c 'cat > /etc/hysteria/config.yaml' << EOF
listen: :$port

tls:
  cert: /etc/hysteria/server.crt
  key: /etc/hysteria/server.key

auth:
  type: password
  password: $password

masquerade:
  type: proxy
  proxy:
    url: https://$url
    rewriteHost: true

sysctl:
  net.core.rmem_max: $buffer_size_bytes
  net.core.wmem_max: $buffer_size_bytes

quic:
  initStreamReceiveWindow: $init_stream_window
  maxStreamReceiveWindow: $max_stream_window
  initConnReceiveWindow: $init_conn_window
  maxConnReceiveWindow: $max_conn_window
EOF

      if [ $? -eq 0 ]; then
        echo "协议配置生成成功"
      else
        echo "协议配置生成失败"
      fi
      ;;
    4)
      echo "正在重启Hysteria2..."
      sudo systemctl restart hysteria-server.service
      if [ $? -eq 0 ]; then
        echo "Hysteria2 重启成功"
      else
        echo "Hysteria2 重启失败"
      fi
      ;;
    5)
      echo "Hysteria2 服务状态："
      sudo systemctl status hysteria-server.service
      ;;
    6)
      echo "正在停止Hysteria2..."
      sudo systemctl stop hysteria-server.service
      if [ $? -eq 0 ]; then
        echo "Hysteria2 已停止"
      else
        echo "Hysteria2 停止失败"
      fi
      ;;
    7)
      echo "正在设置Hysteria2开机自启..."
      sudo systemctl enable hysteria-server.service
      if [ $? -eq 0 ]; then
        echo "Hysteria2 已设置为开机自启"
      else
        echo "设置开机自启失败"
      fi
      ;;
    8)
      echo "Hysteria2 日志："
      sudo journalctl -u hysteria-server.service
      ;;
    9)
      echo "正在移除Hysteria2..."
      bash <(curl -fsSL https://get.hy2.sh/) --remove
      if [ $? -eq 0 ]; then
        echo "Hysteria2 已移除"
        echo "正在删除配置文件和证书..."
        sudo rm -rf /etc/hysteria
        sudo userdel -r hysteria
        echo "正在禁用相关 systemd 服务..."
        sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server.service
        sudo rm -f /etc/systemd/system/multi-user.target.wants/hysteria-server@*.service
        sudo systemctl daemon-reload
        echo "Hysteria2 配置文件和服务已清理完毕"
      else
        echo "移除Hysteria2失败"
      fi
      ;;
    10)
      echo "正在配置BBR..."
      enable_bbr
      ;;
    11)
      echo "正在检查BBR状态..."
      check_bbr_status
      ;;
    12)
      echo "退出脚本"
      exit 0
      ;;
    x|X)
      continue
      ;;
    *)
      echo "无效选项，请重新选择"
      ;;
  esac

  pause_and_return_menu
done
