#!/bin/bash
# 工具市场资源同步：坚果云 Tools 目录 → 服务器 /mnt/data/tools
#
# 用法：
#   ./sync_tools_to_server.sh              # 同步 + 清理 macOS 元数据垃圾
#   ./sync_tools_to_server.sh --zip        # 再预生成 .zips/*.zip（首下载就不用等）
#
# 三个已实测的坑（2026-09-11）：
#   1) **不要用 rsync**：macOS 自带 rsync 2.6.9 不支持 --info=progress2 等新参数，
#      它会打印用法后 exit 0 —— **静默不传任何数据**（看日志才发现）。必须用 tar 管道。
#   2) **AppleDouble `._*` 是 bsdtar 打包时合成的**，不在本地磁盘上！
#      `find . -name '._*'` 本地 = 0 个，但传过去服务器就冒出 30 个
#      （`._.` / `._UmiOCR-data` / `._.pre_settings` …，mtime 与源文件一致）。
#      所以 **tar --exclude 拦不住**，而且「列归档看有没有」也验证不出来。
#      正解：`COPYFILE_DISABLE=1` 从源头禁止 bsdtar 生成（等效 --no-mac-metadata）。
#   3) tar 提取**不会删除**服务器上已存在的旧垃圾 → 传输后 find 兜底清一遍（双保险）。
set -euo pipefail

SRC="${TOOLS_SRC:-$HOME/Nutstore Files/Downloads_nuc/Tools}"
SSH_ALIAS="${TOOLS_SSH:-hw-backup}"
DST="${TOOLS_DST:-/mnt/data/tools}"

if [ ! -d "$SRC" ]; then echo "❌ 源目录不存在: $SRC" >&2; exit 1; fi
echo "▶ 源: $SRC"
echo "▶ 目标: $SSH_ALIAS:$DST"

ssh "$SSH_ALIAS" "mkdir -p '$DST/.zips'"

# 1) 同步 —— COPYFILE_DISABLE=1 是重点（防 AppleDouble 伴生条目）
cd "$SRC"
COPYFILE_DISABLE=1 tar -cf - \
  --exclude='.DS_Store'   --exclude='*/.DS_Store' \
  --exclude='._*'         --exclude='*/._*' \
  --exclude='.zips'       --exclude='*/.zips' \
  . | ssh "$SSH_ALIAS" "tar -xf - -C '$DST'"

# 2) 兜底清理（清掉历史遗留的，tar 提取不负责删除）
ssh "$SSH_ALIAS" "find '$DST' -name '._*' -type f -delete; \
                  find '$DST' -name '.DS_Store' -type f -delete; \
                  echo '▶ 清理后残留 macOS 元数据文件: '\$(find '$DST' -name '._*' -o -name '.DS_Store' | wc -l) '个'"

# 3) 上报清单
echo "▶ 服务器现状:"
ssh "$SSH_ALIAS" "cd '$DST' && du -sh --exclude=.zips * 2>/dev/null | sort -h"

# 4) 可选：预打包（源目录 mtime 变了才重压）
if [ "${1:-}" = "--zip" ]; then
  echo "▶ 预生成 zip 缓存（首次较慢，之后走缓存）..."
  ssh "$SSH_ALIAS" "cd '$DST' && for d in */; do d=\${d%/}; [ \"\$d\" = '.zips' ] && continue; [ -d \"\$d\" ] || continue; echo -n \"  打包 \$d ... \"; python3 -c \"
import shutil,os,sys
src=os.path.join('$DST', '\$d'); zp=os.path.join('$DST','.zips','\$d.zip')
if os.path.isfile(zp) and os.path.getmtime(zp)>=os.path.getmtime(src): print('已是最新'); sys.exit()
shutil.make_archive(zp+'.part','zip',root_dir=src); os.replace(zp+'.part.zip',zp); print('完成')
\"; done; echo '▶ zip 缓存:'; ls -lh '$DST/.zips' 2>/dev/null | tail -n +2"
fi

echo "✅ 完成。页面: http://<服务器>:8000/tools"
