#!/bin/bash
#
# octop — 飞牛本地版「官方 CLI」包装
#
# 复刻 octop 运行环境后调用 `python -m octop.cli.main`，因此可使用全部官方子命令：
#   octop --help
#   octop version
#   octop provider list
#   octop agent list
#   octop user list
#   ...（还包括 init / run / config / backup / skills / update / clean 等）
#
# 注意：本机 Web 服务由飞牛应用中心托管（cmd/main 拉起 bin/octop），
# 请勿手动执行 `octop run`（会与飞牛管理的实例抢 8089 端口）。
#
# 本包装以 octop-native 身份运行，避免产生 root 所有的数据文件
# （Web 服务本身也以 octop-native 运行，混用 root 会导致后续权限问题）。
# root 调用 sudo 免密；其他用户调用需输入自身 sudo 密码。
#
set -euo pipefail

# 共享函数库（find_python312 / fix_ownership_and_perms / free_octop_ports）
# 打包时由 scripts/build-fpk.sh 注入；仓库内运行无此文件时跳过（函数缺失时再报错）。
# 注意：FPK 解包后 cmd/ 落在 /var/apps/octop-native/cmd（管理目录），而本文件位于
# 负载目录 $TRIM_APPDEST/bin，`$0/../cmd` 指向载荷内不存在的位置，故需回退到
# 外层 cmd 的实际落点。
_OCTOP_COMMON="$(dirname "$0")/../cmd/common.sh"
[ -f "$_OCTOP_COMMON" ] || _OCTOP_COMMON="/var/apps/octop-native/cmd/common.sh"
[ -f "$_OCTOP_COMMON" ] && source "$_OCTOP_COMMON"

APPDEST="${TRIM_APPDEST:-/var/apps/octop-native}"
PKGVAR="${TRIM_PKGVAR:-/var/apps/octop-native/var}"

# 数据目录：优先飞牛 data-share 共享目录，否则回退包内目录
if [ -n "${TRIM_DATA_SHARE_PATHS:-}" ]; then
    DATA_DIR="${TRIM_DATA_SHARE_PATHS%%:*}"
else
    DATA_DIR="$APPDEST/shares/octop-native/data"
fi

mkdir -p "$DATA_DIR" "$PKGVAR"

# 加载安装向导写入的配置（OCTOP_PORT / 管理员账号 等）
if [ -f "$PKGVAR/.env" ]; then
    set -a; . "$PKGVAR/.env"; set +a
fi

# 查找飞牛应用商店提供的 Python 3.12


PY="$(find_python312)" || {
    echo "错误：未找到 Python 3.12，请先在飞牛应用中心安装「Python 3.12」开发工具。" >&2
    exit 1
}

# 关键环境变量：让 octop 找到包本体（site-packages）与你的数据目录
SITE_PACKAGES="$APPDEST/site-packages"
export PYTHONPATH="${SITE_PACKAGES}${PYTHONPATH:+:$PYTHONPATH}"
export HOME="$DATA_DIR"
export OCTOP_HOME="$DATA_DIR/.octop"
export OCTOP_DATA_DIR="$DATA_DIR"

# 内置在线升级优先使用 uv（pip 对 orcakit-harness-agent[all] 依赖树解析会卡死）。
# 系统无 uv 且当前为 root 时自动安装一次（装到系统 Python bin，软链到 /usr/local/bin）。
if [ "$(id -u)" = "0" ] && ! command -v uv >/dev/null 2>&1; then
    "$PY" -m pip install -q --disable-pip-version-check uv 2>/dev/null || true
    if [ -x "$(dirname "$PY")/uv" ]; then
        ln -sf "$(dirname "$PY")/uv" /usr/local/bin/uv 2>/dev/null || true
    fi
fi

# 飞牛 FPK 部署标识 + 打包 site-packages 路径：内置在线升级安装到此目录
# （launcher 实际加载的位置），重启服务后即加载新版，升级真正生效
# （见 src/octop/infra/setup/self_update.py 的 _run_fpk_upgrade）。
export OCTOP_INSTALL_MODE="fpk-native"
export OCTOP_FPK_SITE_PACKAGES="$SITE_PACKAGES"

# 兜底：若包内 octop 未就绪，用内置核心 whl 离线安装（避免联网）
if ! "$PY" -c "import octop" >/dev/null 2>&1; then
    echo "[octop] 未检测到已安装的 Octop，正在用内置核心 whl 离线安装 ..."
    "$PY" -m pip install --no-cache --no-index --find-links "$SITE_PACKAGES" "$SITE_PACKAGES/octop.whl" >/dev/null 2>&1 || {
        echo "[octop] 离线安装失败，请检查网络或手动执行：$PY -m pip install $SITE_PACKAGES/octop.whl" >&2
        exit 1
    }
fi

# 以 octop-native 身份运行，避免产生 root 所有的数据文件
if id octop-native >/dev/null 2>&1 && command -v sudo >/dev/null 2>&1; then
    exec sudo -u octop-native \
        PYTHONPATH="$PYTHONPATH" \
        HOME="$HOME" \
        OCTOP_HOME="$OCTOP_HOME" \
        OCTOP_DATA_DIR="$OCTOP_DATA_DIR" \
        OCTOP_INSTALL_MODE="$OCTOP_INSTALL_MODE" \
        OCTOP_FPK_SITE_PACKAGES="$OCTOP_FPK_SITE_PACKAGES" \
        "$PY" -m octop.cli.main "$@"
else
    exec "$PY" -m octop.cli.main "$@"
fi
