cmake_policy(SET CMP0079 NEW) # target_link_libraries() allows use with targets in other directories.

set(CMAKE_C_STANDARD 11)

# Initialise the Pico SDK
set(PICO_BOARD_HEADER_DIRS ${CMAKE_CURRENT_LIST_DIR}/board)
include (${CMAKE_CURRENT_LIST_DIR}/pico_sdk_import.cmake)

set(32BLIT_PICO 1)

if(PICO_PLATFORM MATCHES "^rp2350")
    set(32BLIT_PICO_2350 1)
endif()

# make sure BlitEngine is built with the right exception flags
target_link_libraries(BlitEngine PUBLIC pico_cxx_options pico_base_headers)

# also enable function/data sectons
target_compile_options(BlitEngine PRIVATE -ffunction-sections -fdata-sections)

include(${CMAKE_CURRENT_LIST_DIR}/board-config.cmake)

# late SDK init
# (pico_sdk_init needs to be after importing extras, which we don't know if we'll need until now)
if(BLIT_REQUIRE_PICO_EXTRAS)
    include(${CMAKE_CURRENT_LIST_DIR}/pico_extras_import.cmake)
endif()

pico_sdk_init()

# some file paths we need later
if(32BLIT_PICO_2350)
    set(LINKER_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/memmap_blit_2350.ld.in)
else()
    set(LINKER_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/memmap_blit.ld.in)
endif()
set(STARTUP_SRC ${CMAKE_CURRENT_LIST_DIR}/startup.S ${CMAKE_CURRENT_LIST_DIR}/startup.cpp)
set(LAUNCHERSHARED_DIR ${CMAKE_CURRENT_LIST_DIR}/../launcher-shared)
set(HAL_DIR ${CMAKE_CURRENT_LIST_DIR})

# functions
function(blit_executable NAME)
    message(STATUS "Processing ${NAME}")
    blit_executable_args(${ARGN})

    add_executable(${NAME} ${SOURCES})
    target_link_libraries(${NAME} BlitEngine pico_platform_headers)

    if(PICO_STANDALONE_UF2)
        # standalone .uf2
        if(NOT TARGET BlitHalPico)
            add_subdirectory(${HAL_DIR} 32blit-pico)
        endif()
        if(NOT TARGET LauncherShared)
            add_subdirectory(${LAUNCHERSHARED_DIR} launcher-shared)
        endif()

        pico_enable_stdio_uart(${NAME} 1)
        if(NOT BLIT_USB_DRIVER STREQUAL "host")
            pico_enable_stdio_usb(${NAME} 1)
            # re-enable baud rate reset (we don't define our own tud_cdc_line_coding_cb)
            # we have to set all the defines to compile? (something broken with the defaults?)
            target_compile_definitions(${NAME} PRIVATE PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE=1 PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE=1200 PICO_STDIO_USB_RESET_BOOTSEL_INTERFACE_DISABLE_MASK=0)
        endif()

        target_compile_definitions(${NAME} PRIVATE BLIT_PICO_STANDALONE=1 PICO_EMBED_XIP_SETUP=1)
        target_link_libraries(${NAME} BlitHalPico)

        pico_add_extra_outputs(${NAME})

        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.uf2
            DESTINATION bin
        )
    elseif(PICO_BLIT)
        # loadable .blit
        set_property(TARGET ${NAME} PROPERTY BLIT_PICO_BLIT TRUE)

        # calculate and verify flash offset
        if(NOT PICO_BLIT_OFFSET_KB)
            if(32BLIT_PICO_2350)
                # if we build the file for a 4MB offset, we can use address translation
                set(PICO_BLIT_OFFSET_KB 4096)
            else()
                set(PICO_BLIT_OFFSET_KB 512)
            endif()
        endif()

        math(EXPR offset_mod "${PICO_BLIT_OFFSET_KB} % 64")
        if(${PICO_BLIT_OFFSET_KB} LESS 256 OR offset_mod)
            message(FATAL_ERROR "Blit offset should be >= 256k and a multiple of 64k")
        endif()

        math(EXPR FLASH_OFFSET_BYTES "${PICO_BLIT_OFFSET_KB} * 1024")

        # customise linker script
        configure_file(${LINKER_SCRIPT} memmap_blit.ld)
        set(LINKER_SCRIPT_OUT ${CMAKE_CURRENT_BINARY_DIR}/memmap_blit.ld)

        target_compile_definitions(${NAME} PRIVATE ${BLIT_BOARD_DEFINITIONS}) # need these for framebuffer config
        target_compile_options(${NAME} PRIVATE -ffunction-sections -fdata-sections)

        # set device id in header, these should match the BlitDevice enum
        if(32BLIT_PICO_2350)
            set_source_files_properties(${STARTUP_SRC} PROPERTIES COMPILE_DEFINITIONS DEVICE_ID=3)
        else()
            set_source_files_properties(${STARTUP_SRC} PROPERTIES COMPILE_DEFINITIONS DEVICE_ID=2)
        endif()

        # minimal pico-sdk libs
        target_link_libraries(${NAME} boot_picobin_headers pico_bit_ops pico_clib_interface pico_cxx_options pico_divider pico_double pico_int64_ops pico_float pico_malloc pico_mem_ops pico_runtime_headers)
        target_compile_definitions(${NAME} PRIVATE PICO_TIME_DEFAULT_ALARM_POOL_DISABLED) # avoid pulling timer and irq code

        target_link_options(${NAME} PRIVATE --specs=nosys.specs LINKER:--script=${LINKER_SCRIPT_OUT} LINKER:--gc-sections)
        set_property(TARGET ${NAME} APPEND PROPERTY LINK_DEPENDS ${LINKER_SCRIPT_OUT})

        target_sources(${NAME} PRIVATE ${STARTUP_SRC})

        pico_add_bin_output(${NAME})
        pico_add_dis_output(${NAME})

        set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${NAME}>.blit)

        # no relocs, just copy it
        set(BIN_NAME "$<IF:$<BOOL:$<TARGET_PROPERTY:${NAME},OUTPUT_NAME>>,$<TARGET_PROPERTY:${NAME},OUTPUT_NAME>,$<TARGET_PROPERTY:${NAME},NAME>>.bin")
        add_custom_command(TARGET ${NAME} POST_BUILD
            VERBATIM
            COMMENT "Building ${NAME}.blit"
            COMMAND cp ${BIN_NAME} ${BLIT_FILENAME}
        )

        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
            DESTINATION bin
        )
    endif()
endfunction()

function(blit_metadata TARGET FILE)
    if(NOT IS_ABSOLUTE ${FILE})
        set(FILE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
    endif()

    # cause cmake to reconfigure whenever the asset list changes
    set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FILE})

    # get the inputs/outputs for the asset tool (at configure time)
    execute_process(
        COMMAND ${32BLIT_TOOLS_EXECUTABLE} cmake --config ${FILE} --cmake ${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake
        RESULT_VARIABLE TOOL_RESULT
    )
    if(${TOOL_RESULT})
        message(FATAL_ERROR "Reading metadata config failed!\n")
    endif()

    include(${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake)

    get_property(PICO_BLIT TARGET ${TARGET} PROPERTY BLIT_PICO_BLIT)

    if(NOT PICO_BLIT)
        # create metadata/binary info source at build time
        set(METADATA_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_binary_info.cpp")

        add_custom_command(
            OUTPUT ${METADATA_SOURCE}
            COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${32BLIT_TOOLS_EXECUTABLE} metadata --force --config ${FILE} --pico-bi ${METADATA_SOURCE}
            DEPENDS ${FILE}
            VERBATIM
        )

        # add the generated source
        target_sources(${TARGET} PRIVATE ${METADATA_SOURCE})

        # avoid the fallback to target name
        target_compile_definitions(${TARGET} PRIVATE PICO_NO_BI_PROGRAM_NAME=1)
    else()
        # real .blit metadata
        set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${TARGET}>.blit)

        add_custom_command(
            TARGET ${TARGET} POST_BUILD
            COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${32BLIT_TOOLS_EXECUTABLE} metadata --config ${FILE} --file ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
            VERBATIM
        )

        # force relink on change so that the post-build commands are rerun
        set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS ${FILE} ${METADATA_DEPENDS})
    endif()

endfunction()
