# Run chip code generation. 
#
# Example usage:
#   chip_codegen("app"
#      INPUT     "some_file.matter"
#      GENERATOR "bridge"
#      OUTPUTS
#            "bridge/OnOff.h"
#            "bridge/LevelControl.h"
#            "bridge/Switch.h"
#            # ... more outputs
#     OUTPUT_PATH  DIR_NAME_VAR
#     OUTPUT_FILES  FILE_NAMES_VAR
#   )
#
# Arguments:
#   INPUT     - the name of the ".matter" file to use for generation
#   GENERATOR - generator to use for codegen.py
#   OUTPUTS   - EXPECTED output names. MUST match actual outputs
# 
#   OUTPUT_PATH  - [OUT] output variable will contain the directory where the
#                  files will be generated
#   OUTPUT_FILES - [OUT] output variable will contain the path of generated files.
#                  suitable to be added within a build target
#
function(chip_codegen TARGET_NAME)
    cmake_parse_arguments(ARG 
         "" 
         "INPUT;GENERATOR;OUTPUT_PATH;OUTPUT_FILES" 
         "OUTPUTS" 
         ${ARGN}
    )

    set(GEN_FOLDER "${CMAKE_BINARY_DIR}/gen/${TARGET_NAME}/${ARG_GENERATOR}")

    string(REPLACE ";" "\n" OUTPUT_AS_NEWLINES "${ARG_OUTPUTS}")

    file(MAKE_DIRECTORY "${GEN_FOLDER}")
    file(GENERATE
        OUTPUT "${GEN_FOLDER}/expected.outputs"
        CONTENT "${OUTPUT_AS_NEWLINES}"
    )


    set(OUT_NAMES)
    foreach(NAME IN LISTS ARG_OUTPUTS)
        list(APPEND OUT_NAMES "${GEN_FOLDER}/${NAME}")
    endforeach()

    # Python is expected to be in the path
    #
    # find_package(Python3 REQUIRED)
    add_custom_command(
        OUTPUT "${OUT_NAMES}"
        COMMAND "${CHIP_ROOT}/scripts/codegen.py"
        ARGS "--generator" "${ARG_GENERATOR}"
             "--output-dir" "${GEN_FOLDER}"
             "--expected-outputs" "${GEN_FOLDER}/expected.outputs"
             "${ARG_INPUT}"
        DEPENDS
            "${ARG_INPUT}"
        VERBATIM
    )

    add_custom_target(${TARGET_NAME} DEPENDS "${OUT_NAMES}")

    # Forward outputs to the parent
    set(${ARG_OUTPUT_FILES} "${OUT_NAMES}" PARENT_SCOPE)
    set(${ARG_OUTPUT_PATH} "${GEN_FOLDER}" PARENT_SCOPE)
endfunction()
