cmake_minimum_required(VERSION 3.25)
project(PaulDB VERSION 0.1.0 LANGUAGES C CXX)

# ---------------------------------------------------------------------------
# Sprachstandards
# ---------------------------------------------------------------------------
set(CMAKE_C_STANDARD   17)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS        OFF)   # -std=c++20 statt -std=gnu++20

# ---------------------------------------------------------------------------
# Conan-generierte Pakete einbinden (CMakeDeps-Finder liegen im build-Ordner)
# ---------------------------------------------------------------------------
# find_package(fmt      REQUIRED)   # einkommentieren wenn dep da ist
# find_package(spdlog   REQUIRED)

# ---------------------------------------------------------------------------
# Schicht 1 - Storage Engine (C)
# Hinweis: neue .c-Dateien hier manuell eintragen (kein GLOB)
# ---------------------------------------------------------------------------
set(STORAGE_SOURCES
    src/storage/page.c
    src/storage/heap.c
    src/storage/btree.c
    src/storage/buffer_pool.c
    src/storage/free_space_map.c
    src/storage/arena.c
    src/storage/wal.c
)

# ---------------------------------------------------------------------------
# Schicht 2 - Engine Logic (C++)
# ---------------------------------------------------------------------------
set(ENGINE_SOURCES
    src/engine/query_router.cpp
    src/engine/delta_merge.cpp
    src/engine/mvcc.cpp
    src/engine/executor.cpp
)

# ---------------------------------------------------------------------------
# Schicht 3 - SQL Frontend (C++)
# ---------------------------------------------------------------------------
set(SQL_SOURCES
    src/sql/tokenizer.cpp
    src/sql/parser.cpp
    src/sql/ast.cpp
    src/sql/planner.cpp
)

# ---------------------------------------------------------------------------
# Hauptprogramm
# ---------------------------------------------------------------------------
add_executable(pauldb
    src/main.cpp
    ${STORAGE_SOURCES}
    ${ENGINE_SOURCES}
    ${SQL_SOURCES}
)

target_include_directories(pauldb
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

# Externe Libs linken - Beispiel:
# target_link_libraries(pauldb PRIVATE fmt::fmt spdlog::spdlog)

# ---------------------------------------------------------------------------
# Tests (CTest)
# ---------------------------------------------------------------------------
enable_testing()

add_executable(test_page
    test/storage/test_page.c
    src/storage/page.c
)
target_include_directories(test_page PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
add_test(NAME test_page COMMAND test_page)

# ---------------------------------------------------------------------------
# Installationsregeln (fur package() in conanfile.py)
# ---------------------------------------------------------------------------
install(TARGETS pauldb DESTINATION bin)
