cmake_minimum_required(VERSION 3.20)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

include(UpdateSubmodule)
include(ResolveKeyboard)
include(ValidateJson)
include(ProcessKeyboard)

set(QMK_KEYBOARDS_FOLDER "${CMAKE_SOURCE_DIR}/keyboards")

function(_get_all_cmake_targets out_var current_dir)
    get_property(targets DIRECTORY ${current_dir} PROPERTY BUILDSYSTEM_TARGETS)
    get_property(subdirs DIRECTORY ${current_dir} PROPERTY SUBDIRECTORIES)

    foreach(subdir ${subdirs})
        _get_all_cmake_targets(subdir_targets ${subdir})
        list(APPEND targets ${subdir_targets})
    endforeach()

    set(${out_var} ${targets} PARENT_SCOPE)
endfunction()

if(NOT DEFINED QMK_KEYBOARD)
    # configure step - populate targets
    project(qmk_firmware)

    add_subdirectory(keyboards)

else()
    # build step
    if(NOT DEFINED QMK_KEYMAP_FOLDER)
        set(QMK_KEYMAP_FOLDER "default")
    endif()

    resolve_keyboard(${QMK_KEYBOARD_FOLDER} QMK_KEYBOARD_FOLDER_ABS)
    cmake_path(IS_PREFIX QMK_KEYBOARDS_FOLDER "${QMK_KEYBOARD_FOLDER_ABS}" IS_KEYBOARDS_FOLDER)
    resolve_config_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_CONFIG_H)
    process_keyboard()
    resolve_keyboard_h(${QMK_KEYBOARD_FOLDER_ABS} QMK_KEYBOARD_H)
    resolve_keymap_c(${QMK_KEYBOARD_FOLDER_ABS} ${QMK_KEYMAP_FOLDER} QMK_KEYMAP_C)

    message(STATUS "config.h: ${QMK_KEYBOARD_CONFIG_H}")
    message(STATUS "keyboard.h: ${QMK_KEYBOARD_H}")
    message(STATUS "keymap.c: ${QMK_KEYMAP_C}")


    project(${QMK_KEYBOARD}
        LANGUAGES C CXX ASM
        HOMEPAGE_URL ${URL}
        VERSION ${DEVICE_VER})

    # add_compile_options(
    # -include ${QMK_KEYBOARD_CONFIG_H}
    # )
    add_compile_definitions(
        QMK_KEYBOARD_H="${QMK_KEYBOARD_H}"
        KEYBOARD_${QMK_KEYBOARD}
        KEYMAP_C="${QMK_KEYMAP_C}"
        MATRIX_ROWS=8
        MATRIX_COLS=6
    )

    if(DEFINED DIODE_DIRECTION)
        add_compile_definitions(DIODE_DIRECTION=${DIODE_DIRECTION})
    endif()

    include_directories(${CMAKE_SOURCE_DIR})

    # if(EXISTS ${QMK_KEYBOARD_FOLDER_ABS}/CMakeLists.txt)
    # add_subdirectory(${QMK_KEYBOARD_FOLDER_ABS})
    # else()
    file(GLOB KEYBOARD_SRC "${QMK_KEYBOARD_FOLDER_ABS}/*.c")
    list(REMOVE_ITEM KEYBOARD_SRC "${QMK_KEYMAP_C}")
    add_qmk_executable(${TARGET_NAME} ${KEYBOARD_SRC})

    # endif()
    # add_library(qmk)

    target_precompile_headers(qmk PUBLIC
        ${QMK_KEYBOARD_CONFIG_H}
    )

    resolve_keyboard_includes(${QMK_KEYBOARD_FOLDER_ABS})

    add_subdirectory(quantum)
    add_subdirectory(platforms)
    add_subdirectory(tmk_core/protocol)

    include(features/oled)
    include(features/backlight)
    include(features/eeprom)
    include(features/matrix)
    include(features/fnv)
endif()
