set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

# ------------------------------------------------------------------------------
# Path roots
# ------------------------------------------------------------------------------
set(THIRD_PARTY ${CMAKE_SOURCE_DIR}/../../../../../third_party)
set(HAL_SRC     ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src)

add_executable(obk_provisioning)

# ------------------------------------------------------------------------------
# Sources
# ------------------------------------------------------------------------------
target_sources(obk_provisioning PRIVATE
    # Board port files
    ${CMAKE_SOURCE_DIR}/cmake/startup_stm32h573xx.S
    ${CMAKE_SOURCE_DIR}/cmake/syscalls.c
    ${CMAKE_SOURCE_DIR}/src/system_stm32h5xx.c

    # Project-specific sources
    ${CMAKE_SOURCE_DIR}/src/main.c
    ${CMAKE_SOURCE_DIR}/src/stm32h5xx_it.c

    ${HAL_SRC}/stm32h5xx_hal.c
    ${HAL_SRC}/stm32h5xx_hal_cortex.c
    ${HAL_SRC}/stm32h5xx_hal_flash.c
    ${HAL_SRC}/stm32h5xx_hal_flash_ex.c
    ${HAL_SRC}/stm32h5xx_hal_gpio.c
    ${HAL_SRC}/stm32h5xx_hal_pwr.c
    ${HAL_SRC}/stm32h5xx_hal_pwr_ex.c
    ${HAL_SRC}/stm32h5xx_hal_rcc.c
    ${HAL_SRC}/stm32h5xx_hal_rcc_ex.c
    ${HAL_SRC}/stm32h5xx_hal_uart.c
    ${HAL_SRC}/stm32h5xx_hal_uart_ex.c
)

# ------------------------------------------------------------------------------
# Include paths
# ------------------------------------------------------------------------------
target_include_directories(obk_provisioning PRIVATE
    ${CMAKE_SOURCE_DIR}/src
    ${THIRD_PARTY}/cmsis/include
    ${THIRD_PARTY}/st/devices/stm32h5xx
    ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/inc
)

# ------------------------------------------------------------------------------
# Compile definitions
# ------------------------------------------------------------------------------
target_compile_definitions(obk_provisioning PRIVATE
    STM32H573xx
    USE_HAL_DRIVER
    USE_STM32H573I_DK
)

# Target HDPL level: 1 (default), 2, or 3.
# Enable with: cmake --preset Debug -DOBK_TARGET_HDPL=2
set(OBK_TARGET_HDPL "1" CACHE STRING "OBK HDPL level to provision (1, 2, or 3)")
set_property(CACHE OBK_TARGET_HDPL PROPERTY STRINGS "1" "2" "3")
target_compile_definitions(obk_provisioning PRIVATE OBK_TARGET_HDPL=${OBK_TARGET_HDPL})
message(STATUS "OBK_TARGET_HDPL: ${OBK_TARGET_HDPL}")

# When ON, skips the "already provisioned" guard, cleans ALL OBK residue via
# an intermediate NO_DATA swap, then reprograms the key.
# Enable with: cmake --preset Debug -DOBK_ERASE_BEFORE_PROVISION=ON
option(OBK_ERASE_BEFORE_PROVISION "Clean and reprovision OBK slot even if already written" OFF)
if(OBK_ERASE_BEFORE_PROVISION)
    target_compile_definitions(obk_provisioning PRIVATE OBK_ERASE_BEFORE_PROVISION)
    message(STATUS "OBK_ERASE_BEFORE_PROVISION: ON - existing key will be overwritten")
endif()

# ------------------------------------------------------------------------------
# Post-build: generate .bin for flashing
# ------------------------------------------------------------------------------
add_custom_command(TARGET obk_provisioning POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O binary
        $<TARGET_FILE:obk_provisioning>
        ${CMAKE_BINARY_DIR}/obk_provisioning.bin
    COMMENT "Generating obk_provisioning.bin"
)
add_custom_command(TARGET obk_provisioning POST_BUILD
    COMMAND ${CMAKE_SIZE} $<TARGET_FILE:obk_provisioning>
)

# Copy the generated .bin file to ../
add_custom_command(TARGET obk_provisioning POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
        ${CMAKE_CURRENT_BINARY_DIR}/obk_provisioning.bin
        ${CMAKE_CURRENT_SOURCE_DIR}/../
        COMMENT "Copying obk_provisioning.bin to parent directory"
)
