#!/usr/bin/env bash
# 每日行情 - 一键部署脚本 (Ubuntu/Debian)
#
# 用法:
#   sudo bash deploy/install.sh                    # 使用默认部署用户 daily-market
#   sudo DEPLOY_USER=www bash deploy/install.sh    # 指定部署用户
#   sudo SKIP_CADDY=1 bash deploy/install.sh       # 跳过 Caddy 配置（已有 Caddy）
#
# 部署后:
#   - 应用目录: /opt/daily-market
#   - 虚拟环境: /opt/daily-market/.venv
#   - Web 服务: systemd daily-market-web (127.0.0.1:8765)
#   - 定时抓取: systemd daily-market-crawl.timer (每天 22:00 北京时间)
#   - Caddy 反代: 80 端口 → 127.0.0.1:8765
set -euo pipefail

# ==================== 配置 ====================
APP_DIR="/opt/daily-market"
VENV_DIR="${APP_DIR}/.venv"
DEPLOY_USER="${DEPLOY_USER:-daily-market}"
WEB_PORT=8765
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "${SCRIPT_DIR}")"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info()  { echo -e "${GREEN}[INFO]${NC} $*"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; }

# ==================== 前置检查 ====================
[[ $EUID -eq 0 ]] || error "请使用 sudo 运行: sudo bash deploy/install.sh"

info "部署目录: ${APP_DIR}"
info "部署用户: ${DEPLOY_USER}"
info "Web 端口: ${WEB_PORT} (仅本地 127.0.0.1)"

# ==================== 1. 安装系统依赖 ====================
info "安装系统依赖..."
apt-get update -qq
apt-get install -y -qq python3 python3-venv python3-pip caddy > /dev/null
info "系统依赖安装完成 (python3, caddy)"

# ==================== 2. 创建部署用户 ====================
if ! id -u "${DEPLOY_USER}" &>/dev/null; then
    info "创建部署用户: ${DEPLOY_USER}"
    useradd -r -m -d "/home/${DEPLOY_USER}" -s /bin/bash "${DEPLOY_USER}"
else
    info "用户 ${DEPLOY_USER} 已存在，跳过创建"
fi

# ==================== 3. 部署应用代码 ====================
info "部署应用代码到 ${APP_DIR}..."

# 首次部署：复制代码；已存在则增量更新
if [[ ! -d "${APP_DIR}" ]]; then
    mkdir -p "${APP_DIR}"
    cp -r "${PROJECT_DIR}"/* "${APP_DIR}/"
    info "首次部署，已复制项目文件"
else
    info "目录已存在，增量更新源码和配置..."
    # 同步 src/ run.py requirements.txt deploy/
    cp -r "${PROJECT_DIR}/src" "${APP_DIR}/"
    cp "${PROJECT_DIR}/run.py" "${APP_DIR}/"
    cp "${PROJECT_DIR}/requirements.txt" "${APP_DIR}/"
    cp -r "${PROJECT_DIR}/deploy" "${APP_DIR}/"
fi

# 清理 Python 缓存
find "${APP_DIR}/src" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true

# ==================== 4. 创建虚拟环境 ====================
info "创建 Python 虚拟环境..."
python3 -m venv "${VENV_DIR}"
"${VENV_DIR}/bin/pip" install --upgrade pip -q
"${VENV_DIR}/bin/pip" install -r "${APP_DIR}/requirements.txt" -q
info "Python 依赖安装完成"

# ==================== 5. 设置权限 ====================
info "设置目录权限..."
chown -R "${DEPLOY_USER}:${DEPLOY_USER}" "${APP_DIR}"
chmod -R u+rwX,g+rX,o+rX "${APP_DIR}"

# ==================== 6. 配置 systemd ====================
info "配置 systemd 服务..."

# 生成 web service 配置（替换占位符）
sed -e "s|DEPLOY_USER|${DEPLOY_USER}|g" \
    -e "s|APP_DIR|${APP_DIR}|g" \
    -e "s|DEPLOY_VENV|${VENV_DIR}|g" \
    "${APP_DIR}/deploy/daily-market-web.service" \
    > /etc/systemd/system/daily-market-web.service

# 生成 crawl service 配置
sed -e "s|DEPLOY_USER|${DEPLOY_USER}|g" \
    -e "s|APP_DIR|${APP_DIR}|g" \
    -e "s|DEPLOY_VENV|${VENV_DIR}|g" \
    "${APP_DIR}/deploy/daily-market-crawl.service" \
    > /etc/systemd/system/daily-market-crawl.service

# crawl timer 无需替换
cp "${APP_DIR}/deploy/daily-market-crawl.timer" \
   /etc/systemd/system/daily-market-crawl.timer

systemctl daemon-reload
systemctl enable daily-market-web.service
systemctl enable daily-market-crawl.timer

info "启动 Web 服务..."
systemctl restart daily-market-web.service
sleep 1
systemctl is-active --quiet daily-market-web.service \
    && info "Web 服务已启动 (127.0.0.1:${WEB_PORT})" \
    || error "Web 服务启动失败，请检查: journalctl -u daily-market-web -n 50"

info "启用定时抓取任务..."
systemctl start daily-market-crawl.timer
systemctl is-active --quiet daily-market-crawl.timer \
    && info "定时任务已启用" \
    || error "定时任务启用失败"

# ==================== 7. 配置 Caddy ====================
if [[ "${SKIP_CADDY:-0}" != "1" ]]; then
    info "配置 Caddy 反向代理..."
    CADDYFILE="/etc/caddy/Caddyfile"

    # 备份原有配置
    [[ -f "${CADDYFILE}" ]] && cp "${CADDYFILE}" "${CADDYFILE}.bak.$(date +%s)"

    cat > "${CADDYFILE}" <<EOF
# 每日行情 - Caddy 反向代理配置
# 如需使用域名和 HTTPS，将 :80 改为 your-domain.com，Caddy 会自动申请证书
:80 {
    reverse_proxy 127.0.0.1:${WEB_PORT}

    header /data/* Cache-Control "public, max-age=300"
    header /site/* Cache-Control "public, max-age=300"

    log {
        output file /var/log/caddy/daily-market.log
        format console
    }
}
EOF

    mkdir -p /var/log/caddy
    chown caddy:caddy /var/log/caddy 2>/dev/null || true

    systemctl enable caddy
    systemctl restart caddy
    sleep 1
    systemctl is-active --quiet caddy \
        && info "Caddy 已启动 (80 端口 → 127.0.0.1:${WEB_PORT})" \
        || warn "Caddy 启动失败，请检查: journalctl -u caddy -n 50"
else
    warn "已跳过 Caddy 配置 (SKIP_CADDY=1)"
fi

# ==================== 8. 首次抓取（可选） ====================
info ""
info "==================== 部署完成 ===================="
info "应用目录:       ${APP_DIR}"
info "虚拟环境:       ${VENV_DIR}"
info "Web 服务:       http://localhost (Caddy) → 127.0.0.1:${WEB_PORT} (Python)"
info "定时抓取:       每天 22:00 (北京时间)"
info ""
info "常用命令:"
info "  手动抓取:       sudo -u ${DEPLOY_USER} ${VENV_DIR}/bin/python ${APP_DIR}/run.py"
info "  查看抓取日志:   journalctl -u daily-market-crawl -f"
info "  查看 Web 日志:  journalctl -u daily-market-web -f"
info "  查看定时状态:   systemctl list-timers daily-market-crawl"
info "  重启 Web:       sudo systemctl restart daily-market-web"
info "  停止定时:       sudo systemctl stop daily-market-crawl.timer"
info ""
info "是否立即执行首次抓取？(y/N)"
read -r -t 30 ANSWER || true
if [[ "${ANSWER:-N}" =~ ^[Yy]$ ]]; then
    info "执行首次抓取..."
    sudo -u "${DEPLOY_USER}" "${VENV_DIR}/bin/python" "${APP_DIR}/run.py" --boards 10,151 --max-pages 5
    info "首次抓取完成，访问 http://localhost/site/index.html 查看结果"
else
    info "跳过首次抓取，可稍后手动执行或等待定时任务"
fi
