 #!/system/bin/sh
# 以 root 执行：sh /data/local/tmp/install_models.sh
# ZIP 根目录中的模型文件直接写入 /data/adb/model/，不额外套一层目录。
set -eu
umask 022

URL='https://gh-proxy.org/https://github.com/enenH/dfm-pak-cover-model-dumper/releases/download/v1.0/models.zip'
DEST_DIR='/data/adb/model'

die() {
    printf '错误：%s\n' "$*" >&2
    exit 1
}

[ "$(id -u)" = '0' ] || die '请使用 root 权限执行此脚本。'

# 兼容 Magisk、KernelSU、APatch 中未加入 PATH 的 BusyBox。
BUSYBOX=''
for candidate in "$(command -v busybox 2>/dev/null || :)" \
    /data/adb/magisk/busybox \
    /data/adb/ksu/bin/busybox \
    /data/adb/ap/bin/busybox; do
    if [ -n "$candidate" ] && [ -x "$candidate" ]; then
        BUSYBOX="$candidate"
        break
    fi
done

busybox_has() {
    [ -n "$BUSYBOX" ] && "$BUSYBOX" --list | grep -qx "$1"
}

if command -v unzip >/dev/null 2>&1; then
    UNZIP_MODE='native'
elif busybox_has unzip; then
    UNZIP_MODE='busybox'
else
    die '未找到 unzip，请安装带 unzip 的 BusyBox。'
fi

unzip_archive() {
    if [ "$UNZIP_MODE" = 'native' ]; then
        unzip "$@"
    else
        "$BUSYBOX" unzip "$@"
    fi
}

if command -v curl >/dev/null 2>&1; then
    DOWNLOADER='curl'
elif command -v wget >/dev/null 2>&1; then
    DOWNLOADER='wget'
elif busybox_has wget; then
    DOWNLOADER='busybox'
else
    die '未找到下载工具，请安装 curl 或支持 HTTPS 的 wget / BusyBox。'
fi

# 独立临时目录避免多次运行相互覆盖；退出时仅删除本次下载文件。
WORK_DIR=$(mktemp -d /data/local/tmp/install-models.XXXXXX) \
    || die '无法创建临时目录，请检查 /data/local/tmp 的权限和剩余空间。'
ZIP_FILE="$WORK_DIR/models.zip"
cleanup() {
    rm -f "$ZIP_FILE" || :
    rmdir "$WORK_DIR" 2>/dev/null || :
}
trap cleanup 0
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM

download_archive() {
    case "$DOWNLOADER" in
        curl)
            curl --fail --location --retry 3 --retry-delay 2 \
                --connect-timeout 20 --max-time 900 \
                --output "$ZIP_FILE" "$URL"
            ;;
        wget)
            wget -T 60 -O "$ZIP_FILE" "$URL"
            ;;
        busybox)
            "$BUSYBOX" wget -T 60 -O "$ZIP_FILE" "$URL"
            ;;
    esac
}

printf '正在下载模型文件：%s\n' "$URL"
download_archive || die '下载失败，未解压或覆盖目标目录。请检查网络和下载链接。'
[ -s "$ZIP_FILE" ] || die '下载结果为空，未解压或覆盖目标目录。'

# 使用 -p 流式检查，不依赖部分 Android unzip 缺少的 -t 选项。
# 先完整读取压缩内容，避免将错误页面或损坏的 ZIP 直接写入目标目录。
printf '正在检查压缩包完整性……\n'
unzip_archive -p "$ZIP_FILE" >/dev/null \
    || die 'ZIP 检查失败，未解压或覆盖目标目录。'

[ ! -L "$DEST_DIR" ] || die '目标目录是符号链接，拒绝写入。'
mkdir -p "$DEST_DIR" || die "无法创建目标目录：$DEST_DIR"

printf '正在解压并强制覆盖到：%s/\n' "$DEST_DIR"
# -o 无需确认即可覆盖同名文件；不删除目标目录中 ZIP 未包含的文件。
unzip_archive -o "$ZIP_FILE" -d "$DEST_DIR" \
    || die '解压失败，可能已有部分文件被覆盖；请检查剩余空间后重新执行。'

printf '完成：模型文件已更新到 %s/\n' "$DEST_DIR"
