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}")

set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)

# ──────────────────────────────────────────────────────────────────────────────
# Path roots
# ──────────────────────────────────────────────────────────────────────────────
set(SIBLING     ${CMAKE_SOURCE_DIR}/../iap_dual_bank/app_http_server)
set(THIRD_PARTY ${CMAKE_SOURCE_DIR}/../../../../third_party)
set(SRC_ROOT    ${CMAKE_SOURCE_DIR}/../../../../src)
set(CRYPTO      ${SRC_ROOT}/cyclone_crypto)
set(HAL_SRC     ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src)
set(STSAFE_MW   ${THIRD_PARTY}/st/middleware/SAFE_Axx0)
set(STSAFE_BSP  ${THIRD_PARTY}/st/boards/components/SAFEA1xx)

add_executable(stsafe_provisioning)

# ──────────────────────────────────────────────────────────────────────────────
# Sources
# ──────────────────────────────────────────────────────────────────────────────
target_sources(stsafe_provisioning PRIVATE
    # Board port files — shared with the sibling app (same MCU, same board)
    ${SIBLING}/cmake/startup_stm32h563xx.S
    ${SIBLING}/cmake/syscalls.c
    ${SIBLING}/src/system_stm32h5xx.c

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

    # STSAFE-A1xx middleware
    ${STSAFE_MW}/stsafea_core.c
    ${STSAFE_MW}/stsafea_service.c
    ${STSAFE_MW}/stsafea_crypto.c
    ${STSAFE_MW}/stsafea_crc.c

    # CycloneCRYPTO — AES, CBC, CMAC needed by stsafea_crypto_interface.c
    ${SRC_ROOT}/common/cpu_endian.c
    ${SRC_ROOT}/common/os_port_none.c
    ${CRYPTO}/cipher/aes.c
    ${CRYPTO}/cipher_modes/cbc.c
    ${CRYPTO}/mac/cmac.c

    # BSP (LED support only — usbpd_pwr.c excluded, it requires ADC not needed here)
    ${THIRD_PARTY}/st/boards/stm32h5xx_nucleo/stm32h5xx_nucleo.c

    # Minimal HAL — only the modules used by this project
    ${HAL_SRC}/stm32h5xx_hal.c
    ${HAL_SRC}/stm32h5xx_hal_cortex.c
    ${HAL_SRC}/stm32h5xx_hal_gpio.c
    ${HAL_SRC}/stm32h5xx_hal_i2c.c
    ${HAL_SRC}/stm32h5xx_hal_i2c_ex.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(stsafe_provisioning PRIVATE
    ${CMAKE_SOURCE_DIR}/src
    ${THIRD_PARTY}/cmsis/include
    ${THIRD_PARTY}/st/devices/stm32h5xx
    ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/inc
    ${THIRD_PARTY}/st/boards/stm32h5xx_nucleo
    ${STSAFE_MW}
    ${STSAFE_BSP}
    ${CRYPTO}
    ${SRC_ROOT}/common
)

# ──────────────────────────────────────────────────────────────────────────────
# Compile definitions
# ──────────────────────────────────────────────────────────────────────────────
target_compile_definitions(stsafe_provisioning PRIVATE
    STM32H563xx
    USE_HAL_DRIVER
    USE_STM32H5XX_NUCLEO
    # USE_NUCLEO_144 is defined in stm32h5xx_nucleo_conf.h — not repeated here
)

# ──────────────────────────────────────────────────────────────────────────────
# Post-build: generate .bin for flashing
# ──────────────────────────────────────────────────────────────────────────────
add_custom_command(TARGET stsafe_provisioning POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O binary
        $<TARGET_FILE:stsafe_provisioning>
        ${CMAKE_BINARY_DIR}/stsafe_provisioning.bin
    COMMENT "Generating stsafe_provisioning.bin"
)
add_custom_command(TARGET stsafe_provisioning POST_BUILD
    COMMAND ${CMAKE_SIZE} $<TARGET_FILE:stsafe_provisioning>
)
add_custom_command(TARGET stsafe_provisioning POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
        ${CMAKE_BINARY_DIR}/stsafe_provisioning.bin
        ${CMAKE_CURRENT_SOURCE_DIR}/../
    COMMENT "Copying stsafe_provisioning.bin to parent directory"
)

# Refresh the footprint report on a Release build. A Debug build leaves the committed
# numbers alone, so a report always describes the configuration customers ship.
if (CMAKE_BUILD_TYPE STREQUAL "Release")
	add_custom_command(TARGET stsafe_provisioning POST_BUILD
		COMMAND python3 ${CMAKE_SOURCE_DIR}/footprint.py
		--map "${CMAKE_CURRENT_BINARY_DIR}/stsafe_provisioning.map"
		--ld "${CMAKE_SOURCE_DIR}/cmake/stm32h563_flash.ld"
		--elf "${CMAKE_CURRENT_BINARY_DIR}/stsafe_provisioning.elf"
		--output-summary "${CMAKE_SOURCE_DIR}/reports/footprint_summary.json"
		--build-type Release
		--folders ${SRC_ROOT}/cyclone_boot ${SRC_ROOT}/cyclone_crypto ${SRC_ROOT}/cyclone_tcp ${SRC_ROOT}/common
	)
endif ()
