#!/bin/bash
# --- [設定區] ---
# 1. 確保拿到環境變數
[ -f ~/.gamerc ] && source ~/.gamerc

# 2. 設定變數 (如果 source 沒拿到，這裡給預設值)
XGA_LOG_IP="104.199.226.218"
TASK_NAME="sync_twolevel_task"
LOCK_FILE="/tmp/${TASK_NAME}.lock"

# 3. *** 關鍵補強：將變數導出給子進程 (如 timeout 內的 bash) ***
export XGA_LOG_IP GAME_TYPE COUNTRY_CODE

# 4. 定義遠端路徑
REMOTE_BASE="${XGA_LOG_IP}::UNCLEAN/${GAME_TYPE}${COUNTRY_CODE}"
export REMOTE_BASE

# --- [鎖定機制] ---
exec 200>"${LOCK_FILE}"

# 嘗試取得鎖定，若 5 分鐘內的上一次排程還在跑，就直接結束
if ! flock -n 200; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ${TASK_NAME} 仍在執行中，跳過本次排程。"
    exit 1
fi

echo $$ >&200

# --- [執行邏輯] ---
# timeout 280s 確保在下次排程 (5分鐘) 前一定會釋放鎖定
timeout 280s bash <<'EOF'
    # 內部變數重新定義 (配合 <<'EOF' 使用)
    REMOTE_BASE_INTERNAL="${XGA_LOG_IP}::UNCLEAN/${GAME_TYPE}${COUNTRY_CODE}"
    RSYNC_OPTS="-avz --timeout=30 --contimeout=10 --size-only"

    # 確保遠端根目錄存在
    rsync --timeout=10 /dev/null "${REMOTE_BASE_INTERNAL}/" >/dev/null 2>&1

    # 搜尋所有伺服器目錄 (移除 -mmin -15，確保不遺漏任何目錄)
    # 限制 maxdepth 避免掃描過深
    find ~/servers* -maxdepth 2 -type d \( -name "*Mission*" -o -name "*World*" -o -name "*Zone*" -o -name "*Society*" \) ! -name "*core*" | while read -r FULL_PATH; do
        
        DIR_NAME=$(basename "${FULL_PATH}")
        
        # 確保遠端子目錄存在
        rsync --timeout=5 /dev/null "${REMOTE_BASE_INTERNAL}/${DIR_NAME}/" >/dev/null 2>&1

        # 同步 *level.log.*
        # --size-only 會快速跳過大小沒變動的舊 Log，效率依然很高
        rsync ${RSYNC_OPTS} \
            --include="*level.log.*" \
            --exclude="*" \
            "${FULL_PATH}/" "${REMOTE_BASE_INTERNAL}/${DIR_NAME}/"
    done
EOF

# 檢查是否因為超時而被中止
if [ $? -eq 124 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告：執行超過 280 秒被強制中止。"
fi
