#!/bin/bash
# AIPM 会议纪要 - 本地转写插件 一键安装（Linux / macOS）
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
VENV="$SCRIPT_DIR/venv"
EMBED_DIR="$SCRIPT_DIR/python313"
PY_EXE=""
EMBED=""

echo ""
echo "============================================================"
echo " AIPM 会议纪要 - 本地转写插件 一键安装"
echo "============================================================"
echo ""
echo "安装目录：$SCRIPT_DIR"
echo ""

# ── 0) 预检文件完整性 ──
echo "[0/5] 预检插件文件..."
for f in server.py start.sh; do
  if [ ! -f "$SCRIPT_DIR/$f" ]; then
    echo "  [X] 缺少 $f（请确保所有插件文件在同一目录）"
    echo "      请从 AIPM 会议纪要页重新下载 zip 并解压。"
    exit 1
  fi
done
echo "      server.py / start.sh OK"

# ── 1) 检测 Python（3.9 ~ 3.13）──
echo "[1/5] 检测 Python（需 3.9 ~ 3.13）..."
detect_python() {
  local cmd="$1"
  if command -v "$cmd" >/dev/null 2>&1; then
    local ver=$($cmd --version 2>/dev/null | awk '{print $2}')
    if [ -n "$ver" ]; then
      local maj=$(echo "$ver" | cut -d. -f1)
      local min=$(echo "$ver" | cut -d. -f2)
      if [ "$maj" = "3" ] && [ "$min" -ge 9 ] && [ "$min" -le 13 ]; then
        PY_EXE="$cmd"
        PYVER="$ver"
        echo "      找到 $cmd ($ver)"
        return 0
      fi
    fi
  fi
  return 1
}

detect_python python || detect_python python3
if [ -z "$PY_EXE" ]; then
  # 尝试 py launcher 的各版本
  for v in 3.13 3.12 3.11 3.10 3.9; do
    if command -v py >/dev/null 2>&1 && py -$v --version >/dev/null 2>&1; then
      PY_EXE="py"
      PYSEL="-$v"
      PYVER=$(py -$v --version 2>/dev/null | awk '{print $2}')
      echo "      找到 py $v ($PYVER)"
      break
    fi
  done
fi

if [ -z "$PY_EXE" ]; then
  echo "  [!] 未检测到兼容的 Python（3.9~3.13）"
  echo "  [!] 请先安装 Python 3.9~3.13："
  echo "      Ubuntu/Debian: sudo apt install python3.12-venv"
  echo "      macOS: brew install python@3.13"
  echo "      或 https://www.python.org/downloads/"
  exit 1
fi

# ── 2) 创建虚拟环境 ──
echo "[2/5] 创建 Python 虚拟环境..."
if [ ! -x "$VENV/bin/python" ]; then
  echo "      正在创建 $VENV ..."
  $PY_EXE ${PYSEL:-} -m venv "$VENV"
fi
VENV_PY="$VENV/bin/python"
PIP="$VENV_PY -m pip"
echo "      运行环境：$VENV_PY"

# ── 3) 安装依赖 ──
echo "[3/5] 安装依赖（faster-whisper / flask / funasr 等）..."
MIRROR="https://mirrors.aliyun.com/pypi/simple"

OK=0
for retry in 1 2 3; do
  if [ "$OK" = "0" ]; then
    echo "--- 第 $retry / 3 次尝试 ---"
    $PIP install -U pip --trusted-host mirrors.aliyun.com -i "$MIRROR" >/dev/null 2>&1
    echo "      已升级 pip"

    echo "      正在安装核心依赖（faster-whisper flask flask-cors av）..."
    if $PIP install faster-whisper flask flask-cors av --trusted-host mirrors.aliyun.com -i "$MIRROR"; then
      echo "      核心依赖 OK"

      echo "      正在安装 torch CPU（约 200MB，请耐心等待，含国内镜像兜底）..."
      TORCH_OK=0
      if $PIP install torch torchaudio --index-url https://download.pytorch.org/whl/cpu >/dev/null 2>&1; then
        TORCH_OK=1
      else
        echo "        官方 pytorch 源失败，改用清华 pytorch 镜像..."
        if $PIP install torch torchaudio --index-url https://mirrors.tuna.tsinghua.edu.cn/pytorch/wheels/cpu/ >/dev/null 2>&1; then
          TORCH_OK=1
        else
          echo "        清华镜像失败，改用阿里云 PyPI（可能拉取 CUDA 版）..."
          if $PIP install torch torchaudio --trusted-host mirrors.aliyun.com -i "$MIRROR" >/dev/null 2>&1; then
            TORCH_OK=1
          fi
        fi
      fi
      if [ "$TORCH_OK" = "1" ]; then echo "      torch OK"; else echo "      [X] torch 安装失败（方言将不可用）"; fi

      echo "      正在安装 funasr（方言识别引擎）..."
      FU_OK=0
      if $PIP install -U funasr --trusted-host mirrors.aliyun.com -i "$MIRROR" >/dev/null 2>&1; then
        FU_OK=1
      else
        echo "        阿里云失败，改用官方 PyPI..."
        if $PIP install -U funasr >/dev/null 2>&1; then
          FU_OK=1
        fi
      fi
      if [ "$FU_OK" = "1" ]; then echo "      funasr OK"; else echo "      [X] funasr 安装失败（方言将不可用）"; fi

      OK=1
    else
      echo "      安装失败，3 秒后重试..."
      sleep 3
    fi
  fi
done

if [ "$OK" = "0" ]; then
  echo ""
  echo "  [X] 依赖安装反复失败（已重试 3 次）"
  echo "      请检查网络后重新运行本脚本。"
  exit 1
fi

# ── 3.5) 方言依赖硬校验：装不上则显式报错并中止，不再静默降级 ──
if ! $VENV_PY -c "import torch, funasr" >/dev/null 2>&1; then
  echo ""
  echo "  ============================================================"
  echo "   [X] 方言依赖安装失败：torch / funasr 未能安装"
  echo "  ============================================================"
  echo "   普通话转写可正常使用，但 上海话 / 粤语 / 四川话 等方言将不可用。"
  echo "   常见原因：无法访问 PyTorch 下载源（国内网络常因防火墙/代理失败）。"
  echo "   请手动安装后重新运行本脚本，或确保网络可访问下载源："
  echo "     $VENV_PY -m pip install torch torchaudio -i https://mirrors.tuna.tsinghua.edu.cn/pytorch/wheels/cpu/"
  echo "     $VENV_PY -m pip install -U funasr -i https://mirrors.aliyun.com/pypi/simple"
  echo "  ============================================================"
  exit 1
fi

# ── 4) 校验 ──
echo "[4/5] 校验安装结果..."
$VENV_PY -c "import faster_whisper; print('  [OK] faster-whisper', faster_whisper.__version__)" 2>/dev/null || echo "  [X] faster_whisper 校验失败"
$VENV_PY -c "import flask; print('  [OK] flask', flask.__version__)" 2>/dev/null || echo "  [X] flask 校验失败"
$VENV_PY -c "import av; print('  [OK] av(PyAV)', av.__version__)" 2>/dev/null || echo "  [X] av 校验失败"
$VENV_PY -c "import torch; print('  [OK] torch', torch.__version__)" 2>/dev/null || echo "  [!] torch 未安装"
$VENV_PY -c "import funasr; print('  [OK] funasr', funasr.__version__)" 2>/dev/null || echo "  [!] funasr 未安装"

if command -v ffmpeg >/dev/null 2>&1; then
  echo "  [提示] 系统 ffmpeg 可用（备用）"
else
  echo "  [提示] 系统无 ffmpeg（不影响使用，插件使用 PyAV 内置解码器）"
fi

# ── 5) 完成 ──
echo "[5/5] 安装完成！"
echo ""
echo "============================================================"
echo "  ✅ 全部就绪！请运行 ./start.sh 启动本地转写服务"
echo "============================================================"
echo ""
