# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

function(paimon_find_target_headers OUT_VAR TARGET_NAME)
    set(options NO_DEFAULT_PATH)
    set(one_value_args)
    set(multi_value_args NAMES HINTS PATH_SUFFIXES)
    cmake_parse_arguments(ARG
                          "${options}"
                          "${one_value_args}"
                          "${multi_value_args}"
                          ${ARGN})

    if(NOT TARGET ${TARGET_NAME} OR NOT ARG_NAMES)
        set(${OUT_VAR}
            "${OUT_VAR}-NOTFOUND"
            PARENT_SCOPE)
        return()
    endif()

    set(_target_include_dirs)
    foreach(_property INTERFACE_INCLUDE_DIRECTORIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
                      INCLUDE_DIRECTORIES)
        get_target_property(_property_value ${TARGET_NAME} ${_property})
        if(_property_value AND NOT _property_value MATCHES "-NOTFOUND$")
            list(APPEND _target_include_dirs ${_property_value})
        endif()
    endforeach()

    set(_search_dirs)
    foreach(_dir IN LISTS _target_include_dirs)
        if(_dir MATCHES "^\\$<BUILD_INTERFACE:(.*)>$")
            list(APPEND _search_dirs "${CMAKE_MATCH_1}")
        elseif(_dir MATCHES "^\\$<INSTALL_INTERFACE:(.*)>$")
            if(IS_ABSOLUTE "${CMAKE_MATCH_1}")
                list(APPEND _search_dirs "${CMAKE_MATCH_1}")
            endif()
        elseif(NOT _dir MATCHES "^\\$<")
            list(APPEND _search_dirs "${_dir}")
        endif()
    endforeach()

    list(APPEND _search_dirs ${ARG_HINTS})
    if(_search_dirs)
        list(REMOVE_DUPLICATES _search_dirs)
    endif()

    string(MAKE_C_IDENTIFIER "${TARGET_NAME}_${ARG_NAMES}" _header_var_suffix)
    set(_header_dir_var "PAIMON_${_header_var_suffix}_HEADER_DIR")
    set(_find_args NAMES ${ARG_NAMES})
    if(_search_dirs)
        list(APPEND _find_args HINTS ${_search_dirs})
    endif()
    if(ARG_PATH_SUFFIXES)
        list(APPEND _find_args PATH_SUFFIXES ${ARG_PATH_SUFFIXES})
    endif()
    list(APPEND _find_args NO_DEFAULT_PATH)

    unset(${_header_dir_var} CACHE)
    find_path(${_header_dir_var} ${_find_args})

    if(NOT ${_header_dir_var})
        get_property(_partial_targets GLOBAL PROPERTY PAIMON_PARTIAL_SYSTEM_TARGETS)
        list(APPEND _partial_targets "${TARGET_NAME}: ${ARG_NAMES}")
        set_property(GLOBAL PROPERTY PAIMON_PARTIAL_SYSTEM_TARGETS "${_partial_targets}")
    endif()

    set(${OUT_VAR}
        "${${_header_dir_var}}"
        PARENT_SCOPE)

    unset(${_header_dir_var} CACHE)
    unset(_find_args)
    unset(_header_dir_var)
    unset(_header_var_suffix)
    unset(_partial_targets)
    unset(_property_value)
    unset(_search_dirs)
    unset(_target_include_dirs)
endfunction()
