# Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
#
# SPDX-License-Identifier: MIT

find_package(Python3 COMPONENTS Interpreter REQUIRED)

# Check for PyYAML
execute_process(
    COMMAND "${Python3_EXECUTABLE}" -c "import yaml"
    RESULT_VARIABLE PY_YAML_RESULT
    ERROR_QUIET
)
if(NOT PY_YAML_RESULT EQUAL 0)
    message(FATAL_ERROR "PyYAML is required in order to read the configuration file. Please install it")
endif()

if(WIN32)
    set(CONFIG_OS "windows")
    set(CONFIG_ARCH "windows")
else()
    set(CONFIG_OS "linux")

    if (HIP_PLATFORM MATCHES "amd")
        # TODO multiple arch support
        foreach(ARCH ${HIP_GPU_ARCH_LIST})
            set(CONFIG_ARCH ${ARCH})
        endforeach()
    else()
        set(CONFIG_ARCH "linux")
    endif()
endif()

set(HIP_TESTS_CONFIGS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/configs)
set(CONFIG_COMMON_MODULE ${CMAKE_CURRENT_SOURCE_DIR}/common.py)
set(CONFIG_PARSER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/parse_config.py)
set(CONFIG_CHECK_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/check_config.py)
set(SOURCES_CHECK_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/check_sources.py)
set(HIP_TEST_CONFIG_HEADER ${CATCH_INCLUDE_BINARY_DIR}/hip_test_config.hh)
set(HIP_TEST_PARAMETERS_HEADER ${CATCH_INCLUDE_BINARY_DIR}/hip_test_parameters.hh)

file(GLOB HIP_TESTS_GROUP_CONFIGS CONFIGURE_DEPENDS ${HIP_TESTS_CONFIGS_DIR}/*.yaml)
file(GLOB HIP_TESTS_UNIT_CONFIGS CONFIGURE_DEPENDS ${HIP_TESTS_CONFIGS_DIR}/unit/*.yaml)

# When building with Address Sanitizer, pass --asan so the parser skips test
# cases that list 'asan' in their 'disabled' field.
set(CONFIG_ASAN_FLAG)
if(ENABLE_ADDRESS_SANITIZER OR THEROCK_SANITIZER STREQUAL "ASAN" OR THEROCK_SANITIZER STREQUAL "HOST_ASAN")
    set(CONFIG_ASAN_FLAG "--asan")
endif()

if(ENABLE_YAML_TAGS)
    add_custom_target(check_hip_tests_config ALL
        COMMAND "${Python3_EXECUTABLE}" "${CONFIG_CHECK_SCRIPT}" "${HIP_TESTS_CONFIGS_DIR}"
        COMMENT "Validating hip-tests YAML configurations"
    )

    add_custom_target(check_hip_tests_sources ALL
        COMMAND "${Python3_EXECUTABLE}" "${SOURCES_CHECK_SCRIPT}" "${HIP_TESTS_CONFIGS_DIR}" "${CMAKE_SOURCE_DIR}"
        COMMENT "Checking hip-tests sources for missing YAML configurations"
    )
endif()

# Compile-time switch: register disabled tests as enabled in ctest.
# OFF (default): disabled tests carry [disabled] tag and are DISABLED TRUE in ctest.
# ON: ctest registers them as normal enabled tests; binary tags are unchanged.
option(HIP_TESTS_RUN_DISABLED
    "Register disabled tests as enabled in ctest so plain ctest runs them." OFF)
if(HIP_TESTS_RUN_DISABLED)
    message(STATUS "HIP_TESTS_RUN_DISABLED=ON: disabled tests will run in plain ctest")
endif()

# Generate both test definitions and parameter headers from YAML
# - hip_test_config.hh: TEST_CASE macros with tags
# - hip_test_parameters.hh: Compile-time constants for level parameters
add_custom_command(
    OUTPUT ${HIP_TEST_CONFIG_HEADER} ${HIP_TEST_PARAMETERS_HEADER}
    COMMAND "${Python3_EXECUTABLE}" "${CONFIG_PARSER_SCRIPT}"
            "${HIP_TESTS_CONFIGS_DIR}"
            "${HIP_PLATFORM}"
            "${CONFIG_OS}"
            "${CONFIG_ARCH}"
            "${HIP_TEST_CONFIG_HEADER}"
            "${HIP_TEST_PARAMETERS_HEADER}"
            ${CONFIG_ASAN_FLAG}
    DEPENDS ${CONFIG_COMMON_MODULE} ${CONFIG_PARSER_SCRIPT} ${HIP_TESTS_UNIT_CONFIGS} ${HIP_TESTS_GROUP_CONFIGS}
    COMMENT "Generating hip_test_config.hh and hip_test_parameters.hh"
)

# Ensure the generated header files are built before the main target
add_custom_target(hip_tests_config DEPENDS ${HIP_TEST_CONFIG_HEADER} ${HIP_TEST_PARAMETERS_HEADER})
if(ENABLE_YAML_TAGS)
    add_dependencies(hip_tests_config check_hip_tests_config check_hip_tests_sources)
endif()
set_source_files_properties(${HIP_TEST_CONFIG_HEADER} ${HIP_TEST_PARAMETERS_HEADER} PROPERTIES GENERATED TRUE)
