#
# 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.
#

# Find required packages
find_package(GLIB REQUIRED COMPONENTS gobject)
include_directories(${GLIB_INCLUDE_DIRS})

include_directories(src)

# SYSLIBS contains libraries that need to be linked to all lib targets
list(APPEND SYSLIBS ${GLIB_LIBRARIES} ${GLIB_GOBJECT_LIBRARIES})

# Create the thrift C glib library
set(thrift_c_glib_SOURCES
    src/thrift/c_glib/thrift.c
    src/thrift/c_glib/thrift_struct.c
    src/thrift/c_glib/thrift_application_exception.c
    src/thrift/c_glib/thrift_configuration.c
    src/thrift/c_glib/processor/thrift_processor.c
    src/thrift/c_glib/processor/thrift_dispatch_processor.c
    src/thrift/c_glib/processor/thrift_multiplexed_processor.c
    src/thrift/c_glib/protocol/thrift_protocol.c
    src/thrift/c_glib/protocol/thrift_protocol_factory.c
    src/thrift/c_glib/protocol/thrift_protocol_decorator.c
    src/thrift/c_glib/protocol/thrift_binary_protocol.c
    src/thrift/c_glib/protocol/thrift_stored_message_protocol.c
    src/thrift/c_glib/protocol/thrift_multiplexed_protocol.c
    src/thrift/c_glib/protocol/thrift_binary_protocol_factory.c
    src/thrift/c_glib/protocol/thrift_compact_protocol.c
    src/thrift/c_glib/protocol/thrift_compact_protocol_factory.c
    src/thrift/c_glib/transport/thrift_transport.c
    src/thrift/c_glib/transport/thrift_transport_factory.c
    src/thrift/c_glib/transport/thrift_buffered_transport_factory.c
    src/thrift/c_glib/transport/thrift_framed_transport_factory.c
    src/thrift/c_glib/transport/thrift_socket.c
    src/thrift/c_glib/transport/thrift_server_transport.c
    src/thrift/c_glib/transport/thrift_server_socket.c
    src/thrift/c_glib/transport/thrift_buffered_transport.c
    src/thrift/c_glib/transport/thrift_fd_transport.c
    src/thrift/c_glib/transport/thrift_framed_transport.c
    src/thrift/c_glib/transport/thrift_memory_buffer.c
    src/thrift/c_glib/server/thrift_server.c
    src/thrift/c_glib/server/thrift_simple_server.c
)

set(thrift_c_glib_zlib_SOURCES
    src/thrift/c_glib/thrift.c
    src/thrift/c_glib/thrift_struct.c
    src/thrift/c_glib/thrift_application_exception.c
    src/thrift/c_glib/thrift_configuration.c
    src/thrift/c_glib/transport/thrift_transport.c
    src/thrift/c_glib/transport/thrift_transport_factory.c
    src/thrift/c_glib/transport/thrift_zlib_transport.c
    src/thrift/c_glib/transport/thrift_zlib_transport_factory.c
)

# If OpenSSL is not found just ignore the OpenSSL stuff
if(OPENSSL_FOUND AND WITH_OPENSSL)
    list(APPEND thrift_c_glib_SOURCES
	    src/thrift/c_glib/transport/thrift_ssl_socket.c
    )
    if(TARGET OpenSSL::SSL OR TARGET OpenSSL::Crypto)
        if(TARGET OpenSSL::SSL)
            list(APPEND SYSLIBS OpenSSL::SSL)
        endif()
        if(TARGET OpenSSL::Crypto)
            list(APPEND SYSLIBS OpenSSL::Crypto)
        endif()
    else()
        include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}")
        list(APPEND SYSLIBS "${OPENSSL_LIBRARIES}")
    endif()
endif()


# Contains the thrift specific ADD_LIBRARY_THRIFT macro
include(ThriftMacros)

ADD_LIBRARY_THRIFT(thrift_c_glib ${thrift_c_glib_SOURCES})
target_link_libraries(thrift_c_glib PUBLIC ${SYSLIBS})

# If Zlib is not found just ignore the Zlib stuff
if(WITH_ZLIB)
    ADD_LIBRARY_THRIFT(thrift_c_glib_zlib ${thrift_c_glib_zlib_SOURCES})
    target_link_libraries(thrift_c_glib_zlib PUBLIC ${SYSLIBS})
    target_link_libraries(thrift_c_glib_zlib PUBLIC thrift_c_glib)

    if(TARGET ZLIB::ZLIB)
        target_link_libraries(thrift_c_glib_zlib PUBLIC ZLIB::ZLIB)
    else()
        include_directories(SYSTEM ${ZLIB_INCLUDE_DIRS})
        target_link_libraries(thrift_c_glib_zlib PUBLIC ${ZLIB_LIBRARIES})
    endif()
endif()

# Install the headers
install(DIRECTORY "src/thrift" DESTINATION "${INCLUDE_INSTALL_DIR}"
    FILES_MATCHING PATTERN "*.h")
# Copy config.h file
install(DIRECTORY "${CMAKE_BINARY_DIR}/thrift" DESTINATION "${INCLUDE_INSTALL_DIR}"
    FILES_MATCHING PATTERN "*.h")

if(BUILD_TESTING)
    add_subdirectory(test)
endif()
