cmake_minimum_required(VERSION 3.5)
project(arona_core)

function(retrieve_files out_files)
    set(source_list)

    # 递归查找文件夹下的 .h .hpp. ini 文件保存到 HEAD_FILES
    file(GLOB_RECURSE HEAD_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.h *.hpp *.ini) 

    # 递归查找文件夹下的 *.cpp *.c 文件保存到 SRC_FILES
    file(GLOB_RECURSE SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.cpp *.c)

    # 将 HEDADER_FILES 和 SRC_FILES 保存到 ALL_FILES 变量
    set(ALL_FILES ${HEAD_FILES} ${SRC_FILES})

    set(RESULT "")

    # 对 ALL_FILES 变量里面的所有文件分类(保留资源管理器的目录结构)
    foreach(fileItem ${ALL_FILES})
        # Get the directory of the source file
        get_filename_component(PARENT_DIR "${fileItem}" DIRECTORY)

        # 用于检查平台的条件
        if(PARENT_DIR STREQUAL "windows")
            if(WIN32)
                set(RESULT "${RESULT};${fileItem}")
            else()
                continue()
            endif()
        elseif(PARENT_DIR STREQUAL "linux")
            if(UNIX AND NOT APPLE)
                set(RESULT "${RESULT};${fileItem}")
            else()
                continue()
            endif()
        elseif(PARENT_DIR STREQUAL "mac")
            if(APPLE)
                set(RESULT "${RESULT};${fileItem}")
            else()
                continue()
            endif()
        else()
            # 如果文件夹名称不是平台,则始终包含
            set(RESULT "${RESULT};${fileItem}")
        endif()
        
        # Remove common directory prefix to make the group
        string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}")
        # Make sure we are using windows slashes
        string(REPLACE "/" "\\" GROUP "${GROUP}")
        # Group into "Source Files" and "Header Files"
        set(GROUP "${GROUP}")
        source_group("${GROUP}" FILES "${fileItem}")
    endforeach()

    set(${out_files} ${RESULT} PARENT_SCOPE)
endfunction()

add_subdirectory(core)
add_subdirectory(third_party/imgui)
add_subdirectory(third_party/sdl)
add_subdirectory(third_party/portaudio)
add_subdirectory(third_party/spdlog)
add_subdirectory(third_party/slang)
add_subdirectory(third_party/glad)
add_subdirectory(third_party/glslang)

# setup portaudio
set(PA_USE_ASIO ON CACHE BOOL "" FORCE)
set(PA_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)

if (WIN32)
    set(PA_USE_WMME OFF CACHE BOOL "" FORCE)
    set(PA_USE_WDMKS OFF CACHE BOOL "" FORCE)
    set(PA_USE_WDMKS_DEVICE_INFO OFF CACHE BOOL "" FORCE)
    set(PA_USE_DS OFF CACHE BOOL "" FORCE)
elseif(APPLE)
    set(PA_USE_COREAUDIO ON CACHE BOOL "" FORCE)
endif()

# setup SDL
set(SDL_ASSEMBLY OFF CACHE BOOL "" FORCE)
set(SDL_ATOMIC OFF CACHE BOOL "" FORCE)
set(SDL_AUDIO OFF CACHE BOOL "" FORCE)
set(SDL_AVX OFF CACHE BOOL "" FORCE)
set(SDL_AVX2 OFF CACHE BOOL "" FORCE)
set(SDL_AVX512F OFF CACHE BOOL "" FORCE)
set(SDL_CPUINFO OFF CACHE BOOL "" FORCE)
set(SDL_DIRECTX OFF CACHE BOOL "" FORCE)
set(SDL_DISKAUDIO OFF CACHE BOOL "" FORCE)
set(SDL_DUMMYAUDIO OFF CACHE BOOL "" FORCE)
set(SDL_DUMMYVIDEO OFF CACHE BOOL "" FORCE)
set(SDL_FILE OFF CACHE BOOL "" FORCE)
set(SDL_FILESYSTEM OFF CACHE BOOL "" FORCE)
set(SDL_HAPTIC OFF CACHE BOOL "" FORCE)
set(SDL_HIDAPI OFF CACHE BOOL "" FORCE)
set(SDL_HIDAPI_JOYSTICK OFF CACHE BOOL "" FORCE)
set(SDL_JOYSTICK OFF CACHE BOOL "" FORCE)
set(SDL_LIBUDEV OFF CACHE BOOL "" FORCE)
set(SDL_LOCALE OFF CACHE BOOL "" FORCE)
set(SDL_MISC OFF CACHE BOOL "" FORCE)
set(SDL_MMX OFF CACHE BOOL "" FORCE)
set(SDL_OFFSCREEN OFF CACHE BOOL "" FORCE)
set(SDL_POWER OFF CACHE BOOL "" FORCE)
set(SDL_RENDER OFF CACHE BOOL "" FORCE)
set(SDL_RENDER_D3D OFF CACHE BOOL "" FORCE)
set(SDL_SENSOR OFF CACHE BOOL "" FORCE)
set(SDL_SSE OFF CACHE BOOL "" FORCE)
set(SDL_SSE2 OFF CACHE BOOL "" FORCE)
set(SDL_SSE3 OFF CACHE BOOL "" FORCE)
set(SDL_SSE4_1 OFF CACHE BOOL "" FORCE)
set(SDL_SSE4_2 OFF CACHE BOOL "" FORCE)
set(SDL_TEST OFF CACHE BOOL "" FORCE)
set(SDL_TIMERS OFF CACHE BOOL "" FORCE)
set(SDL_VIRTUAL_JOYSTICK OFF CACHE BOOL "" FORCE)
set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)

set(SDL_VULKAN ON CACHE BOOL "" FORCE)
set(SDL_OPENGL ON CACHE BOOL "" FORCE)
set(SDL_OPENGLES OFF CACHE BOOL "" FORCE)

if (APPLE)
    set(SDL_METAL ON CACHE BOOL "" FORCE)
else()
    set(SDL_METAL OFF CACHE BOOL "" FORCE)
endif()

set(SDL_WASAPI OFF CACHE BOOL "" FORCE)
set(SDL_XINPUT OFF CACHE BOOL "" FORCE)
set(SDL_DISABLE_UNINSTALL ON CACHE BOOL "" FORCE)


# setup spdlog
set(SPDLOG_BUILD_SHARED ON CACHE BOOL "" FORCE)
set(SPDLOG_BUILD_EXAMPLE OFF CACHE BOOL "" FORCE)
set(SPDLOG_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(SPDLOG_BUILD_BENCH OFF CACHE BOOL "" FORCE)
set(SPDLOG_FMT_EXTERNAL OFF CACHE BOOL "" FORCE)
set(SPDLOG_FMT_EXTERNAL_HO OFF CACHE BOOL "" FORCE)
set(SPDLOG_WCHAR_SUPPORT ON CACHE BOOL "" FORCE)
set(SPDLOG_ENABLE_PCH ON CACHE BOOL "" FORCE)
set(SPDLOG_USE_STD_FORMAT OFF CACHE BOOL "" FORCE)

# setup glslang
set(ENABLE_OPT OFF CACHE BOOL "" FORCE)

# install
install(DIRECTORY ${CMAKE_SOURCE_DIR}/third_party/imgui/imgui/misc/fonts DESTINATION ${CMAKE_BINARY_DIR}/bin)