cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(rocketmq VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(VERSION "1.0.0")

include(FetchContent)

find_package(Threads)

FetchContent_Declare(
        gRPC
        GIT_REPOSITORY https://gitee.com/lizhanhui/grpc.git
        GIT_TAG        v1.38.0-p2
)
FetchContent_Declare(
        googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG        v1.10.x
)
FetchContent_Declare(
        spdlog
        GIT_REPOSITORY https://github.com/gabime/spdlog.git
        GIT_TAG        v1.8.1
)

FetchContent_Declare(
        fmt
        GIT_REPOSITORY https://github.com/fmtlib/fmt.git
        GIT_TAG        7.0.2
)

FetchContent_Declare(
        ghc
        GIT_REPOSITORY https://github.com/gulrak/filesystem.git
        GIT_TAG        v1.3.2
)

FetchContent_Declare(
        opentelemetry
        GIT_REPOSITORY https://github.com/open-telemetry/opentelemetry-cpp.git
        GIT_TAG v1.0.0-rc4
)

FetchContent_Declare(
        ThreadPool
        GIT_REPOSITORY https://github.com/lizhanhui/ThreadPool.git
        GIT_TAG v1.1
)

set(FETCHCONTENT_QUIET OFF)
option(INSTALL_GTEST OFF)
set(BUILD_TESTING OFF)
set(ABSL_RUN_TESTS OFF)
set(SPDLOG_FMT_EXTERNAL ON)
if (BUILD_TESTS)
    FetchContent_MakeAvailable(googletest)
endif ()

FetchContent_MakeAvailable(fmt gRPC spdlog ghc ThreadPool opentelemetry)

option(ENABLE_TRACING OFF)
if (ENABLE_TRACING)
    FetchContent_MakeAvailable(opentelemetry)
endif ()

# Since FetchContent uses add_subdirectory under the hood, we can use
# the grpc targets directly from this build.
set(_PROTOBUF_LIBPROTOBUF libprotobuf)
set(_REFLECTION grpc++_reflection)
set(_PROTOBUF_PROTOC $<TARGET_FILE:protoc>)
set(_GRPC_GRPCPP grpc++)
if(CMAKE_CROSSCOMPILING)
    message("CMake cross compiling")
    find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
else()
    set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)
    message("CMake non-cross compiling: ${_GRPC_CPP_PLUGIN_EXECUTABLE}")
endif()

file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/proto)
file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/proto/dummy.cc)
file(GLOB PROTO_FILES
        "${CMAKE_CURRENT_SOURCE_DIR}/proto/apache/rocketmq/v1/*.proto"
        "${CMAKE_CURRENT_SOURCE_DIR}/proto/google/rpc/*.proto")
foreach(proto_file ${PROTO_FILES})
    get_filename_component(proto_file_base_name ${proto_file} NAME_WE)
    message("Proto file base file name: ${proto_file_base_name}, abs: ${proto_file}")
    set(proto_src_file "${CMAKE_BINARY_DIR}/proto/apache/rocketmq/v1/${proto_file_base_name}.pb.cc")
    set(proto_hdr_file "${CMAKE_BINARY_DIR}/proto/apache/rocketmq/v1/${proto_file_base_name}.pb.h")
    set(grpc_src_file  "${CMAKE_BINARY_DIR}/proto/apache/rocketmq/v1/${proto_file_base_name}.grpc.pb.cc")
    set(grpc_hdr_file  "${CMAKE_BINARY_DIR}/proto/apache/rocketmq/v1/${proto_file_base_name}.grpc.pb.h")

    add_custom_command(
        OUTPUT "${proto_src_file}" "${proto_hdr_file}" "${grpc_src_file}" "${grpc_hdr_file}"
        COMMAND ${_PROTOBUF_PROTOC}
        ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}/proto"
        --cpp_out "${CMAKE_BINARY_DIR}/proto"
        -I "${CMAKE_SOURCE_DIR}/proto"
        --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
        "${proto_file}"
        DEPENDS "${proto_file}"
        COMMENT "Protoc to generate gRPC stub files"
    )

    add_custom_target(${proto_file_base_name}
            ALL
            DEPENDS ${proto_src_file} ${proto_hdr_file} ${grpc_src_file} ${grpc_hdr_file}
            COMMENT "Custom target"
            VERBATIM)
endforeach()

file(GLOB_RECURSE STUB_FILES ${CMAKE_BINARY_DIR}/proto/*.cc)
add_library(mq_proto_library STATIC ${STUB_FILES})
target_include_directories(mq_proto_library PUBLIC ${CMAKE_BINARY_DIR}/proto)
target_link_libraries(mq_proto_library
        PUBLIC
            ${_REFLECTION}
            ${_GRPC_GRPCPP}
            ${_PROTOBUF_LIBPROTOBUF})

enable_testing()

option(ENABLE_TLS ON)
if (ENABLE_TLS)
    message("TLS enabled")
    find_package(OpenSSL REQUIRED)
    add_compile_definitions(TLS_ENABLED=ON)
endif ()

add_subdirectory(api)
add_subdirectory(src/main/cpp)

if (BUILD_TESTS)
    add_subdirectory(src/test/cpp/ut)
endif()

if (BUILD_INTEGRATION_TESTS)
    add_subdirectory(src/test/cpp/it)
endif ()

if (BUILD_EXAMPLES)
    add_subdirectory(example)
endif ()

include(GNUInstallDirs)
install(DIRECTORY api/rocketmq
            DESTINATION include)
install(TARGETS rocketmq_static rocketmq_shared
            LIBRARY DESTINATION lib)
install(FILES
            example/rocketmq/ExampleProducer.cpp
            example/rocketmq/ExamplePushConsumer.cpp
        DESTINATION example)

set(CPACK_PACKAGE_VERSION ${VERSION})
set(CPACK_GENERATOR "RPM")
set(CPACK_PACKAGE_NAME "rocketmq-cpp")
set(CPACK_PACKAGE_RELEASE 1)
set(CPACK_PACKAGE_CONTACT "Zhanhui Li")
set(CPACK_PACKAGE_VENDOR "Alibaba")
set(CPACK_PACKAGING_INSTALL_PREFIX "/home/admin")
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}")
include(CPack)