#!/bin/bash
# @desc: rsync 同步: REMOTE_HOST/SSH_PORT/REMOTE_ROOT 已预置
# @usage: wcl rsync [本地路径]
#   不带参数同步 REMOTE_ROOT 指向的目录
#   例: wcl rsync ./data

# ========= 配置区 =========
REMOTE_USER="wangchunlin"
# REMOTE_HOST="p2p1.melulu.top"
REMOTE_HOST="nps.melulu.top"
REMOTE_ROOT="/volume2/rsync"
SSH_PORT="10022"                 # 单独定义端口
export RSYNC_RSH="ssh -p $SSH_PORT" # 设置 rsync 使用的 ssh 参数
RSYNC_BASE="rsync -avP"
# =========================

usage() {
    echo "用法："
    echo
    echo "  默认 push（上传）："
    echo "      $0 <文件或目录>"
    echo "      $0 <文件或目录> --delete"
    echo
    echo "  pull（下载）："
    echo "      $0 pull <远端目录> [本地路径] [--delete]"
    echo
    echo "说明："
    echo "  push："
    echo "      自动判断文件/目录："
    echo "         - 带 / → 强制目录"
    echo "         - 不带 / → 若本地有同名文件则视为文件，否则视为目录"
    echo "      文件会自动上传到新建的时间戳目录中"
    echo "      push 加 --delete：删除远端多余文件"
    echo
    echo "  pull："
    echo "      拉取远端目录到本地路径（默认当前目录）"
    echo "      pull 加 --delete：删除本地多余文件（保持与远端完全一致）"
    echo
    exit 1
}

if [ $# -lt 1 ]; then
    usage
fi

# ================================
#            PULL 模式
# ================================
if [ "$1" = "pull" ]; then

    if [ $# -lt 2 ]; then
        usage
    fi

    REMOTE_DIR="$2"

    # 本地目标目录
    if [ -z "$3" ] || [ "$3" = "--delete" ]; then
        LOCAL_DEST="./${REMOTE_DIR}"
        OPT="$3"
    else
        LOCAL_DEST="$3"
        OPT="$4"
    fi

    mkdir -p "$LOCAL_DEST"

    RSYNC_CMD="$RSYNC_BASE"

    if [ "$OPT" = "--delete" ]; then
        echo "启用 --delete：本地多余文件将被删除。"
        RSYNC_CMD="$RSYNC_CMD --delete"
    fi

    echo "从远端下载：${REMOTE_ROOT}/${REMOTE_DIR}"
    echo "保存到本地：${LOCAL_DEST}"

    $RSYNC_CMD "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_ROOT}/${REMOTE_DIR}/" "$LOCAL_DEST"

    echo "下载完成。"
    exit 0
fi


# ================================
#      PUSH（默认行为）
# ================================
SRC="$1"

# ---- 判断文件或目录（避免 rsync 嵌套坑） ----
if [[ "$SRC" == */ ]]; then
    CLEAN_SRC="${SRC%/}"
    REAL_SRC="${CLEAN_SRC}/"
else
    if [ -f "$SRC" ]; then
        REAL_SRC="$SRC"
    else
        REAL_SRC="${SRC}/"
    fi
fi
# ---------------------------------------------

BASENAME=$(basename "$REAL_SRC")
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")

RSYNC_CMD="$RSYNC_BASE"

if [ "$2" = "--delete" ]; then
    echo "启用 --delete：远端多余文件将被删除。"
    RSYNC_CMD="$RSYNC_CMD --delete"
fi

# ---- 文件和目录分别决定远端路径 ----
if [[ "$REAL_SRC" == */ ]]; then
    # 目录：直接同步到远端同名目录
    DEST="${REMOTE_ROOT}/${BASENAME}"
    
    echo "开始上传目录到远端：$DEST"
    $RSYNC_CMD "$REAL_SRC" "${REMOTE_USER}@${REMOTE_HOST}:${DEST}"
else
    # 文件：新建 [文件名_时间戳] 的目录，并把文件放入其中
    DEST_DIR="${REMOTE_ROOT}/${BASENAME}_${TIMESTAMP}"
    
    echo "开始上传文件到目录：$DEST_DIR/"
    # 注意：目标路径最后必须带 /，rsync 才会自动创建目录并把文件放进去
    $RSYNC_CMD "$REAL_SRC" "${REMOTE_USER}@${REMOTE_HOST}:${DEST_DIR}/"
fi
# -----------------------------------

echo "上传完成。"