#!/bin/bash
# ============================================================================
#   MantrikaTools Online Installer (macOS / Apple Silicon arm64)
# ----------------------------------------------------------------------------
#   用法（官网/邮件里给用户的一行命令）：
#     curl -fsSL https://dl.mantrikasound.com/install-mac.sh | bash
#
#   做的事：
#     1. 拉 index.xml，取第一个 <version>（最新版）里 darwin-arm64/all 的资源
#     2. 全部下载到临时目录（半途失败不会污染安装目录）
#     3. overlay 进 REAPER/UserPlugins —— 逐文件覆盖，不删用户自己放的东西
#        （与 ReaPack 安装结果逐字节一致；"MantrikaTools Config" 不整目录重建）
#
#   为什么是 curl|bash 而不是 zip+.command：
#     终端里跑的脚本没有 quarantine、没有可执行位、没有签名/公证问题，
#     macOS 15 的 Gatekeeper 拦不到它。下载的文件由 curl 落盘，同样不带
#     com.apple.quarantine（保险起见仍显式清一遍）。
#
#   注意：通过管道执行，stdin 不是终端 —— 全程不许 read / 交互。
# ============================================================================

INDEX_URL="https://dl.mantrikasound.com/index.xml"
REAPER_DIR="$HOME/Library/Application Support/REAPER"
TARGET="$REAPER_DIR/UserPlugins"

echo "============================================"
echo "  MantrikaTools Online Installer (macOS arm64)"
echo "============================================"
echo

die() {
    echo
    echo "[ERROR] $1"
    [ -n "$2" ] && echo "        $2"
    echo
    exit 1
}

# ---- 架构检查：仅支持 Apple Silicon ---------------------------------------
ARCH="$(uname -m)"
if [ "$ARCH" != "arm64" ]; then
    die "This build supports Apple Silicon (arm64) only." "Current architecture: $ARCH (Intel Macs are not supported.)"
fi

# ---- 检查 REAPER 是否装过并至少启动过一次 ---------------------------------
if [ ! -d "$REAPER_DIR" ]; then
    die "REAPER user folder not found: $REAPER_DIR" "Please install REAPER and launch it at least once, then run this installer again."
fi

# ---- 拉 index，取最新版本块 ------------------------------------------------
echo "Fetching release index..."
INDEX="$(curl -fsSL "$INDEX_URL")" || die "Failed to download release index." "$INDEX_URL"

# index.xml 由 release.mjs 生成，<source> 保证一行一条（这是解析契约，
# 生成端有注释互相锁定）。第一个 <version> 即最新版。
BLOCK="$(printf '%s\n' "$INDEX" | awk '/<version /{f=1} f{print; if (/<\/version>/) exit}')"
VERSION="$(printf '%s\n' "$BLOCK" | sed -nE 's/.*<version name="([^"]*)".*/\1/p' | head -1)"
[ -n "$VERSION" ] || die "Could not find a version entry in the index." "$INDEX_URL"

SOURCES="$(printf '%s\n' "$BLOCK" | grep -E '<source platform="(darwin-arm64|all)"')"
[ -n "$SOURCES" ] || die "No macOS files listed for version $VERSION."

echo "Latest version: $VERSION"
echo

# ---- 全部先下到临时目录（原子性：装一半失败不碰 UserPlugins） --------------
# 本次目录由 EXIT trap 负责清理（成功/die/Ctrl+C 全覆盖）；上次强杀/关窗留下的
# 残留在这里顺手扫掉 —— 只删超过 1 小时的，防两个安装并发时互删。
TMPROOT="${TMPDIR:-/tmp}"
find "$TMPROOT" -maxdepth 1 -name 'mtk-install.*' -type d -mmin +60 -exec rm -rf {} + 2>/dev/null
TMP="$(mktemp -d "$TMPROOT/mtk-install.XXXXXX")" || die "Failed to create temp directory."
trap 'rm -rf "$TMP"' EXIT
trap 'exit 130' INT TERM  # 信号转普通退出：bash 被信号杀死时不跑 EXIT trap，转一手才保证清理

unescape() { sed -e 's/&quot;/"/g' -e 's/&lt;/</g' -e 's/&gt;/>/g' -e 's/&amp;/\&/g'; }

echo "Downloading..."
while IFS= read -r line; do
    rel="$(printf '%s' "$line" | sed -E 's/.*file="([^"]*)".*/\1/' | unescape)"
    url="$(printf '%s' "$line" | sed -E 's|.*<source[^>]*>[[:space:]]*([^<]*)</source>.*|\1|')"
    { [ -n "$rel" ] && [ -n "$url" ]; } || die "Failed to parse index entry:" "$line"
    mkdir -p "$TMP/$(dirname "$rel")"
    curl -fsSL -o "$TMP/$rel" "$url" || die "Download failed:" "$url"
    echo "  [OK] $rel"
done <<< "$SOURCES"

# curl 不会打 quarantine，但显式清一遍稳妥（ditto 会连 xattr 一起带过去）
xattr -dr com.apple.quarantine "$TMP" 2>/dev/null

# ---- overlay 进 UserPlugins：同名覆盖，用户自己放的其它文件保留 ------------
mkdir -p "$TARGET"
echo
echo "Installing to: $TARGET"
ditto "$TMP" "$TARGET" || die "Failed to copy files into:" "$TARGET"

echo
echo "============================================"
echo "  Done ($VERSION). Please restart REAPER."
echo "============================================"
echo
echo "Opening UserPlugins folder..."
open "$TARGET" 2>/dev/null
exit 0
