#!/usr/bin/env bash
set -u
# ============================================================
#  Nginx 配置实战 一键脚本（macOS / Linux / WSL）
#  公开源码，欢迎审查 —— 不放心可先复制给 AI 判断
# ============================================================

GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
info()  { echo -e "${GREEN}[INFO]${NC} $1"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
step()  { echo -e "${CYAN}[STEP]${NC} $1"; }

detect_network() {
  step "检测网络环境（国内 / 国外）..."
  if curl -fsI --max-time 5 "https://claude.ai" >/dev/null 2>&1; then
    info "可直连 claude.ai，判定为海外网络"
    echo "overseas"
  else
    warn "无法直连 claude.ai，判定为国内网络环境"
    echo "domestic"
  fi
}

detect_os() {
  if command -v apt >/dev/null 2>&1; then
    echo "debian"
  elif command -v yum >/dev/null 2>&1; then
    echo "centos"
  elif command -v brew >/dev/null 2>&1; then
    echo "macos"
  else
    error "无法识别的系统类型（需要 apt/yum/brew 其中之一）"
    exit 1
  fi
}

install_nginx() {
  local os="$1"
  step "安装 Nginx（${os} 系统）..."

  case "$os" in
    debian)
      if sudo apt update >/dev/null 2>&1 && sudo apt install -y nginx >/dev/null 2>&1; then
        info "Nginx 安装成功（apt）"
        return 0
      fi
      warn "apt 安装失败，尝试国内镜像源..."
      error "请手动执行：sudo apt update && sudo apt install -y nginx"
      return 1
      ;;
    centos)
      if sudo yum install -y epel-release >/dev/null 2>&1 && \
         sudo yum install -y nginx >/dev/null 2>&1; then
        info "Nginx 安装成功（yum + EPEL）"
        return 0
      fi
      warn "yum 安装失败"
      error "请手动执行：sudo yum install -y epel-release nginx"
      return 1
      ;;
    macos)
      if brew install nginx >/dev/null 2>&1; then
        info "Nginx 安装成功（brew）"
        return 0
      fi
      error "brew 安装失败，请确保已安装 Homebrew（https://brew.sh）"
      return 1
      ;;
  esac
}

generate_config() {
  step "生成示例站点配置..."

  local cfg_dir=""
  local os="$1"
  if [ "$os" = "macos" ]; then
    cfg_dir="$(brew --prefix)/etc/nginx/servers"
    mkdir -p "$cfg_dir"
  elif [ "$os" = "centos" ]; then
    cfg_dir="/etc/nginx/conf.d"
  else
    cfg_dir="/etc/nginx/sites-available"
    mkdir -p "$cfg_dir"
  fi

  cat > /tmp/nginx-demo.conf <<'CONF'
server {
    listen 8080;
    server_name _;

    root /var/www/demo-site;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    # 反向代理示例：将 /api/* 转发到本地 3000 端口
    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
CONF

  if [ "$os" = "macos" ]; then
    sudo cp /tmp/nginx-demo.conf "$cfg_dir/demo.conf"
    info "配置文件已写入 $(brew --prefix)/etc/nginx/servers/demo.conf"
  elif [ "$os" = "centos" ]; then
    sudo cp /tmp/nginx-demo.conf "$cfg_dir/demo.conf"
    info "配置文件已写入 ${cfg_dir}/demo.conf"
  else
    sudo cp /tmp/nginx-demo.conf "$cfg_dir/demo.conf"
    sudo rm -f "$cfg_dir/default"
    sudo ln -sf "$cfg_dir/demo.conf" "/etc/nginx/sites-enabled/demo.conf"
    info "配置文件已写入 ${cfg_dir}/demo.conf（已在 sites-enabled 建立软链接）"
  fi

  # 创建演示站点根目录
  sudo mkdir -p /var/www/demo-site
  sudo tee /var/www/demo-site/index.html > /dev/null <<'HTMLEOF'
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8">
<title>Nginx Demo</title></head><body>
<h1>Nginx 示例站点</h1>
<p>恭喜！Nginx 已正确配置并运行。</p>
<p>你在浏览器中看到的是 Nginx 直接返回的静态 HTML。</p>
<p>试着访问 <code>/api/test</code> 体验反向代理（需要先启动 3000 端口的后端）。</p>
</body></html>
HTMLEOF
  info "演示站点根目录：/var/www/demo-site"
}

start_and_verify() {
  step "启动 Nginx 并验证..."

  # 语法检查
  if ! sudo nginx -t 2>&1; then
    error "Nginx 配置语法检查失败！请检查配置文件。"
    return 1
  fi
  info "配置语法检查通过"

  # 启动或重载
  if command -v brew >/dev/null 2>&1; then
    # macOS
    brew services stop nginx 2>/dev/null
    brew services start nginx
  else
    # Linux
    if systemctl is-active --quiet nginx 2>/dev/null; then
      sudo systemctl reload nginx
      info "Nginx 已重载"
    else
      sudo systemctl start nginx
      sudo systemctl enable nginx 2>/dev/null || true
      info "Nginx 已启动"
    fi
  fi

  sleep 2

  # 验证：curl 本机 8080（demo 配置用 8080，避开可能已被占用的 80 端口）
  if curl -fsI --max-time 5 "http://127.0.0.1:8080" >/dev/null 2>&1; then
    info "验证通过！Nginx 正在 8080 端口监听"
    echo ""
    echo "  访问 demo 页面：  http://127.0.0.1:8080"
    echo "  修改配置后记得：  sudo nginx -t && sudo systemctl reload nginx"
  else
    warn "curl 未能连通 8080 端口，Nginx 可能使用了 80 端口（请改为访问 http://127.0.0.1）"
    echo "  访问 demo 页面：  http://127.0.0.1"
  fi
}

main() {
  echo "============================================"
  echo "  Nginx 配置实战 一键脚本"
  echo "  适用于 macOS / Linux / WSL"
  echo "============================================"
  echo ""

  local OS NET
  OS=$(detect_os)
  NET=$(detect_network)

  if ! install_nginx "$OS"; then
    error "Nginx 安装失败。请先手动安装后再运行本脚本。"
    exit 1
  fi

  generate_config "$OS"

  if ! start_and_verify; then
    error "启动或验证失败，请按上方提示手动处理。"
    exit 1
  fi

  echo ""
  echo "============================================"
  info "全部完成！"
  echo "============================================"
}

main "$@"
