# For boards without their own cmake file, we look for a header file
cmake_minimum_required(VERSION 3.15)

# PICO_CMAKE_CONFIG: PICO_BOARD_HEADER_DIRS, List of directories to look for <PICO_BOARD>.h in. This may be specified the user environment, type=list, group=build
if (DEFINED ENV{PICO_BOARD_HEADER_DIRS})
    set(PICO_BOARD_HEADER_DIRS $ENV{PICO_BOARD_HEADER_DIRS})
    message("Using PICO_BOARD_HEADER_DIRS from environment ('${PICO_BOARD_HEADER_DIRS}')")
endif()
set(PICO_BOARD_HEADER_DIRS ${PICO_BOARD_HEADER_DIRS} CACHE STRING "PICO board header directories" FORCE)

list(APPEND PICO_BOARD_HEADER_DIRS ${CMAKE_CURRENT_LIST_DIR}/../src/boards/include/boards)
pico_find_in_paths(PICO_BOARD_HEADER_FILE PICO_BOARD_HEADER_DIRS ${PICO_BOARD}.h)

if (EXISTS ${PICO_BOARD_HEADER_FILE})
    message("Using board configuration from ${PICO_BOARD_HEADER_FILE}")
    list(APPEND PICO_CONFIG_HEADER_FILES ${PICO_BOARD_HEADER_FILE})
    list(APPEND PICO_BOARD_INCLUDED_FILES ${PICO_BOARD_HEADER_FILE})

    # we parse the header file to configure the defaults
    file(STRINGS ${PICO_BOARD_HEADER_FILE} HEADER_FILE_CONTENTS)

    while(HEADER_FILE_CONTENTS)
        list(POP_FRONT HEADER_FILE_CONTENTS LINE)
        # pico_board_cmake_set(var, value)
        if (LINE MATCHES "^[ \t]*pico_board_cmake_set[ \t]*\\([ \t]*([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*,[ \t]*(.*)[ \t]*\\)[ \t]*")
            set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
        # pico_board_cmake_set_default(var, value)
        elseif (LINE MATCHES "^[ \t]*pico_board_cmake_set_default[ \t]*\\([ \t]*([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*,[ \t]*(.*)[ \t]*\\)[ \t]*")
            if (NOT DEFINED "${CMAKE_MATCH_1}")
                set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
            else()
                list(APPEND PICO_BOARD_CMAKE_OVERRIDES ${CMAKE_MATCH_1})
            endif()
        # continue to support these for now
        # // pico_cmake_set var = value
        elseif (LINE MATCHES "^[ \t]*//[ \t]*pico_cmake_set[ \t]*([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*=[ \t]*(.*)")
            set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
        # // pico_cmake_set_default var = value
        elseif (LINE MATCHES "^[ \t]*//[ \t]*pico_cmake_set_default[ \t]*([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*=[ \t]*(.*)")
            if (NOT DEFINED "${CMAKE_MATCH_1}")
                set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
            else()
                list(APPEND PICO_BOARD_CMAKE_OVERRIDES ${CMAKE_MATCH_1})
            endif()
        elseif (LINE MATCHES "^[ \t]*#include[ \t]*\"boards\/(.+)\"")
            pico_find_in_paths(PICO_INCLUDED_BOARD_HEADER_FILE PICO_BOARD_HEADER_DIRS ${CMAKE_MATCH_1})
            if ((EXISTS ${PICO_INCLUDED_BOARD_HEADER_FILE}) AND (NOT ${PICO_INCLUDED_BOARD_HEADER_FILE} IN_LIST PICO_BOARD_INCLUDED_FILES))
                list(APPEND PICO_BOARD_INCLUDED_FILES ${PICO_INCLUDED_BOARD_HEADER_FILE})
                file(STRINGS ${PICO_INCLUDED_BOARD_HEADER_FILE} INCLUDED_HEADER_FILE_CONTENTS)
                list(PREPEND HEADER_FILE_CONTENTS ${INCLUDED_HEADER_FILE_CONTENTS})
            endif()
        endif()
    endwhile()
else()
    set(msg "Unable to find definition of board '${PICO_BOARD}' (specified by PICO_BOARD):\n")
    list(JOIN PICO_BOARD_HEADER_DIRS ", " DIRS)
    string(CONCAT msg ${msg} "   Looked for ${PICO_BOARD}.h in ${DIRS} (additional paths specified by PICO_BOARD_HEADER_DIRS)\n")
    list(JOIN PICO_BOARD_CMAKE_DIRS ", " DIRS)
    string(CONCAT msg ${msg} "   Looked for ${PICO_BOARD}.cmake in ${DIRS} (additional paths specified by PICO_BOARD_CMAKE_DIRS)")
    message(FATAL_ERROR ${msg})
endif()
