#!/bin/bash

# ============================================
# Obsidian Vault 恢复存档脚本
# 用途：出问题时，选一个之前的存档恢复回去
# ============================================

VAULT_PATH="$HOME/Documents/ObsidianVault"

cd "$VAULT_PATH" || { echo "❌ 找不到 Vault 文件夹"; read -p "按任意键关闭..."; exit 1; }

if [ ! -d ".git" ]; then
    echo "❌ 这个 Vault 还没有初始化 Git，请先运行「01_初始化Git.command」。"
    read -p "按任意键关闭窗口..."
    exit 1
fi

echo "=================================================="
echo "以下是你所有的存档记录（从新到旧排列）："
echo "=================================================="
echo ""

# 把存档记录编号列出来，方便你选择
git log --pretty=format:"%h | %ad | %s" --date=format:"%Y-%m-%d %H:%M" | nl -w2 -s") "

echo ""
echo "=================================================="
read -p "请输入你想恢复到的存档「编号」（左边的数字，不想恢复请直接回车退出）： " CHOICE

if [ -z "$CHOICE" ]; then
    echo "已取消，没有做任何改动。"
    read -p "按任意键关闭窗口..."
    exit 0
fi

# 根据编号找到对应的存档哈希值（唯一编号）
TARGET_LINE=$(git log --pretty=format:"%h | %ad | %s" --date=format:"%Y-%m-%d %H:%M" | nl -w2 -s") " | sed -n "${CHOICE}p")

if [ -z "$TARGET_LINE" ]; then
    echo "❌ 没有找到这个编号对应的存档，请检查输入是否正确。"
    read -p "按任意键关闭窗口..."
    exit 1
fi

TARGET_HASH=$(echo "$TARGET_LINE" | awk -F'|' '{print $1}' | awk '{print $NF}')

echo ""
echo "你选择的存档是："
echo "$TARGET_LINE"
echo ""
read -p "确认要恢复到这个存档吗？输入 y 确认，其他任意键取消： " CONFIRM

if [ "$CONFIRM" != "y" ]; then
    echo "已取消，没有做任何改动。"
    read -p "按任意键关闭窗口..."
    exit 0
fi

# 安全第一：恢复之前，先把"现在"这个状态也存一次档
# 这样万一选错了，也能再运行一次这个脚本，恢复回"恢复前"的样子
echo ""
echo "正在为你恢复前的当前状态做一次安全备份..."
TIMESTAMP=$(date "+%Y-%m-%d %H:%M")
git add .
if ! git diff --cached --quiet; then
    git commit -m "恢复前自动备份：$TIMESTAMP"
    echo "✅ 安全备份已完成。"
else
    echo "（当前没有未存档的改动，跳过安全备份。）"
fi

# 正式恢复：把文件内容改回目标存档的样子
echo ""
echo "正在恢复文件到目标存档状态..."
git checkout "$TARGET_HASH" -- .

# 把这次"恢复"这个动作本身也记一笔，方便以后查历史
git add .
if ! git diff --cached --quiet; then
    git commit -m "已恢复到存档：$TARGET_LINE"
    echo ""
    echo "✅ 恢复完成！Vault 已经变回那次存档时的样子。"
else
    echo ""
    echo "✅ 内容和目标存档一致，无需改动。"
fi

echo ""
read -p "按任意键关闭窗口..."
