#!/bin/bash
set -euo pipefail

# ══════════════════════════════════════════════════════════════════
# MyAgent — Termux + Ubuntu 远程桌面一键安装脚本
# ══════════════════════════════════════════════════════════════════
#
# 功能:
#   1. 在 Termux proot-distro Ubuntu 中安装完整 GUI 桌面环境
#   2. 安装 Chrome/Chromium 浏览器（ARM64 / AMD64 自动适配）
#   3. 安装 VNC 远程桌面所需全部依赖 (Xvfb + x11vnc + websockify)
#   4. 安装窗口管理器 (fluxbox) + 终端 (xterm)
#   5. 安装中文字体和输入法支持
#
# 使用方法:
#   在 Termux 中:
#     proot-distro login ubuntu
#     bash /path/to/setup-termux-vnc.sh
#
#   或一行命令:
#     curl -fsSL https://raw.githubusercontent.com/ctz168/myagent/main/install/setup-termux-vnc.sh | bash
#
# 架构:
#   Android Termux → proot-distro Ubuntu → Xvfb(:99) + x11vnc(5900)
#                                            + websockify(6080) → noVNC
#                                            + fluxbox + Chrome
#
# ══════════════════════════════════════════════════════════════════

BOLD='\033[1m'
ACCENT='\033[36m'
INFO='\033[90m'
SUCCESS='\033[32m'
WARN='\033[33m'
ERROR='\033[31m'
NC='\033[0m'

info()    { echo -e "${INFO}[i]${NC} $*"; }
success() { echo -e "${SUCCESS}[✓]${NC} $*"; }
warn()    { echo -e "${WARN}[!]${NC} $*"; }
err()     { echo -e "${ERROR}[✗]${NC} $*" >&2; }
step()    { echo -e "${ACCENT}[*]${NC} $*"; }
banner()  { echo -e "\n${BOLD}${ACCENT}$*${NC}\n"; }

# ── 检测是否在 Termux/proot 环境中 ──────────────────────────
detect_environment() {
  banner "检测运行环境..."

  # 检测是否在 proot 环境中
  IS_PROOT=false
  if grep -qi 'proot' /proc/self/maps 2>/dev/null || \
     grep -qi 'proot' /proc/version 2>/dev/null || \
     [ -n "${PROOT_SERVICE:-}" ]; then
    IS_PROOT=true
    info "检测到 proot 环境 (Termux proot-distro)"
  fi

  # 检测架构
  ARCH=$(dpkg --print-architecture 2>/dev/null || uname -m)
  info "系统架构: $ARCH"

  # 检测是否为 root
  IS_ROOT=false
  if [ "$(id -u)" -eq 0 ]; then
    IS_ROOT=true
    info "当前用户: root"
  else
    info "当前用户: $(whoami) (非 root，将使用 sudo)"
  fi

  # 检测 OS
  if [ ! -f /etc/os-release ]; then
    err "无法检测操作系统版本，此脚本仅支持 Ubuntu/Debian"
    exit 1
  fi
  source /etc/os-release
  info "操作系统: $PRETTY_NAME"

  if [[ "$ID" != "ubuntu" && "$ID" != "debian" ]]; then
    warn "此脚本主要针对 Ubuntu/Debian，当前系统 $ID 可能不兼容"
  fi
}

# ── apt 封装 ────────────────────────────────────────────────
apt_install() {
  if $IS_ROOT; then
    apt-get install -y --no-install-recommends "$@"
  else
    sudo apt-get install -y --no-install-recommends "$@"
  fi
}

apt_update() {
  if $IS_ROOT; then
    apt-get update -qq 2>/dev/null || true
  else
    sudo apt-get update -qq 2>/dev/null || true
  fi
}

# ── Step 1: 更新系统并安装基础依赖 ──────────────────────────
install_base_deps() {
  banner "Step 1/6: 安装基础依赖..."

  step "更新 apt 源..."
  apt_update

  step "安装基础工具..."
  apt_install \
    wget curl gnupg2 ca-certificates \
    software-properties-common \
    apt-transport-https \
    procps psmisc \
    2>/dev/null || true

  success "基础依赖安装完成"
}

# ── Step 2: 安装 X11 / VNC 远程桌面依赖 ────────────────────
install_vnc_deps() {
  banner "Step 2/6: 安装 X11 / VNC 远程桌面依赖..."

  step "安装 Xvfb (虚拟显示服务器)..."
  apt_install xvfb

  step "安装 x11vnc (VNC 服务器)..."
  apt_install x11vnc

  step "安装 x11vnc 依赖库..."
  apt_install \
    python3-numpy libxtst6 libxext6 libxfixes3 \
    libxrandr2 libxrender1 libxinerama1 libfontconfig1 \
    2>/dev/null || true

  step "安装 X11 工具..."
  apt_install \
    x11-xserver-utils xdotool xsetroot \
    2>/dev/null || true

  step "安装窗口管理器 (fluxbox) + 终端 (xterm)..."
  apt_install fluxbox xterm 2>/dev/null || {
    warn "fluxbox 安装失败，尝试 openbox..."
    apt_install openbox 2>/dev/null || true
  }

  step "安装截图工具 (ffmpeg)..."
  apt_install ffmpeg 2>/dev/null || {
    warn "ffmpeg 安装失败，尝试 ImageMagick..."
    apt_install imagemagick 2>/dev/null || true
  }

  step "安装 websockify (Python WebSocket 代理)..."
  pip3 install websockify 2>/dev/null || pip install websockify 2>/dev/null || {
    warn "pip 安装 websockify 失败，尝试 apt..."
    apt_install websockify 2>/dev/null || true
  }

  # 验证关键组件
  local missing=()
  for cmd in Xvfb x11vnc; do
    if ! command -v "$cmd" &>/dev/null; then
      missing+=("$cmd")
    fi
  done
  if ! command -v websockify &>/dev/null && ! python3 -c "import websockify" 2>/dev/null; then
    missing+=("websockify")
  fi

  if [ ${#missing[@]} -gt 0 ]; then
    err "VNC 关键组件安装失败: ${missing[*]}"
    return 1
  fi

  success "VNC 依赖安装完成"
}

# ── Step 3: 安装 Chrome/Chromium 浏览器 ────────────────────
install_chrome() {
  banner "Step 3/6: 安装 Chrome/Chromium 浏览器..."

  # 检查是否已安装
  if command -v google-chrome &>/dev/null; then
    success "Google Chrome 已安装: $(google-chrome --version 2>/dev/null)"
    return 0
  fi
  if command -v chromium-browser &>/dev/null; then
    success "Chromium 已安装: $(chromium-browser --version 2>/dev/null)"
    return 0
  fi
  if command -v chromium &>/dev/null; then
    success "Chromium 已安装: $(chromium --version 2>/dev/null)"
    return 0
  fi

  # 安装 Chrome/Chromium 共享库依赖
  step "安装 Chrome/Chromium 共享库依赖..."
  apt_install \
    libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
    libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
    libgbm1 libpango-1.0-0 libcairo2 libasound2 libatspi2.0-0 \
    libxshmfence1 libx11-xcb1 libxcb-dri3-0 \
    fonts-liberation xdg-utils \
    2>/dev/null || true

  # 根据架构选择安装方式
  case "$ARCH" in
    amd64|x86_64)
      step "AMD64 架构: 尝试安装 Google Chrome..."
      install_chrome_amd64
      ;;
    arm64|aarch64)
      step "ARM64 架构: 安装 Chromium (Google Chrome 不支持 ARM64)..."
      install_chrome_arm64
      ;;
    *)
      warn "未知架构 $ARCH，尝试通用方式安装 Chromium..."
      install_chromium_apt
      ;;
  esac

  # 验证安装
  if command -v google-chrome &>/dev/null; then
    success "Google Chrome 安装成功: $(google-chrome --version 2>/dev/null)"
  elif command -v chromium-browser &>/dev/null; then
    success "Chromium 安装成功: $(chromium-browser --version 2>/dev/null)"
  elif command -v chromium &>/dev/null; then
    success "Chromium 安装成功: $(chromium --version 2>/dev/null)"
  else
    warn "Chrome/Chromium 标准安装失败，尝试 Puppeteer 内置 Chrome..."
    install_chrome_puppeteer
  fi
}

install_chrome_amd64() {
  # 尝试 Google Chrome 官方源
  step "添加 Google Chrome 官方 APT 源..."
  if ! grep -q 'dl.google.com/linux/chrome' /etc/apt/sources.list 2>/dev/null && \
     [ ! -f /etc/apt/sources.list.d/google-chrome.list ]; then
    (
      if $IS_ROOT; then
        wget -qO- https://dl.google.com/linux/linux_signing_key.pub | apt-key add - 2>/dev/null || true
        echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" \
          > /etc/apt/sources.list.d/google-chrome.list
      else
        wget -qO- https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - 2>/dev/null || true
        echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" \
          | sudo tee /etc/apt/sources.list.d/google-chrome.list > /dev/null
      fi
      apt_update
    ) || warn "添加 Chrome 源失败"
  fi

  step "安装 google-chrome-stable..."
  apt_install google-chrome-stable 2>/dev/null && return 0

  # Chrome 安装失败，回退到 Chromium
  warn "Google Chrome 安装失败，回退到 Chromium..."
  install_chromium_apt
}

install_chrome_arm64() {
  # ARM64 上 Google Chrome 不支持，使用 Chromium
  step "ARM64: 安装 Chromium 浏览器..."

  # Ubuntu 22.04+ 使用 snap 安装的 chromium，在 proot 下不工作
  # 尝试使用 PPA 或直接安装 deb 包
  apt_install chromium-browser 2>/dev/null && return 0
  apt_install chromium 2>/dev/null && return 0

  # 尝试从 Ubuntu ports 安装
  step "尝试通过 apt 直接安装 chromium..."
  apt_update
  apt_install chromium-browser 2>/dev/null && return 0

  # 尝试下载预编译的 Chromium (chromium-bsu 不行，要浏览器)
  warn "apt 安装 Chromium 失败，尝试下载预编译版本..."

  # 使用 snap 的 chromium 在 proot 下不工作
  # 最佳方案: 使用 npx puppeteer 下载的 Chrome for Testing
  step "通过 Puppeteer 下载 Chrome for Testing (ARM64)..."
  if command -v npx &>/dev/null; then
    npx puppeteer browsers install chrome@stable 2>/dev/null || true
  fi

  # 如果还是失败，尝试安装 firefox 作为备选
  if ! command -v chromium &>/dev/null && ! command -v chromium-browser &>/dev/null; then
    warn "Chromium 安装失败，安装 Firefox 作为备选浏览器..."
    apt_install firefox 2>/dev/null || {
      warn "Firefox 也安装失败"
    }
  fi
}

install_chromium_apt() {
  step "通过 apt 安装 Chromium..."
  apt_install chromium-browser 2>/dev/null && return 0
  apt_install chromium 2>/dev/null && return 0
  return 1
}

install_chrome_puppeteer() {
  step "通过 Puppeteer 安装 Chrome for Testing..."
  if command -v npx &>/dev/null; then
    npx puppeteer browsers install chrome@stable 2>/dev/null || true
    # Puppeteer 安装的 Chrome 通常在 ~/.cache/puppeteer/ 下
    # 创建符号链接使其可被发现
    CHROME_PATH=$(find ~/.cache/puppeteer -name "chrome" -type f 2>/dev/null | head -1)
    if [ -n "$CHROME_PATH" ]; then
      ln -sf "$CHROME_PATH" /usr/local/bin/google-chrome 2>/dev/null || \
      ln -sf "$CHROME_PATH" /usr/bin/google-chrome 2>/dev/null || true
      success "Puppeteer Chrome 已链接: $CHROME_PATH"
      return 0
    fi
  fi
  warn "Puppeteer Chrome 安装也失败"
  return 1
}

# ── Step 4: 安装中文字体和输入法 ────────────────────────────
install_fonts_and_locale() {
  banner "Step 4/6: 安装中文字体和本地化支持..."

  step "安装中文字体..."
  apt_install \
    fonts-noto-cjk \
    fonts-noto-cjk-extra \
    fonts-wqy-zenhei \
    fonts-wqy-microhei \
    2>/dev/null || true

  step "安装额外字体..."
  apt_install \
    fonts-liberation \
    fonts-dejavu \
    fonts-freefont-ttf \
    2>/dev/null || true

  step "配置 locale..."
  apt_install locales 2>/dev/null || true
  if $IS_ROOT; then
    locale-gen zh_CN.UTF-8 2>/dev/null || true
    locale-gen en_US.UTF-8 2>/dev/null || true
    update-locale LANG=zh_CN.UTF-8 2>/dev/null || true
  else
    sudo locale-gen zh_CN.UTF-8 2>/dev/null || true
    sudo locale-gen en_US.UTF-8 2>/dev/null || true
    sudo update-locale LANG=zh_CN.UTF-8 2>/dev/null || true
  fi

  # 刷新字体缓存
  fc-cache -fv 2>/dev/null || true

  success "字体和本地化安装完成"
}

# ── Step 5: 修复 Termux/proot 特有问题 ─────────────────────
fix_termux_issues() {
  banner "Step 5/6: 修复 Termux/proot 兼容性问题..."

  # 1. /dev/shm — Android 限制 SysV IPC
  step "检查 /dev/shm..."
  if [ ! -d /dev/shm ]; then
    mkdir -p /dev/shm 2>/dev/null || warn "无法创建 /dev/shm (proot 限制)"
  fi
  chmod 1777 /dev/shm 2>/dev/null || warn "无法修改 /dev/shm 权限"

  # 2. /tmp/.X11-unix — X11 socket 目录
  step "确保 X11 socket 目录存在..."
  mkdir -p /tmp/.X11-unix
  chmod 1777 /tmp/.X11-unix 2>/dev/null || true

  # 3. Chrome 沙箱 — proot 下无法使用 Chrome sandbox
  step "配置 Chrome/Chromium 无沙箱模式 (proot 兼容)..."
  # 创建包装脚本，自动添加 --no-sandbox --disable-gpu
  for browser_name in google-chrome chromium-browser chromium; do
    browser_path=$(command -v "$browser_name" 2>/dev/null || true)
    if [ -n "$browser_path" ] && [ "$browser_path" != "/usr/local/bin/$browser_name" ]; then
      real_path=$(readlink -f "$browser_path" 2>/dev/null || echo "$browser_path")
      cat > "/usr/local/bin/$browser_name" <<SCRIPT
#!/bin/bash
exec $real_path --no-sandbox --disable-gpu --disable-dev-shm-usage "\$@"
SCRIPT
      chmod +x "/usr/local/bin/$browser_name"
      info "已为 $browser_name 添加 --no-sandbox 包装 (实际: $real_path)"
    fi
  done

  # 4. 创建 Chrome 启动桌面快捷方式
  step "创建桌面快捷方式..."
  mkdir -p /usr/share/applications
  cat > /usr/share/applications/chromium-browser.desktop <<'DESKTOP'
[Desktop Entry]
Version=1.0
Name=Chromium Web Browser
GenericName=Web Browser
Comment=Access the Internet
Exec=chromium-browser --no-sandbox --disable-gpu --disable-dev-shm-usage %U
Terminal=false
Type=Application
Icon=chromium
Categories=Network;WebBrowser;
DESKTOP

  # 5. 确保用户 chrome 配置目录存在
  step "确保 Chrome 配置目录..."
  mkdir -p ~/.config/chromium 2>/dev/null || true
  mkdir -p ~/.config/google-chrome 2>/dev/null || true

  success "Termux/proot 兼容性修复完成"
}

# ── Step 6: 验证安装并输出信息 ─────────────────────────────
verify_and_summary() {
  banner "Step 6/6: 验证安装..."

  local all_ok=true

  # 验证 VNC 组件
  echo ""
  echo -e "  ${BOLD}VNC 远程桌面组件:${NC}"
  for cmd in Xvfb x11vnc; do
    if command -v "$cmd" &>/dev/null; then
      success "  $cmd: $(command -v "$cmd")"
    else
      err "  $cmd: 未安装"
      all_ok=false
    fi
  done
  if command -v websockify &>/dev/null || python3 -c "import websockify" 2>/dev/null; then
    success "  websockify: 已安装"
  else
    err "  websockify: 未安装"
    all_ok=false
  fi

  # 验证窗口管理器
  echo ""
  echo -e "  ${BOLD}窗口管理器:${NC}"
  for wm in fluxbox openbox xfce4-session icewm jwm twm; do
    if command -v "$wm" &>/dev/null; then
      success "  $wm: 已安装"
      break
    fi
  done

  # 验证浏览器
  echo ""
  echo -e "  ${BOLD}浏览器:${NC}"
  for browser in google-chrome chromium-browser chromium; do
    if command -v "$browser" &>/dev/null; then
      success "  $browser: $(command -v "$browser")"
      break
    fi
  done
  if ! command -v google-chrome &>/dev/null && \
     ! command -v chromium-browser &>/dev/null && \
     ! command -v chromium &>/dev/null; then
    err "  浏览器: 未安装"
    all_ok=false
  fi

  # 验证字体
  echo ""
  echo -e "  ${BOLD}中文字体:${NC}"
  if fc-list :lang=zh 2>/dev/null | head -1 | grep -q .; then
    success "  中文字体已安装"
  else
    warn "  中文字体未检测到"
  fi

  # 输出使用说明
  echo ""
  echo "═══════════════════════════════════════════════════════════"
  if $all_ok; then
    echo -e "  ${SUCCESS}${BOLD}所有组件安装成功！${NC}"
  else
    echo -e "  ${WARN}${BOLD}部分组件安装失败，请查看上方日志${NC}"
  fi
  echo "═══════════════════════════════════════════════════════════"
  echo ""
  echo -e "  ${BOLD}使用方法:${NC}"
  echo ""
  echo "  1. 启动 MyAgent Web 服务:"
  echo -e "     ${ACCENT}myagent-ai web${NC}"
  echo ""
  echo "  2. 在聊天页面点击 🖥️ 远程桌面按钮启动 VNC"
  echo "     或通过 API: POST /api/vnc/start"
  echo ""
  echo "  3. 在管理页面 → 网站管理 → 点击"登录"按钮"
  echo "     系统会自动启动 VNC 并在远程桌面中打开浏览器"
  echo ""
  echo "  4. VNC 连接信息:"
  echo "     noVNC Web: http://<服务器IP>:<服务端口>/vnc/vnc.html"
  echo "     VNC 直连:  <服务器IP>:5900"
  echo ""
  echo -e "  ${WARN}注意:${NC} 在 Termux proot 环境下，Chrome/Chromium"
  echo "  已自动配置 --no-sandbox 模式以兼容 proot 限制。"
  echo ""
}

# ── Main ────────────────────────────────────────────────────
main() {
  echo ""
  echo -e "  ${BOLD}${ACCENT}MyAgent${NC} ${BOLD}— Termux + Ubuntu 远程桌面安装${NC}"
  echo ""

  detect_environment
  install_base_deps
  install_vnc_deps
  install_chrome
  install_fonts_and_locale
  fix_termux_issues
  verify_and_summary
}

main "$@"
