cmake_minimum_required(VERSION 3.25)
project(PrismStudio VERSION 0.1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
option(PRISM_SANITIZERS "Enable address and undefined behavior sanitizers" OFF)

add_library(prism_core src/scene.cpp src/renderer.cpp src/raster_lab.cpp src/memory_lab.cpp)
target_include_directories(prism_core PUBLIC include)
target_compile_features(prism_core PUBLIC cxx_std_23)
function(prism_warnings target)
  if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
    target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic -Wconversion -Wshadow)
  endif()
endfunction()
prism_warnings(prism_core)
if(PRISM_SANITIZERS AND CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
  target_compile_options(prism_core PUBLIC -fsanitize=address,undefined -fno-omit-frame-pointer)
  target_link_options(prism_core PUBLIC -fsanitize=address,undefined)
endif()

add_executable(prism-render src/main.cpp)
target_link_libraries(prism-render PRIVATE prism_core)
add_executable(prism-memory src/memory_main.cpp)
target_link_libraries(prism-memory PRIVATE prism_core)
add_executable(prism-raster src/raster_main.cpp)
target_link_libraries(prism-raster PRIVATE prism_core)
foreach(target prism-render prism-memory prism-raster)
  prism_warnings(${target})
endforeach()

include(CTest)
if(BUILD_TESTING)
  add_executable(prism-tests tests/prism_tests.cpp)
  target_link_libraries(prism-tests PRIVATE prism_core)
  prism_warnings(prism-tests)
  add_test(NAME prism-native-contracts COMMAND prism-tests)
  add_test(NAME prism-memory-experiment COMMAND prism-memory)
  add_test(NAME prism-cli-help COMMAND prism-render --help)
  add_test(NAME prism-cli-invalid-arguments COMMAND prism-render)
  set_tests_properties(prism-cli-invalid-arguments PROPERTIES WILL_FAIL TRUE)
  add_test(NAME prism-cli-output-failure COMMAND prism-render
    "${CMAKE_CURRENT_BINARY_DIR}/nonexistent-output-directory/image.ppm")
  set_tests_properties(prism-cli-output-failure PROPERTIES WILL_FAIL TRUE)
  add_test(NAME prism-raster-help COMMAND prism-raster --help)
endif()
