cmake_minimum_required(VERSION 3.28)
project(ls-atlantis-engine VERSION 0.0.1 LANGUAGES CXX)

################################
# Compiler Settings
################################

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

################################
# Global Project Settings
################################

set(MODULE_NAME_CORE ls-atlantis-core)
set(MODULE_NAME_INTERFACE ls-atlantis-interface)
set(MODULE_NAME_WINDOW ls-atlantis-window)

set(CMAKE_DEBUG_POSTFIX -d)

include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
include_directories(${CMAKE_CURRENT_LIST_DIR}/)

################################
# Dependencies
################################

find_package(GTest REQUIRED)
find_package(ls-std REQUIRED)
find_package(SDL3 REQUIRED)

if (WIN32)
    file(GLOB LS_STD_DLLS_DEBUG "${ls-std_LIB_DIRS_DEBUG}/*.dll")
    file(GLOB LS_STD_DLLS_RELEASE "${ls-std_LIB_DIRS_RELEASE}/*.dll")
endif ()

################################################################
################################################################
# Module: Core
################################################################
################################################################

################################
# Source Files: Core Module
################################

set(ATLANTIS_CORE_SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/source/core/StatusCodeOk.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/source/core/StatusCodeWindowApiLoadingFailed.cpp
)

################################
# Library Creation: Core Module
################################

add_library(${MODULE_NAME_CORE} SHARED ${ATLANTIS_CORE_SOURCES})

target_link_libraries(${MODULE_NAME_CORE} PUBLIC
    ${MODULE_NAME_INTERFACE}
    $<$<CONFIG:Debug>:ls-std::ls-std-core-d>
    $<$<CONFIG:Release>:ls-std::ls-std-core>
)

################################
# Test Files: Core Module
################################

set(ATLANTIS_CORE_TEST_SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/test/core/StatusCodeOkTest.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/test/core/StatusCodeWindowApiLoadingFailedTest.cpp
)

################################
# Test Case Creation: Core Module
################################

enable_testing()

add_executable(${MODULE_NAME_CORE}-tests ${ATLANTIS_CORE_TEST_SOURCES})

target_link_libraries(${MODULE_NAME_CORE}-tests PRIVATE
    ${MODULE_NAME_CORE}
    GTest::gtest_main
)

include(GoogleTest)
gtest_discover_tests(${MODULE_NAME_CORE}-tests DISCOVERY_MODE PRE_TEST)

if (WIN32)
    add_custom_command(TARGET ${MODULE_NAME_CORE}-tests POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_CORE}-tests>
            $<TARGET_RUNTIME_DLLS:${MODULE_NAME_CORE}-tests>
        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_CORE}-tests>
            "$<$<CONFIG:Debug>:${LS_STD_DLLS_DEBUG}>"
            "$<$<CONFIG:Release>:${LS_STD_DLLS_RELEASE}>"
        COMMAND_EXPAND_LISTS
    )
endif ()

################################################################
################################################################
# Module: Interface
################################################################
################################################################

################################
# Source Files: Interface Module
################################

set(ATLANTIS_INTERFACE_SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/source/interface/AStatusCode.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/source/interface/ISdlApi.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/source/interface/IWindowApi.cpp
)

################################
# Library Creation: Interface Module
################################

add_library(${MODULE_NAME_INTERFACE} SHARED ${ATLANTIS_INTERFACE_SOURCES})

target_link_libraries(${MODULE_NAME_INTERFACE} PUBLIC
        SDL3::SDL3
)

################################################################
################################################################
# Module: Window
################################################################
################################################################

################################
# Source Files: Window Module
################################

set(ATLANTIS_WINDOW_SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/source/window/SdlApi.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/source/window/SdlWindowApi.cpp
)

################################
# Library Creation: Window Module
################################

add_library(${MODULE_NAME_WINDOW} SHARED ${ATLANTIS_WINDOW_SOURCES})

target_link_libraries(${MODULE_NAME_WINDOW} PUBLIC
    ${MODULE_NAME_CORE}
    ${MODULE_NAME_INTERFACE}
    SDL3::SDL3
)

################################
# Test Files: Window Module
################################

set(ATLANTIS_WINDOW_TEST_SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/test/window/mock/SdlApiMock.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/test/window/SdlWindowApiTest.cpp
)

################################
# Test Case Creation: Window Module
################################

add_executable(${MODULE_NAME_WINDOW}-tests ${ATLANTIS_WINDOW_TEST_SOURCES})

target_link_libraries(${MODULE_NAME_WINDOW}-tests PRIVATE
    ${MODULE_NAME_WINDOW}
    GTest::gmock_main
)

gtest_discover_tests(${MODULE_NAME_WINDOW}-tests DISCOVERY_MODE PRE_TEST)

if (WIN32)
    add_custom_command(TARGET ${MODULE_NAME_WINDOW}-tests POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_WINDOW}-tests>
            $<TARGET_RUNTIME_DLLS:${MODULE_NAME_WINDOW}-tests>
        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_WINDOW}-tests>
            "$<$<CONFIG:Debug>:${LS_STD_DLLS_DEBUG}>"
            "$<$<CONFIG:Release>:${LS_STD_DLLS_RELEASE}>"
        COMMAND_EXPAND_LISTS
    )
endif ()

################################################################
################################################################
# All Tests
################################################################
################################################################

add_custom_target(ls-atlantis-tests
    DEPENDS
        ${MODULE_NAME_CORE}-tests
        ${MODULE_NAME_WINDOW}-tests
)
