#!/usr/bin/env bash
# ─────────────────────────────────────────────────────────
# Accio Agent 一键安装脚本（curl | bash 兼容版）
#
# 用法：
#   curl -fsSL <本脚本URL> | bash -s [-a 账号ID] [-e acci2|accio] <tar.gz公开URL>
#
# 示例：
#   curl -fsSL https://x.com/install.sh | bash -s https://x.com/my-agent.tar.gz
#   curl -fsSL https://x.com/install.sh | bash -s -a 1693905569 https://x.com/my-agent.tar.gz
# ─────────────────────────────────────────────────────────

# 注意：不用 set -u；curl|bash 环境里未初始化变量+参数展开容易误伤

set -e
set -o pipefail 2>/dev/null || true

# 所有变量提前初始化（避免 unbound 陷阱）
ACCOUNT_ARG=""
EDITION_ARG=""
PKG_URL=""
BASE=""
EDITION=""
ACCOUNT=""
TARGET=""
TMP=""

# ─── 参数解析 ────────────────────────────────────────────
while [ $# -gt 0 ]; do
  case "$1" in
    -a|--account)
      ACCOUNT_ARG="$2"
      shift 2
      ;;
    -e|--edition)
      EDITION_ARG="$2"
      shift 2
      ;;
    -h|--help)
      cat <<'HELP'
用法：
  curl -fsSL <本脚本URL> | bash -s [-a 账号ID] [-e acci2|accio] <tar.gz公开URL>

参数：
  -a <账号ID>     指定安装到哪个账号（多账号时用）
  -e acci2|accio  指定装到 Accio 2 或老版 Accio（默认优先 acci2）
HELP
      exit 0
      ;;
    -*)
      echo "❌ 未知参数：$1"
      exit 1
      ;;
    *)
      PKG_URL="$1"
      shift
      ;;
  esac
done

if [ -z "$PKG_URL" ]; then
  echo "❌ 用法：curl -fsSL <本脚本URL> | bash -s [-a 账号ID] <tar.gz公开URL>"
  exit 1
fi

echo "═══════════════════════════════════════════════════════"
echo "  Accio Agent 一键安装脚本"
echo "═══════════════════════════════════════════════════════"

# ─── 1. 检测客户端根目录 ──────────────────────────────────
ACCI2_DIR="$HOME/.acci2/accounts"
ACCIO_DIR="$HOME/.accio/accounts"

if [ "$EDITION_ARG" = "acci2" ]; then
  if [ -d "$ACCI2_DIR" ] && [ -n "$(ls -A "$ACCI2_DIR" 2>/dev/null)" ]; then
    BASE="$ACCI2_DIR"
    EDITION="Accio 2"
  fi
elif [ "$EDITION_ARG" = "accio" ]; then
  if [ -d "$ACCIO_DIR" ] && [ -n "$(ls -A "$ACCIO_DIR" 2>/dev/null)" ]; then
    BASE="$ACCIO_DIR"
    EDITION="Accio"
  fi
elif [ -n "$EDITION_ARG" ]; then
  echo "❌ -e 只支持 acci2 或 accio"
  exit 1
else
  # 默认优先 acci2
  if [ -d "$ACCI2_DIR" ] && [ -n "$(ls -A "$ACCI2_DIR" 2>/dev/null)" ]; then
    BASE="$ACCI2_DIR"
    EDITION="Accio 2"
  elif [ -d "$ACCIO_DIR" ] && [ -n "$(ls -A "$ACCIO_DIR" 2>/dev/null)" ]; then
    BASE="$ACCIO_DIR"
    EDITION="Accio"
  fi
fi

if [ -z "$BASE" ]; then
  echo "❌ 没找到已登录的 Accio 客户端"
  echo "   请先安装并登录 Accio 后再运行本脚本"
  exit 1
fi
echo "→ 检测到已登录的 $EDITION"
echo "  ($BASE)"

# ─── 2. 挑账号 ───────────────────────────────────────────
# 用 while read 而不是数组，兼容更多 shell
ACCOUNT_LIST=""
ACCOUNT_COUNT=0
for a in "$BASE"/*/; do
  [ -d "$a" ] || continue
  aname="$(basename "$a")"
  ACCOUNT_LIST="$ACCOUNT_LIST$aname
"
  ACCOUNT_COUNT=$((ACCOUNT_COUNT + 1))
done

if [ "$ACCOUNT_COUNT" = "0" ]; then
  echo "❌ $BASE 下没有账号目录"
  exit 1
fi

if [ -n "$ACCOUNT_ARG" ]; then
  # 命令行指定，验证存在（直接检查目录）
  if [ -d "$BASE/$ACCOUNT_ARG" ]; then
    ACCOUNT="$ACCOUNT_ARG"
    echo "→ 账号：$ACCOUNT（用户指定）"
  else
    echo "❌ 账号 $ACCOUNT_ARG 未在本地找到。已登录的账号有："
    for a in "$BASE"/*/; do
      [ -d "$a" ] && echo "   - $(basename "$a")"
    done
    exit 1
  fi
elif [ "$ACCOUNT_COUNT" = "1" ]; then
  ACCOUNT="$(echo "$ACCOUNT_LIST" | head -n1)"
  echo "→ 账号：$ACCOUNT（唯一账号，自动选中）"
else
  # 多账号：挑最近修改的当默认
  ACCOUNT="$(ls -t "$BASE" | head -n1)"
  echo "⚠️  检测到 $ACCOUNT_COUNT 个账号（多店铺）"
  echo "   自动选中最近使用的：$ACCOUNT"
  echo ""
  echo "   如要装到其他账号，请加 -- -a 参数（注意有两个短横线）："
  echo "   curl -fsSL <脚本URL> | bash -s -- -a <账号ID> $PKG_URL"
  echo ""
  echo "   可选账号："
  printf "$ACCOUNT_LIST" | while IFS= read -r a; do [ -n "$a" ] && echo "     - $a"; done
  echo ""
fi

# ─── 3. 下载 tar.gz ─────────────────────────────────────
TMP="$(mktemp -d)"
PKG="$TMP/agent.tar.gz"
echo "→ 下载：$PKG_URL"
if ! curl -fsSL "$PKG_URL" -o "$PKG"; then
  echo "❌ 下载失败：$PKG_URL"
  rm -rf "$TMP"
  exit 1
fi
PKG_SIZE=$(du -h "$PKG" 2>/dev/null | awk '{print $1}')
echo "  ✓ 已下载 ($PKG_SIZE)"

# ─── 4. 解压 & 定位 profile.jsonc ────────────────────────
tar -xzf "$PKG" -C "$TMP"
SRC=""
for p in "$TMP"/*/profile.jsonc "$TMP"/*/*/profile.jsonc; do
  if [ -f "$p" ]; then
    SRC="$(dirname "$p")"
    break
  fi
done
if [ -z "$SRC" ]; then
  echo "❌ tar.gz 结构异常，找不到 profile.jsonc"
  rm -rf "$TMP"
  exit 1
fi

# ─── 5. 提取 name、生成新 DID ────────────────────────────
NAME="$(python3 -c "
import re
try:
  s=open('$SRC/profile.jsonc').read()
  m=re.search(r'\"name\"\s*:\s*\"([^\"]+)\"',s)
  print(m.group(1) if m else 'agent')
except Exception:
  print('agent')
" 2>/dev/null || echo "agent")"

SHORT=$(echo "$NAME" | md5 2>/dev/null | cut -c1-6 | tr 'a-f' 'A-F')
if [ -z "$SHORT" ]; then
  SHORT=$(echo "$NAME" | md5sum 2>/dev/null | cut -c1-6 | tr 'a-f' 'A-F')
fi
if [ -z "$SHORT" ]; then
  SHORT="A$(date +%s | tail -c 5)"
fi

STAMP=$(date +%s | tail -c 5)
RAND=$(openssl rand -hex 3 2>/dev/null | tr 'a-f' 'A-F' || echo "ABCDEF")
NEW_DID="DID-${SHORT}-${SHORT}U${ACCOUNT}-${STAMP}-${RAND}"

TARGET="$BASE/${ACCOUNT}/agents/${NEW_DID}"
echo "→ Agent：$NAME"
echo "→ 目标：$TARGET"

mkdir -p "$TARGET/project" "$TARGET/sessions" "$TARGET/runtime" "$TARGET/resources" "$TARGET/skills" "$TARGET/tools"

# 拷贝文件（含隐藏文件）
cp -R "$SRC/." "$TARGET/" 2>/dev/null || cp -R "$SRC"/* "$TARGET/"

# ─── 6. 本地化 profile.jsonc ─────────────────────────────
python3 <<PYEOF
import re
try:
  p="$TARGET/profile.jsonc"
  s=open(p).read()
  s=re.sub(r'"id"\s*:\s*"[^"]*"',        '"id": "$NEW_DID"',           s, count=1)
  s=re.sub(r'"accountId"\s*:\s*"[^"]*"', '"accountId": "$ACCOUNT"',    s, count=1)
  if '"defaultProject"' in s:
    s=re.sub(r'"dir"\s*:\s*"[^"]*"',     '"dir": "$TARGET/project"',   s, count=1)
  else:
    s=re.sub(r'("runtime"\s*:\s*"[^"]+",)',
             r'\1\n  "defaultProject": {"dir": "$TARGET/project"},',   s, count=1)
  open(p,'w').write(s)
  print('  ✓ profile.jsonc 已本地化')
except Exception as e:
  print(f'  ⚠️ profile 本地化失败: {e}')
PYEOF

# ─── 7. 本地化 skills.jsonc ─────────────────────────────
SKILLS_JSONC="$TARGET/agent-core/skills/skills.jsonc"
if [ -f "$SKILLS_JSONC" ]; then
  python3 <<PYEOF
import re
try:
  p="$SKILLS_JSONC"
  new_base="$TARGET/agent-core/skills"
  s=open(p).read()
  def repl(m):
    old=m.group(1)
    tail=old.split('/agent-core/skills/',1)[-1]
    return '"installPath": "'+new_base+'/'+tail+'"'
  s2=re.sub(r'"installPath"\s*:\s*"([^"]+)"', repl, s)
  open(p,'w').write(s2)
  n=len(re.findall(r'"installPath"',s2))
  print(f'  ✓ {n} 个 skill 的 installPath 已本地化')
except Exception as e:
  print(f'  ⚠️ skills 本地化失败: {e}')
PYEOF
fi

rm -rf "$TMP"

FILE_COUNT=$(find "$TARGET" -type f 2>/dev/null | wc -l | tr -d ' ')
echo ""
echo "═══════════════════════════════════════════════════════"
echo "  ✅ 安装完成"
echo "═══════════════════════════════════════════════════════"
echo "  Agent：$NAME"
echo "  文件数：$FILE_COUNT"
echo ""
echo "  👉 请重启 $EDITION 客户端，即可在列表中看到「$NAME」"
echo "═══════════════════════════════════════════════════════"
