#!/bin/bash
#
# onlyfake realistic-vision-v4 (FP16) 一键安装 + 启动
# 用法: bash install.sh [--port 8000] [--host 0.0.0.0] [--venv <path>] [--no-install]
#
set -euo pipefail

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

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

MODEL="$BASE_DIR/realistic_vision_v4_fp16.safetensors"
[[ -f "$MODEL" ]] || { echo "错误: 找不到权重文件 $MODEL"; exit 1; }

echo "==> [1/4] 检测 GPU"
if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi -L >/dev/null 2>&1; then
  echo "    检测到 NVIDIA GPU -> 安装 CUDA 版 torch"
  TORCH_EXTRA="--index-url https://download.pytorch.org/whl/cu121"
else
  echo "    未检测到 NVIDIA GPU -> 安装 CPU 版 torch"
  TORCH_EXTRA="--index-url https://download.pytorch.org/whl/cpu"
fi

echo "==> [2/4] 准备虚拟环境 ($VENV)"
python3 -m venv "$VENV" 2>/dev/null || { echo "缺少 python3-venv, 尝试 apt 安装..."; apt-get update -y >/dev/null 2>&1 && apt-get install -y python3-venv >/dev/null 2>&1 && python3 -m venv "$VENV"; }
source "$VENV/bin/activate"

if [[ "$DO_INSTALL" == "1" ]]; then
  echo "==> [3/4] 安装依赖(首次联网, 约几分钟)"
  pip install --upgrade pip >/dev/null 2>&1 || true
  if ! python -c "import diffusers, torch" 2>/dev/null; then
    pip install "torch>=2.0.0" $TORCH_EXTRA
  fi
  pip install diffusers transformers accelerate safetensors fastapi "uvicorn[standard]" pydantic pillow
else
  echo "==> [3/4] 跳过依赖安装 (--no-install)"
fi

echo "==> [4/4] 启动服务  http://$HOST:$PORT"
echo "    权重: $MODEL"
echo "    首次启动会在后台加载模型(CPU 需数分钟), 完成后 /health 返回 ok"
exec uvicorn app:app --host "$HOST" --port "$PORT" --app-dir "$BASE_DIR"
