cmake_minimum_required(VERSION 3.24)
project(WolfASCII VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(WOLF_EDITION "SHAREWARE" CACHE STRING "SHAREWARE or FULL (GT/ID v1.4)")
set_property(CACHE WOLF_EDITION PROPERTY STRINGS SHAREWARE FULL)
include(CTest)

add_library(ascii_core src/ascii_core.cpp)
target_include_directories(ascii_core PUBLIC src)
if(EMSCRIPTEN)
  add_compile_options("-sUSE_SDL=2" "-sUSE_SDL_MIXER=2")
  add_link_options("-sUSE_SDL=2" "-sUSE_SDL_MIXER=2" "-sSDL2_MIXER_FORMATS=[]")
else()
  find_package(SDL2 CONFIG REQUIRED)
  find_package(SDL2_mixer CONFIG REQUIRED)
endif()

file(GLOB ENGINE_SOURCES CONFIGURE_DEPENDS engine/*.cpp)
add_executable(wolf-ascii ${ENGINE_SOURCES} engine/opl3.c src/ascii_sdl.cpp)
target_include_directories(wolf-ascii PRIVATE src engine)
target_compile_definitions(wolf-ascii PRIVATE SDL_MAIN_HANDLED VERSIONALREADYCHOSEN CARMACIZED)
if(WOLF_EDITION STREQUAL "SHAREWARE")
  target_compile_definitions(wolf-ascii PRIVATE UPLOAD)
elseif(WOLF_EDITION STREQUAL "FULL")
  target_compile_definitions(wolf-ascii PRIVATE GOODTIMES)
else()
  message(FATAL_ERROR "WOLF_EDITION must be SHAREWARE or FULL")
endif()
target_link_libraries(wolf-ascii PRIVATE ascii_core)
if(MSVC)
  target_compile_definitions(wolf-ascii PRIVATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS)
endif()
if(EMSCRIPTEN)
  set_target_properties(wolf-ascii PROPERTIES SUFFIX ".js")
  target_link_options(wolf-ascii PRIVATE
    "-sASYNCIFY" "-sASYNCIFY_STACK_SIZE=131072" "-sSTACK_SIZE=2097152"
    "-sINITIAL_MEMORY=33554432" "-sALLOW_MEMORY_GROWTH=1" "-sMAXIMUM_MEMORY=134217728"
    "-sFORCE_FILESYSTEM=1" "-sEXIT_RUNTIME=1"
    "-sEXPORTED_RUNTIME_METHODS=['FS','callMain']"
    "-sEXPORTED_FUNCTIONS=['_main','_WA_SetMode','_WA_SetDetail','_WA_IsPlaying']")
  configure_file(web/index.html index.html COPYONLY)
else()
  target_link_libraries(wolf-ascii PRIVATE SDL2::SDL2 SDL2_mixer::SDL2_mixer)
endif()

if(BUILD_TESTING AND NOT EMSCRIPTEN)
  add_executable(ascii-tests tests/ascii_tests.cpp)
  target_link_libraries(ascii-tests PRIVATE ascii_core)
  add_test(NAME ascii-core COMMAND ascii-tests)
endif()
