cmake_minimum_required(VERSION 3.20)

project(GMoD-TeachGMAD VERSION 1.0.0 LANGUAGES C CXX RC)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Architecture Detection
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(ARCH_DIR "x64")
else()
    set(ARCH_DIR "x86")
endif()

# Source Files
file(GLOB_RECURSE SOURCE_FILES
    "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/*.hpp"
)

set(RESOURCE_FILES
    "${CMAKE_CURRENT_SOURCE_DIR}/res/resource.rc"
)

# Executable definition (Win32 GUI mode)
add_executable(${PROJECT_NAME} WIN32
    ${SOURCE_FILES}
    ${RESOURCE_FILES}
)

# Include Directories
target_include_directories(${PROJECT_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/includes"
    "${CMAKE_CURRENT_SOURCE_DIR}/includes/SDL2"
    "${CMAKE_CURRENT_SOURCE_DIR}/src"
    "${CMAKE_CURRENT_SOURCE_DIR}/res"
)

# Library Directories
target_link_directories(${PROJECT_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/libs/${ARCH_DIR}"
    "${CMAKE_CURRENT_SOURCE_DIR}/libs"
)

# Link Libraries
target_link_libraries(${PROJECT_NAME} PRIVATE
    SDL2main
    SDL2
    SDL2_image
    SDL2_ttf
    ole32
    shell32
    comdlg32
    user32
)

# MSVC Specific Compiler & Linker Settings
if(MSVC)
    target_compile_options(${PROJECT_NAME} PRIVATE /W4 /utf-8 /permissive- /Zc:__cplusplus)
    # Enable Release optimizations
    target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:Release>:/O2 /Oi /GL>)
    target_link_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:Release>:/LTCG /OPT:REF /OPT:ICF>)
endif()

# Post-Build Commands: Copy Assets and DLLs to Output Directory
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${PROJECT_NAME}>/assets"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different 
        "${CMAKE_CURRENT_SOURCE_DIR}/assets/coolvetica.otf" 
        "$<TARGET_FILE_DIR:${PROJECT_NAME}>/coolvetica.otf"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different 
        "${CMAKE_CURRENT_SOURCE_DIR}/assets/title.png" 
        "$<TARGET_FILE_DIR:${PROJECT_NAME}>/title.png"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different 
        "${CMAKE_CURRENT_SOURCE_DIR}/assets/icon1.ico" 
        "$<TARGET_FILE_DIR:${PROJECT_NAME}>/icon1.ico"
    COMMAND ${CMAKE_COMMAND} -E copy_directory 
        "${CMAKE_CURRENT_SOURCE_DIR}/assets" 
        "$<TARGET_FILE_DIR:${PROJECT_NAME}>/assets"
    COMMENT "Copying assets to binary directory..."
)

# Copy DLLs from libs/<ARCH> if they exist
file(GLOB DLL_FILES 
    "${CMAKE_CURRENT_SOURCE_DIR}/libs/${ARCH_DIR}/*.dll"
    "${CMAKE_CURRENT_SOURCE_DIR}/libs/*.dll"
)

foreach(DLL_PATH ${DLL_FILES})
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${DLL_PATH}"
            "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
        COMMENT "Copying runtime DLL: ${DLL_PATH}"
    )
endforeach()
