cmake_minimum_required(VERSION 3.16)
project(Empire LANGUAGES C CXX)

if(MSVC AND NOT CMAKE_GENERATOR MATCHES "Ninja")
    add_compile_options(/MP)
endif()

set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)
set(SDL_TESTS OFF CACHE BOOL "" FORCE)
set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SDL_DISABLE_INSTALL ON CACHE BOOL "" FORCE)
set(SDLMIXER_VENDORED OFF)
add_subdirectory(soy/SDL)
add_subdirectory(soy/SDL_mixer)


# gl loader for win/macos
if(NOT EMSCRIPTEN)
    add_library(glad STATIC soy/glad/src/gl.c)
    target_include_directories(glad PUBLIC soy/glad/include)
endif()

# Codegen tool (native only)
if(NOT EMSCRIPTEN)
    add_executable(Florence src/codegen/florence.c)
    target_include_directories(Florence PRIVATE include)
    target_link_libraries(Florence PRIVATE SDL3::SDL3)

    # Always build Florence in Release mode
    set_target_properties(Florence PROPERTIES
        VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
        MSVC_RUNTIME_LIBRARY "MultiThreaded"
        EXCLUDE_FROM_ALL FALSE
    )
    set_property(TARGET Florence PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE)
    # Create placeholder files if they don't exist (for first-time configure)
    foreach(gen_file ${EMPIRE_GENERATED})
        if(NOT EXISTS ${gen_file})
            get_filename_component(gen_dir ${gen_file} DIRECTORY)
            file(MAKE_DIRECTORY ${gen_dir})
            file(WRITE ${gen_file} "// Generated by Florence\n")
        endif()
    endforeach()

    add_custom_target(RunFlorence ALL
        COMMAND Florence
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        DEPENDS Florence
        BYPRODUCTS ${EMPIRE_GENERATED}
        COMMENT "Running Florence codegen..."
    )
endif()

set(EMPIRE_GENERATED
        ${CMAKE_SOURCE_DIR}/src/generated/assets_generated.c
        ${CMAKE_SOURCE_DIR}/include/Empire/generated/assets_generated.h
    )

set(EMPIRE_SOURCES
    src/assets.c
    src/entities.c
    src/level.c
    src/main.c
    src/stb_ds.c
    src/stb_image.c
    src/stb_truetype.c
    src/text.c
    src/ui.c
    src/util.c
    src/yyjson.c
)

set(EMPIRE_HEADERS
    include/Empire/aspect.h
    include/Empire/assets.h
    include/Empire/hash.inl
    include/Empire/level.h
    include/Empire/math.inl
    include/Empire/prototypes.h
    include/Empire/stb_ds.h
    include/Empire/stb_image.h
    include/Empire/stb_truetype.h
    include/Empire/text.h
    include/Empire/types.h
    include/Empire/ui.h
    include/Empire/util.h
    include/Empire/yyjson.h
    src/entities.h
)

add_executable(Empire
    ${EMPIRE_SOURCES}
    ${EMPIRE_HEADERS}
    ${EMPIRE_GENERATED}
)

target_include_directories(Empire PRIVATE include)
target_link_libraries(Empire PRIVATE SDL3::SDL3)
target_link_libraries(Empire PRIVATE SDL3_mixer::SDL3_mixer)

if(EMSCRIPTEN)
    target_link_options(Empire PRIVATE "--preload-file" "${CMAKE_CURRENT_SOURCE_DIR}/assets@/assets")
endif()

set_target_properties(Empire PROPERTIES COMPILE_WARNING_AS_ERROR ON)

target_compile_options(Empire PRIVATE
    $<$<CXX_COMPILER_ID:MSVC>:
        /W4
        /permissive-
        /wd4100
    >

    $<$<CXX_COMPILER_ID:Clang,AppleClang>:
        -Wall
        -Wshadow
    >
)

# make pretty filters in VS
if(CMAKE_GENERATOR MATCHES "Visual Studio")
    source_group("Sources" FILES ${EMPIRE_SOURCES})
    source_group("Headers" FILES ${EMPIRE_HEADERS})
    if(NOT EMSCRIPTEN)
        source_group("Sources\\Generated" FILES ${CMAKE_SOURCE_DIR}/src/generated/assets_generated.c)
        source_group("Headers\\Generated" FILES ${CMAKE_SOURCE_DIR}/include/Empire/generated/assets_generated.h)
    endif()
endif()

if(NOT EMSCRIPTEN)
    target_link_libraries(Empire PRIVATE glad)
    add_dependencies(Empire RunFlorence)
    set_target_properties(Empire PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
endif()

# Copy SDL3 DLL for Windows builds
if(WIN32 AND NOT EMSCRIPTEN)
    add_custom_command(TARGET Florence POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        $<TARGET_FILE:SDL3::SDL3>
        $<TARGET_FILE_DIR:Florence>
    )
    add_custom_command(TARGET Empire POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        $<TARGET_FILE:SDL3::SDL3>
        $<TARGET_FILE_DIR:Empire>
    )
        add_custom_command(TARGET Empire POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        $<TARGET_FILE:SDL3_mixer::SDL3_mixer>
        $<TARGET_FILE_DIR:Empire>
    )
endif()

if(EMSCRIPTEN)
    set_target_properties(Empire PROPERTIES SUFFIX ".html")
    target_link_options(Empire PRIVATE
        "-sALLOW_MEMORY_GROWTH=1"
        "-sUSE_SDL=3"
        "-g3"                                       # Level 3 debug: Includes source maps and line info
        "-sASSERTIONS=1"                            # Turns on Emscripten's internal runtime checks
        "-sSTACK_OVERFLOW_CHECK=2"                  # Catches stack errors (common in WASM)
        "--source-map-base http://localhost:8080/"  # Helps the browser find the source files)
    )
endif()
