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

add_celix_bundle(TestExportImportRemoteServiceFactory
        SOURCES src/TestExportImportRemoteServiceFactory.cc
)
target_link_libraries(TestExportImportRemoteServiceFactory PRIVATE Celix::rsa_spi Celix::pubsub_api Celix::Promises Celix::log_helper)
target_compile_options(TestExportImportRemoteServiceFactory PRIVATE -std=c++17) #TODO how can this be improved (bring back -std=c++17 on INTERFACE for promises?
target_include_directories(TestExportImportRemoteServiceFactory PRIVATE include)
celix_bundle_files(TestExportImportRemoteServiceFactory
        resources/Calculator$add$Invoke.descriptor
        resources/Calculator$add$Return.descriptor
        DESTINATION "META-INF/descriptors"
)

add_celix_bundle(CalculatorProvider
        SOURCES src/CalculatorProvider.cc
)
target_link_libraries(CalculatorProvider PRIVATE Celix::Promises)
target_include_directories(CalculatorProvider PRIVATE include)
target_compile_options(CalculatorProvider PRIVATE -std=c++17) #TODO how can this be improved (bring back -std=c++17 on INTERFACE for promises?


add_celix_bundle(CalculatorConsumer
        SOURCES src/CalculatorConsumer.cc
)
celix_bundle_files(CalculatorConsumer ${CMAKE_CURRENT_SOURCE_DIR}/resources/endpoint_discovery.json DESTINATION "META-INF/discovery") # add configured discovery as resource in the bundle.
target_link_libraries(CalculatorConsumer PRIVATE Celix::Promises Celix::shell_api Celix::RsaConfiguredDiscovery_api)
target_include_directories(CalculatorConsumer PRIVATE include)
target_compile_options(CalculatorConsumer PRIVATE -std=c++17) #TODO how can this be improved (bring back -std=c++17 on INTERFACE for promises?

if (ENABLE_TESTING)
    add_subdirectory(gtest)
endif()

################# Integration examples ##################################

add_celix_container(RemoteCalculatorProvider
        GROUP rsa
        PROPERTIES
            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
        BUNDLES
            Celix::ShellCxx
            Celix::shell_tui

            #Pubsub needed for remote services on pubsub
            Celix::pubsub_serializer_json
            Celix::pubsub_topology_manager
            Celix::pubsub_admin_zmq_v2
            Celix::pubsub_protocol_wire_v2
            Celix::pubsub_discovery_etcd

            #Remote Services
            Celix::RemoteServiceAdmin
            TestExportImportRemoteServiceFactory #needed to be able to create a ExportedService for ICalculator

            CalculatorProvider
)
target_link_libraries(RemoteCalculatorProvider PRIVATE ZMQ::lib CZMQ::lib)

add_celix_container(RemoteCalculatorConsumer
        GROUP rsa
        PROPERTIES
            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
        BUNDLES
            Celix::ShellCxx
            Celix::shell_tui

            #Pubsub needed for remote services on pubsub
            Celix::pubsub_serializer_json
            Celix::pubsub_topology_manager
            Celix::pubsub_discovery_etcd
            Celix::pubsub_admin_zmq_v2
            Celix::pubsub_protocol_wire_v2

            #Remote Services
            Celix::RsaConfiguredDiscovery
            Celix::RemoteServiceAdmin
            TestExportImportRemoteServiceFactory #needed to be able to create a ExportedService for ICalculator

            CalculatorConsumer
)
target_link_libraries(RemoteCalculatorConsumer PRIVATE ZMQ::lib CZMQ::lib)
