add_library(workrave-libs-core-next STATIC
  Break.cc
  BreakStateModel.cc
  BreakStatistics.cc
  BreakConfig.cc
  BreaksControl.cc
  Core.cc
  CoreModes.cc
  CoreConfig.cc
  CoreHooks.cc
  DayTimePred.cc
  LocalActivityMonitor.cc
  ReadingActivityMonitor.cc
  Timer.cc
  TimerActivityMonitor.cc)

target_code_coverage(workrave-libs-core-next)

if (HAVE_CORE_NEXT_DBUS)
  rpc_generate_dbus_source(${CMAKE_CURRENT_SOURCE_DIR}/Core.hh ${CMAKE_CURRENT_BINARY_DIR} RpcDBusCoreBinding
    TARGET workrave-libs-core-next
    PREGENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/gen
    ADAPTER_NAMESPACE workrave::core::rpc)
  rpc_generate_dbus_source(${CMAKE_CURRENT_SOURCE_DIR}/Break.hh ${CMAKE_CURRENT_BINARY_DIR} RpcDBusBreakBinding
    TARGET workrave-libs-core-next
    PREGENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/gen
    ADAPTER_NAMESPACE workrave::core::rpc)
  rpc_generate_dbus_source(${CMAKE_SOURCE_DIR}/libs/config/include/config/IConfigurator.hh ${CMAKE_CURRENT_BINARY_DIR} RpcDBusConfigBinding
    TARGET workrave-libs-core-next
    PREGENERATED_DIR ${CMAKE_SOURCE_DIR}/libs/config/src/gen
    HEADER_INCLUDE "config/IConfigurator.hh"
    ADAPTER_NAMESPACE workrave::core::rpc)

  target_sources(workrave-libs-core-next PRIVATE
    RpcDBusServer.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcDBusCoreBindingDBus.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcDBusBreakBindingDBus.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcDBusConfigBindingDBus.cc)
  target_include_directories(workrave-libs-core-next PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
endif()

if (HAVE_CORE_NEXT_DBUS)
  # The direct bindings include rpc/Duration.hh for annotated chrono methods.
  target_include_directories(workrave-libs-core-next PRIVATE ${CMAKE_SOURCE_DIR}/libs/rpc/include)
  if (RPC_DBUS_BACKEND STREQUAL "qt")
    target_link_libraries(workrave-libs-core-next PUBLIC workrave-libs-rpc-dbus-qt)
  elseif (RPC_DBUS_BACKEND STREQUAL "gio")
    target_link_libraries(workrave-libs-core-next PUBLIC workrave-libs-rpc-dbus-gio)
  endif()
endif()

if (HAVE_GRPC AND HAVE_CORE_NEXT)
  # BreaksControl.hh uses rpc::InstanceRegistry<> (see get_break_registry())
  # to route BreakService calls to the right one of the three live Break
  # instances.
  # InstanceRegistry.hh/RpcException.hh are header-only with no link
  # dependency of their own, so this only needs an include path, NOT linking
  # workrave-libs-rpc (which would pull gRPC::grpc++ back onto every
  # consumer's link line — exactly what workrave-libs-core-next-rpc below
  # exists to avoid).
  target_include_directories(workrave-libs-core-next PRIVATE ${CMAKE_SOURCE_DIR}/libs/rpc/include)

  # Public wire names are declared beside the interfaces as
  # @rpc(service="workrave.<Service>"). Payload types live in separate
  # imported packages so their descriptor and generated C++ names are
  # isolated by API. Public payload packages omit the implementation-oriented
  # rpc namespace component: workrave.core and workrave.breaks.
  rpc_generate_source(${CMAKE_CURRENT_SOURCE_DIR}/Core.hh ${CMAKE_CURRENT_BINARY_DIR} RpcCore
    TARGET workrave-libs-core-next
    PREGENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/gen
    PROTO_TYPES_PACKAGE workrave.core
    GRPC_SERVICES_NAMESPACE rpc
    ADAPTER_NAMESPACE workrave::core::rpc)
  rpc_generate_source(${CMAKE_CURRENT_SOURCE_DIR}/Break.hh ${CMAKE_CURRENT_BINARY_DIR} RpcBreak
    TARGET workrave-libs-core-next
    PREGENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/gen
    PROTO_TYPES_PACKAGE workrave.breaks
    GRPC_SERVICES_NAMESPACE rpc
    ADAPTER_NAMESPACE workrave::core::rpc)

  # Deliberately a SEPARATE, opt-in static library rather than sources added
  # to workrave-libs-core-next itself: for a static library, CMake can't hide
  # its link dependencies from whoever finally links it — even PRIVATE deps
  # still land on the final executable's link line, because the .a doesn't
  # resolve its own symbols. Folding grpc++/protobuf/absl (a huge dylib
  # graph) into workrave-libs-core-next broke fmt symbol resolution for
  # *every* consumer, including ones that never touch RPC (e.g.
  # workrave-core-next-integration-test). Only a target that actually wants
  # the generated CoreService/BreakService should pay that cost, by linking
  # workrave-libs-core-next-rpc explicitly.
  add_library(workrave-libs-core-next-rpc STATIC
    ${CMAKE_CURRENT_BINARY_DIR}/RpcCoreServiceImpl.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcCore.pb.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcCore.grpc.pb.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcCoreTypes.pb.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcBreakServiceImpl.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcBreak.pb.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcBreak.grpc.pb.cc
    ${CMAKE_CURRENT_BINARY_DIR}/RpcBreakTypes.pb.cc
    # Wires the three generated ServiceImpls above (plus ConfigServiceImpl,
    # from workrave-libs-config-rpc) into a single running rpc::RpcServer for
    # the real Core/BreaksControl/Configurator. Core::init_rpc() constructs
    # this — see RpcCoreServer.hh for why this lives here and not in
    # workrave-libs-core-next itself.
    RpcCoreServer.cc)
  target_link_libraries(workrave-libs-core-next-rpc
    PRIVATE workrave-libs-core-api workrave-libs-utils workrave-libs-config workrave-libs-rpc workrave-libs-config-rpc gRPC::grpc++ protobuf::libprotobuf)
  target_include_directories(workrave-libs-core-next-rpc PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_SOURCE_DIR}/libs/corenext/include
    ${CMAKE_SOURCE_DIR}/libs/input-monitor/include
    ${CMAKE_SOURCE_DIR}/libs/stats/include
    ${CMAKE_BINARY_DIR}/libs/config/src)

endif()

if (WITH_CORE_NEXT)
  if (HAVE_GSETTINGS)
    gsettings_add_schemas(${CMAKE_CURRENT_SOURCE_DIR})
  endif()
endif()

target_link_libraries(workrave-libs-core-next
  PUBLIC
  workrave-libs-core-api
  workrave-libs-utils
  workrave-libs-config
  workrave-libs-stats)

target_link_libraries(workrave-libs-core-next PUBLIC
  $<$<NOT:$<BOOL:$<TARGET_PROPERTY:USE_STUBS>>>:workrave-libs-input-monitor>
  $<$<BOOL:$<TARGET_PROPERTY:USE_STUBS>>:workrave-libs-input-monitor-stub>
)

target_include_directories(
  workrave-libs-core-next
  PRIVATE
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
  PUBLIC
  ${CMAKE_SOURCE_DIR}/libs/corenext/include)
