#!/bin/bash
# onlyfake realistic-vision-v6 (CPU / RAM受限) 一键安装 + 启动
# 用法: bash install.sh [--port 7860] [--host 0.0.0.0] [--force-venv]
set -euo pipefail

PORT=7860
HOST=0.0.0.0
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VENV="$BASE_DIR/.venv"
FORCE_VENV=0

while [[ $# -gt 0 ]]; do
  case "$1" in
    --port) PORT="$2"; shift 2 ;;
    --host) HOST="$2"; shift 2 ;;
    --force-venv) FORCE_VENV=1; shift ;;
    -h|--help)
      echo "usage: bash $0 [--port 7860] [--host 0.0.0.0] [--force-venv]"
      exit 0 ;;
    *) echo "未知参数: $1"; exit 1 ;;
  esac
done

MODEL="$BASE_DIR/weights/Realistic_Vision_V6.0_NV_B1_fp16.safetensors"
VAE="$BASE_DIR/weights/sd-vae-ft-mse.safetensors"

echo "==> [1/4] 检查权重"
[[ -f "$MODEL" ]] || { echo "错误: 缺少 $MODEL"; exit 1; }
[[ -f "$VAE" ]]   || { echo "错误: 缺少 $VAE"; exit 1; }
echo "    RV6 fp16: $(( $(stat -c%s "$MODEL") / 1024 / 1024 )) MB"
echo "    VAE:      $(( $(stat -c%s "$VAE") / 1024 / 1024 )) MB"

echo "==> [2/4] 确保扩 swap(8G, 放在 /data 大分区)"
if ! swapon --show | grep -q '/data/swapfile'; then
  swapoff /data/swapfile 2>/dev/null || true
  fallocate -l 8G /data/swapfile && chmod 600 /data/swapfile && mkswap /data/swapfile >/dev/null && swapon /data/swapfile
  grep -q "/data/swapfile" /etc/fstab || echo "/data/swapfile none swap sw 0 0" >> /etc/fstab
fi
free -h | sed 's/^/    /'

echo "==> [3/4] 准备虚拟环境"
if [[ ! -x "$VENV/bin/python" ]] || [[ "$FORCE_VENV" == "1" ]]; then
  python3 -m venv "$VENV" 2>/dev/null || { apt-get update -y >/dev/null 2>&1; apt-get install -y python3-venv >/dev/null 2>&1; python3 -m venv "$VENV"; }
fi
# shellcheck disable=SC1091
source "$VENV/bin/activate"
pip install -q --upgrade pip 2>/dev/null || true
if ! python -c "import torch, diffusers, fastapi" 2>/dev/null; then
  echo "    首次安装依赖(CPU 版 torch, 约几分钟)..."
  pip install "torch>=2.0.0" --index-url https://download.pytorch.org/whl/cpu
  pip install diffusers transformers accelerate safetensors fastapi "uvicorn[standard]" pydantic pillow
fi
python -c "import torch, diffusers, fastapi; print('    torch', torch.__version__, '| diffusers', diffusers.__version__)"

echo "==> [4/4] 启动服务  http://$HOST:$PORT  (首次加载需数分钟, 见日志)"
exec env OMP_NUM_THREADS=2 MKL_NUM_THREADS=2 \
  "$VENV/bin/python" -m uvicorn app:app --app-dir "$BASE_DIR" --host "$HOST" --port "$PORT"