option (ENABLE_REPLXX "Enable replxx support" ${ENABLE_LIBRARIES})

if (ENABLE_REPLXX)
    option (USE_INTERNAL_REPLXX "Use internal replxx library" ${NOT_UNBUNDLED})

    if (USE_INTERNAL_REPLXX)
        set (LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/replxx")

        set(SRCS
            ${LIBRARY_DIR}/src/conversion.cxx
            ${LIBRARY_DIR}/src/ConvertUTF.cpp
            ${LIBRARY_DIR}/src/escape.cxx
            ${LIBRARY_DIR}/src/history.cxx
            ${LIBRARY_DIR}/src/io.cxx
            ${LIBRARY_DIR}/src/prompt.cxx
            ${LIBRARY_DIR}/src/replxx_impl.cxx
            ${LIBRARY_DIR}/src/replxx.cxx
            ${LIBRARY_DIR}/src/util.cxx
            ${LIBRARY_DIR}/src/wcwidth.cpp
        )

        add_library (replxx ${SRCS})
        target_include_directories(replxx SYSTEM PUBLIC ${LIBRARY_DIR}/include)
    else ()
        find_library(LIBRARY_REPLXX NAMES replxx replxx-static)
        find_path(INCLUDE_REPLXX replxx.hxx)

        add_library(replxx UNKNOWN IMPORTED)
        set_property(TARGET replxx PROPERTY IMPORTED_LOCATION ${LIBRARY_REPLXX})
        target_include_directories(replxx SYSTEM PUBLIC ${INCLUDE_REPLXX})

        set(CMAKE_REQUIRED_LIBRARIES replxx)
        check_cxx_source_compiles(
            "
            #include <replxx.hxx>
            int main() {
                replxx::Replxx rx;
            }
            "
            EXTERNAL_REPLXX_WORKS
        )

        if (NOT EXTERNAL_REPLXX_WORKS)
            message (FATAL_ERROR "replxx is unusable: ${LIBRARY_REPLXX} ${INCLUDE_REPLXX}")
        endif ()
    endif ()

    if (COMPILER_CLANG)
        target_compile_options(replxx PRIVATE -Wno-documentation)
    endif ()

    target_compile_definitions(replxx PUBLIC USE_REPLXX=1)

    message (STATUS "Using replxx")
else ()
    add_library(replxx INTERFACE)
    target_compile_definitions(replxx INTERFACE USE_REPLXX=0)

    message (STATUS "Not using replxx (Beware! Runtime fallback to readline is possible!)")
endif ()