cmake_minimum_required(VERSION 3.24)
project(eci_grpc_server LANGUAGES CXX)

# ---- Build as 32-bit on MSVC ----
if (MSVC AND CMAKE_SIZEOF_VOID_P EQUAL 8)
  message(FATAL_ERROR "This target must be built as 32-bit. Use: cmake -S . -B build -A Win32 -DVCPKG_TARGET_TRIPLET=x86-windows -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake")
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ---- gRPC / Protobuf from vcpkg ----
find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)

# Useful shortcuts
set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
set(_PROTOBUF_PROTOC protobuf::protoc)
set(_GRPC_GRPCPP gRPC::grpc++)
set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)

# ---- Proto paths ----
get_filename_component(ECI_PROTO "${CMAKE_CURRENT_SOURCE_DIR}/eci.proto" ABSOLUTE)
get_filename_component(ECI_PROTO_PATH "${ECI_PROTO}" PATH)

set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
file(MAKE_DIRECTORY "${GEN_DIR}")

set(ECI_PROTO_SRCS "${GEN_DIR}/eci.pb.cc")
set(ECI_PROTO_HDRS "${GEN_DIR}/eci.pb.h")
set(ECI_GRPC_SRCS "${GEN_DIR}/eci.grpc.pb.cc")
set(ECI_GRPC_HDRS "${GEN_DIR}/eci.grpc.pb.h")

# ---- Generate sources with protoc (no fragile macros) ----
add_custom_command(
  OUTPUT "${ECI_PROTO_SRCS}" "${ECI_PROTO_HDRS}" "${ECI_GRPC_SRCS}" "${ECI_GRPC_HDRS}"
  COMMAND $<TARGET_FILE:${_PROTOBUF_PROTOC}>
    --grpc_out "${GEN_DIR}"
    --cpp_out "${GEN_DIR}"
    -I "${ECI_PROTO_PATH}"
    --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
    "${ECI_PROTO}"
  DEPENDS "${ECI_PROTO}"
  COMMENT "Generating gRPC and Protobuf sources from eci.proto"
)

add_library(eci_proto_objs STATIC
  "${ECI_PROTO_SRCS}" "${ECI_GRPC_SRCS}"
)
target_include_directories(eci_proto_objs PUBLIC "${GEN_DIR}")
target_link_libraries(eci_proto_objs PUBLIC ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})

# ---- Server binary ----
add_executable(eci_grpc_server
  eci_server.cc
  eci_wrapper.h
)
target_include_directories(eci_grpc_server PRIVATE "${GEN_DIR}")
target_link_libraries(eci_grpc_server PRIVATE eci_proto_objs ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF})

# ECI.DLL is loaded at runtime via LoadLibraryW; no link dependency needed.