#!/bin/bash
# ==============================================
# 💬 聊天记录 + 记忆文件 每日备份脚本
# 每天 04:00 由 crontab 触发
# 目标：本地压缩 → smbclient 推送到 Windows 共享 back/ 目录
# ==============================================

set -e

DATE_TAG=$(date +%Y-%m-%d)

# 源路径
SESSIONS_DIR="/root/.openclaw/agents/main/sessions"
WORKSPACE_DIR="/root/.openclaw/workspace"

# SMB 共享目标
SMB_SERVER="//100.70.76.54"
SMB_SHARE="0000sharebak"
SMB_USER="share"
SMB_PASS="share123"
SMB_PATH="back"

TEMP_DIR="/tmp/chat-backup"
LOG_FILE="/var/log/chat-backup.log"
LOCK_FILE="/tmp/chat-backup.lock"

exec 200>"$LOCK_FILE"
flock -n 200 || exit 0

mkdir -p "$TEMP_DIR"
rm -f "$TEMP_DIR"/*.tar.gz

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份..." > "$LOG_FILE"

safe_tar() {
    local archive="$1"
    shift
    if tar -czf "$archive" "$@" 2>>"$LOG_FILE"; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 完成: $(du -h "$archive" | cut -f1)" >> "$LOG_FILE"
    else
        local rc=$?
        if [ $rc -eq 1 ]; then
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 有文件变更警告，但备份已生成" >> "$LOG_FILE"
        else
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ tar 失败 (exit=$rc)" >> "$LOG_FILE"
        fi
    fi
}

# 1. 备份聊天记录
SESSIONS_FILE="$TEMP_DIR/sessions-$DATE_TAG.tar.gz"
if [ -d "$SESSIONS_DIR" ] && [ "$(ls -A "$SESSIONS_DIR" 2>/dev/null)" ]; then
    safe_tar "$SESSIONS_FILE" -C "$SESSIONS_DIR" .
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告: sessions 目录为空，跳过" >> "$LOG_FILE"
    touch "$SESSIONS_FILE"
fi

# 2. 备份记忆文件
MEMORY_FILE="$TEMP_DIR/memory-$DATE_TAG.tar.gz"
if [ -d "$WORKSPACE_DIR" ]; then
    safe_tar "$MEMORY_FILE" -C "$WORKSPACE_DIR" MEMORY.md memory/
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告: workspace 不存在，跳过" >> "$LOG_FILE"
    touch "$MEMORY_FILE"
fi

# 3. 推送到 Windows 共享
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 推送至 $SMB_SERVER/$SMB_SHARE/$SMB_PATH/" >> "$LOG_FILE"
RETRY=0
while [ $RETRY -lt 3 ]; do
    RETRY=$((RETRY + 1))
    smbclient $SMB_SERVER/$SMB_SHARE -U $SMB_USER%$SMB_PASS -m SMB3 -t 300 <<SMBCMDS >> "$LOG_FILE" 2>&1
mkdir $SMB_PATH
cd $SMB_PATH
lcd $TEMP_DIR
put sessions-$DATE_TAG.tar.gz
put memory-$DATE_TAG.tar.gz
SMBCMDS
    
    SMB_EXIT=$?
    if [ $SMB_EXIT -eq 0 ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 推送成功" >> "$LOG_FILE"
        break
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 推送失败 (exit=$SMB_EXIT)，重试..." >> "$LOG_FILE"
        sleep 30
    fi
done

# 永久保留，不清理旧备份

# 清理本地临时文件
rm -f "$TEMP_DIR"/*.tar.gz

echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 备份完成" >> "$LOG_FILE"
echo "===== 摘要 ====="
echo "📁 back/sessions-$DATE_TAG.tar.gz"
echo "📁 back/memory-$DATE_TAG.tar.gz"
echo "日志: $LOG_FILE"

flock -u 200
