#!/bin/bash

#================================================================
#
# 文件名: diff.sh
#
# 描述: 一个用于对比两个文件差异并以彩色高亮输出的脚本。
#
# 用法: ./diff.sh <当前版本文件> <旧版本文件>
#
# 作者: Gemini
#
#================================================================

# --- ANSI 颜色代码定义 ---
# 使用 tput 来确保更好的终端兼容性
RESET=$(tput sgr0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)

# --- 1. 检查参数和文件是否存在 ---
if [ "$#" -ne 2 ]; then
    echo -e "${RED}错误：需要提供两个文件作为参数。${RESET}" >&2
    echo -e "用法: $0 <当前版本文件> <旧版本文件>" >&2
    exit 1
fi

CURRENT_FILE=$1
OLD_FILE=$2

if [ ! -f "$CURRENT_FILE" ]; then
    echo -e "${RED}错误：文件不存在 -> ${CURRENT_FILE}${RESET}" >&2
    exit 1
fi

if [ ! -f "$OLD_FILE" ]; then
    echo -e "${RED}错误：文件不存在 -> ${OLD_FILE}${RESET}" >&2
    exit 1
fi

# --- 2. 打印头部信息和图例 ---
echo -e "${CYAN}--- 文件差异对比 ---${RESET}"
echo -e "当前版本 (新增部分): ${GREEN}${CURRENT_FILE}${RESET}"
echo -e "旧版本   (删除部分): ${RED}${OLD_FILE}${RESET}"
echo "--------------------------------------------------"
echo "图例:"
echo -e "${GREEN}+ [新增内容] (仅存在于 '${CURRENT_FILE}')${RESET}"
echo -e "${RED}- [删除内容] (在 '${OLD_FILE}' 中存在，但当前版本已删除)${RESET}"
echo -e "${CYAN}  [位置/上下文信息]${RESET}"
echo -e "${WHITE}  [无变化内容]${RESET}"
echo -e "--------------------------------------------------\n"

# --- 3. 执行 diff 命令并检查是否有差异 ---
# 我们对比 旧版本 -> 当前版本，这样才能正确地将
# 新增行标记为 '+'，删除行标记为 '-'。
DIFF_OUTPUT=$(diff -u "$OLD_FILE" "$CURRENT_FILE")
DIFF_EXIT_CODE=$?

# --- 4. 根据 diff 结果进行彩色输出 ---
if [ ${DIFF_EXIT_CODE} -eq 0 ]; then
    echo -e "${GREEN}✅ 两个文件内容完全相同，没有差异。${RESET}"
else
    # 使用 sed 流编辑器为 diff 输出着色
    # 正则表达式匹配以特定字符开头的行，并用颜色代码包裹它们
    echo "$DIFF_OUTPUT" | sed \
        -e "s/^\(---.*\|+++.*\|@@.*@@\)/${CYAN}&${RESET}/g" \
        -e "s/^\(+.*\)/${GREEN}&${RESET}/g" \
        -e "s/^\(-.*\)/${RED}&${RESET}/g"
fi

exit 0
