#!/bin/bash

# 测试脚本
# 用法: ./run_tests.sh [--verbose] [<单个测试文件>]

COMPILER="./build/bin/compiler"
TEST_DIR="test/test_case"
RESULT_FILE="result.txt"
VERBOSE=0

# 解析参数
if [[ "$1" == "--verbose" ]]; then
    VERBOSE=1
    shift
fi

# 检查编译器是否存在
if [ ! -f "$COMPILER" ]; then
    echo "错误: 编译器未找到于 $COMPILER"
    echo "请先完成项目构建 (cmake 和 make)"
    exit 1
fi

# 检查 verify_ir.sh 是否存在（可选）
VERIFY_SCRIPT="./scripts/verify_ir.sh"
if [ ! -f "$VERIFY_SCRIPT" ]; then
    echo "错误: 验证脚本 $VERIFY_SCRIPT 未找到"
    exit 1
fi

VERIFY_SCRIPT_ASM="./scripts/verify_asm.sh"
if [ ! -f "$VERIFY_SCRIPT_ASM" ]; then
    echo "错误: 验证脚本 $VERIFY_SCRIPT_ASM 未找到"
    exit 1
fi

# 如果指定了单个文件，检查文件是否存在
if [ -n "$1" ] && [ ! -f "$1" ]; then
    echo "错误: 文件 $1 不存在"
    exit 1
fi

# 清空（或创建）结果文件
> "$RESULT_FILE"

# 计数器
total=0
emit_ir=0
ir_passed=0
emit_asm=0
asm_passed=0
failed=0

echo "开始测试 IR 生成与验证..."
echo "输出将保存到 $RESULT_FILE"
echo "------------------------"

# 确定测试文件列表
if [ -n "$1" ]; then
    # 使用提供的单个文件
    TEST_FILES=("$1")
else
    # 收集所有 .sy 文件
    mapfile -t TEST_FILES < <(find "$TEST_DIR" -type f -name "*.sy" | sort)
fi

for file in "${TEST_FILES[@]}"; do
    ((total++))
    if [ $VERBOSE -eq 1 ]; then
        echo "测试文件: $file"
    else
        echo -n "测试 $file ... "
    fi

    echo "========== $file ==========" >> "$RESULT_FILE"

    # 1. 运行编译器生成 IR
    if [ $VERBOSE -eq 1 ]; then
        "$COMPILER" --emit-ir "$file" 2>&1 | tee -a "$RESULT_FILE"
        result1=${PIPESTATUS[0]}
    else
        "$COMPILER" --emit-ir "$file" >> "$RESULT_FILE" 2>&1
        result1=$?
    fi
    echo "" >> "$RESULT_FILE"

    # 2. 运行验证脚本
    if [ $VERBOSE -eq 1 ]; then
        "$VERIFY_SCRIPT" "$file" test/test_result/function/ir --run 2>&1 | tee -a "$RESULT_FILE"
        result2=${PIPESTATUS[0]}
    else
        "$VERIFY_SCRIPT" "$file" test/test_result/function/ir --run >> "$RESULT_FILE" 2>&1
        result2=$?
    fi
    echo "" >> "$RESULT_FILE"

    # 3. 运行编译器生成 asm
    if [ $VERBOSE -eq 1 ]; then
        "$COMPILER" --emit-asm "$file" 2>&1 | tee -a "$RESULT_FILE"
        result3=${PIPESTATUS[0]}
    else
        "$COMPILER" --emit-asm "$file" >> "$RESULT_FILE" 2>&1
        result3=$?
    fi
    echo "" >> "$RESULT_FILE"

    # 4. 运行验证脚本
    if [ $VERBOSE -eq 1 ]; then
        "$VERIFY_SCRIPT_ASM" "$file" test/test_result/function/asm --run 2>&1 | tee -a "$RESULT_FILE"
        result4=${PIPESTATUS[0]}
    else
        "$VERIFY_SCRIPT_ASM" "$file" test/test_result/function/asm --run >> "$RESULT_FILE" 2>&1
        result4=$?
    fi
    echo "" >> "$RESULT_FILE"

    # 判断整体通过（两个命令都成功）
    if [ $result1 -eq 0 ]; then
        if [ $VERBOSE -eq 0 ]; then
            echo "生成ir"
        fi
        if [ $result2 -eq 0 ]; then
            if [ $VERBOSE -eq 0 ]; then
                echo "ir通过"
            fi
            ((ir_passed++))
        fi
        ((emit_ir++))
    else
        echo "ir失败"
    fi
    
    if [ $result3 -eq 0 ]; then
        if [ $VERBOSE -eq 0 ]; then
            echo "生成asm"
        fi
        if [ $result4 -eq 0 ]; then
            if [ $VERBOSE -eq 0 ]; then
                echo "asm通过"
            fi
            ((asm_passed++))
        fi
        ((emit_asm++))
    else
        echo "asm失败"
    fi
done

echo "------------------------"
echo "总计:  $total"
echo "ir生成:  $emit_ir"
echo "ir通过:  $ir_passed"
echo "asm生成:  $emit_asm"
echo "asm通过:  $asm_passed"
echo "详细输出已保存至 $RESULT_FILE"

if [ $failed -gt 0 ]; then
    exit 1
else
    exit 0
fi