#
# Licensed 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.
#
# Tries to find the clang-tidy and clang-format modules
#
# Usage of this module as follows:
#
#  find_package(ClangTools)
#
# Variables used by this module which can change the default behaviour and need
# to be set before calling find_package:
#
#  CLANG_FORMAT_VERSION -
#   The version of clang-format to find. If this is not specified, clang-format
#   will not be searched for.
#
#  ClangTools_PATH -
#   When set, this path is inspected in addition to standard library binary locations
#   to find clang-tidy and clang-format
#
# This module defines
#  CLANG_TIDY_BIN, The  path to the clang tidy binary
#  CLANG_TIDY_FOUND, Whether clang tidy was found
#  CLANG_FORMAT_BIN, The path to the clang format binary
#  CLANG_FORMAT_FOUND, Whether clang format was found

set(CLANG_TOOLS_SEARCH_PATHS
    ${ClangTools_PATH}
    $ENV{CLANG_TOOLS_PATH}
    /usr/local/bin
    /usr/bin
    "C:/Program Files/LLVM/bin" # Windows, non-conda
    "$ENV{CONDA_PREFIX}/Library/bin") # Windows, conda
if(LLVM_BREW_PREFIX)
  list(APPEND CLANG_TOOLS_SEARCH_PATHS "${LLVM_BREW_PREFIX}/bin")
endif()

function(FIND_CLANG_TOOL NAME OUTPUT VERSION_CHECK_PATTERN)
  unset(CLANG_TOOL_BIN CACHE)
  find_program(CLANG_TOOL_BIN
               NAMES ${NAME}-${ARROW_LLVM_VERSION} ${NAME}-${ARROW_LLVM_MAJOR_VERSION}
               PATHS ${CLANG_TOOLS_SEARCH_PATHS}
               NO_DEFAULT_PATH)
  if(NOT CLANG_TOOL_BIN)
    # try searching for non-versioned tool and check the version
    find_program(CLANG_TOOL_BIN
                 NAMES ${NAME}
                 PATHS ${CLANG_TOOLS_SEARCH_PATHS}
                 NO_DEFAULT_PATH)
    if(CLANG_TOOL_BIN)
      unset(CLANG_TOOL_VERSION_MESSAGE)
      execute_process(COMMAND ${CLANG_TOOL_BIN} "-version"
                      OUTPUT_VARIABLE CLANG_TOOL_VERSION_MESSAGE
                      OUTPUT_STRIP_TRAILING_WHITESPACE)
      if(NOT (${CLANG_TOOL_VERSION_MESSAGE} MATCHES ${VERSION_CHECK_PATTERN}))
        set(CLANG_TOOL_BIN "CLANG_TOOL_BIN-NOTFOUND")
      endif()
    endif()
  endif()
  if(CLANG_TOOL_BIN)
    set(${OUTPUT} ${CLANG_TOOL_BIN} PARENT_SCOPE)
  else()
    set(${OUTPUT} "${OUTPUT}-NOTFOUND" PARENT_SCOPE)
  endif()
endfunction()

find_clang_tool(clang-tidy CLANG_TIDY_BIN
                "LLVM version ${ARROW_LLVM_MAJOR_VERSION}\\.${ARROW_LLVM_MINOR_VERSION}")
if(CLANG_TIDY_BIN)
  set(CLANG_TIDY_FOUND 1)
  message(STATUS "clang-tidy found at ${CLANG_TIDY_BIN}")
else()
  set(CLANG_TIDY_FOUND 0)
  message(STATUS "clang-tidy not found")
endif()

find_clang_tool(
  clang-format CLANG_FORMAT_BIN
  "^clang-format version ${ARROW_LLVM_MAJOR_VERSION}\\.${ARROW_LLVM_MINOR_VERSION}")
if(CLANG_FORMAT_BIN)
  set(CLANG_FORMAT_FOUND 1)
  message(STATUS "clang-format found at ${CLANG_FORMAT_BIN}")
else()
  set(CLANG_FORMAT_FOUND 0)
  message(STATUS "clang-format not found")
endif()
