cmake_minimum_required(VERSION 3.16)
project(saqut VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_compile_options(-Wall -Wextra)

if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR NOT CMAKE_BUILD_TYPE)
    add_compile_options(-g -O0)
    message(STATUS "Debug modu aktif")
else()
    add_compile_options(-O3)
    message(STATUS "Release modu aktif")
endif()

# Tüm kaynak dosyaları topla
file(GLOB_RECURSE SOURCES "src/*.cpp")

add_executable(saqut ${SOURCES})

target_include_directories(saqut PRIVATE src)

# ── Testler ──────────────────────────────────────────────────────────────────
enable_testing()

set(SAQUT_BINARY "${CMAKE_BINARY_DIR}/saqut")
set(GOLDEN_SCRIPT "${CMAKE_SOURCE_DIR}/cmake/run_golden.cmake")

# Birim testleri (tests/run.sh)
add_test(
    NAME unit_tests
    COMMAND bash "${CMAKE_SOURCE_DIR}/tests/run.sh"
)

# Golden testleri — tests/golden/**/*.sqt dosyalarını otomatik keşfet.
# Her .sqt için iki olası expected dosyası kontrol edilir:
#   BASE.expected      → saqut run  (siyah-kutu çıktı testi)
#   BASE.ir_opt.expected → saqut ir --optimized (beyaz-kutu IR testi)
file(GLOB_RECURSE ALL_GOLDEN_SQT CONFIGURE_DEPENDS
    "${CMAKE_SOURCE_DIR}/tests/golden/*.sqt"
)
foreach(SQT_FILE ${ALL_GOLDEN_SQT})
    file(RELATIVE_PATH REL "${CMAKE_SOURCE_DIR}/tests/golden" "${SQT_FILE}")
    string(REPLACE ".sqt" "" BASE "${REL}")
    string(REPLACE "/" "_" TNAME "${BASE}")

    # Siyah-kutu: saqut run çıktısı
    set(RUN_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.expected")
    if(EXISTS "${RUN_EXPECTED}")
        add_test(
            NAME "golden_${TNAME}"
            COMMAND ${CMAKE_COMMAND}
                -DBINARY=${SAQUT_BINARY}
                -DSOURCE=${SQT_FILE}
                -DEXPECTED=${RUN_EXPECTED}
                -P "${GOLDEN_SCRIPT}"
        )
    endif()

    # Beyaz-kutu: saqut ir --optimized çıktısı
    set(IR_OPT_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.ir_opt.expected")
    if(EXISTS "${IR_OPT_EXPECTED}")
        add_test(
            NAME "golden_${TNAME}_ir_opt"
            COMMAND ${CMAKE_COMMAND}
                -DBINARY=${SAQUT_BINARY}
                -DSOURCE=${SQT_FILE}
                -DEXPECTED=${IR_OPT_EXPECTED}
                -DCOMMAND=ir
                -DOPTIMIZED=1
                -P "${GOLDEN_SCRIPT}"
        )
    endif()

    # Doğruluk kalkanı: saqut run --optimized çıktısı == beklenen golden değer
    # "Optimizasyon oldu" değil, "optimize IR doğru sonuç verdi" testleri.
    set(RUN_OPT_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.run_opt.expected")
    if(EXISTS "${RUN_OPT_EXPECTED}")
        add_test(
            NAME "golden_${TNAME}_run_opt"
            COMMAND ${CMAKE_COMMAND}
                -DBINARY=${SAQUT_BINARY}
                -DSOURCE=${SQT_FILE}
                -DEXPECTED=${RUN_OPT_EXPECTED}
                -DOPTIMIZED=1
                -P "${GOLDEN_SCRIPT}"
        )
    endif()

    # Negatif test: .compile_error — derleme hatası beklenen golden testler.
    # Dosya içeriği stderr'de aranır (regex/düz dize).
    set(COMPILE_ERROR_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.compile_error")
    if(EXISTS "${COMPILE_ERROR_EXPECTED}")
        add_test(
            NAME "golden_${TNAME}_compile_error"
            COMMAND ${CMAKE_COMMAND}
                -DBINARY=${SAQUT_BINARY}
                -DSOURCE=${SQT_FILE}
                -DEXPECTED=${COMPILE_ERROR_EXPECTED}
                -P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake"
        )
    endif()
endforeach()
