cmake_minimum_required(VERSION 3.24)
project(keypme-card-management-client LANGUAGES C CXX)

# Always use in priority CMake variable over environment variable
if (NOT DEFINED GRPC_PATH)
    set(GRPC_PATH $ENV{GRPC_PATH})
endif()
set(CMAKE_FIND_ROOT_PATH ${GRPC_PATH}/lib/cmake)
if (WIN32)
    find_package(protobuf CONFIG REQUIRED)
else()
    find_package(Protobuf CONFIG REQUIRED)
endif()
find_package(gRPC CONFIG REQUIRED)
message(STATUS "Using protobuf ${Protobuf_VERSION}")

# Build type: If invalid then we set DEBUG build by default
if (NOT (CMAKE_BUILD_TYPE MATCHES "Debug|Release"))
    if (NOT CMAKE_BUILD_TYPE)
        message(STATUS "CMAKE_BUILD_TYPE not set, defining it by default to Debug, and caching this setting.")
    else()
        message(SEND_ERROR "Invalid CMAKE_BUILD_TYPE.")
    endif()
    set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
endif()

get_target_property(_PROTOBUF_PROTOC protobuf::protoc LOCATION)
set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
set(_REFLECTION gRPC::grpc++_reflection)
set(_GRPC_GRPCPP gRPC::grpc++)

#
# Protobuf/Grpc source files
#
set(PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../protocol/keypme_card_management.proto)

add_library(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client_proto ${PROTO_FILES})
target_include_directories(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client_proto PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client_proto PUBLIC gRPC::grpc++)

#
# Compile protobuf and grpc files in grpc_cpp_plugin_location target to cpp
#
get_target_property(grpc_cpp_plugin_location gRPC::grpc_cpp_plugin LOCATION)
protobuf_generate(TARGET ${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client_proto
    LANGUAGE cpp
    IMPORT_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../../protocol")
protobuf_generate(TARGET ${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client_proto
    LANGUAGE grpc
    GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc
    PLUGIN "protoc-gen-grpc=${grpc_cpp_plugin_location}"
    IMPORT_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../../protocol/")

add_library(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client
    keypme_card_management_client.cc)

target_include_directories(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client
    ${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client_proto ${KEYPME_NETWORK_BRIDGE_LIBS})

# To import dummy 'keypme_card.h'
target_include_directories(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/examples)

if (WIN32)
    # Support for 'syslog.h'
    target_link_libraries(${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client ${ISO7816_APP_NAME}_keypme_os)
endif()

set_property(TARGET ${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client PROPERTY POSITION_INDEPENDENT_CODE ON)

if (NOT WIN32)
    # Examples does not build on Windows yet
    add_subdirectory(examples)
endif()

#
# Copy library to ISO7816
#
set(KEYPME_CARD_MANAGEMENT_C_ARTIFACTS
    ${CMAKE_CURRENT_SOURCE_DIR}/keypme_card_management_client.hpp
    ${CMAKE_CURRENT_BINARY_DIR}/keypme_card_management.pb.h
    ${CMAKE_CURRENT_BINARY_DIR}/keypme_card_management.grpc.pb.h
    ${CMAKE_CURRENT_BINARY_DIR}/libkeypme_card_management_client.a
    ${CMAKE_CURRENT_BINARY_DIR}/libkeypme_card_management_client_proto.a
    )
list(JOIN KEYPME_CARD_MANAGEMENT_C_ARTIFACTS " " KEYPME_CARD_MANAGEMENT_C_ARTIFACTS_STRING)

add_custom_command(TARGET ${KEYPME_CARD_MANAGEMENT_CLIENT_PREFIX}keypme_card_management_client POST_BUILD
    # Explicitly pass the command to a shell interpreter so the spaces are evaluated correctly
    COMMAND sh -c "[ ! -z \"\$ISO7816_PATH\" ] && cp ${KEYPME_CARD_MANAGEMENT_C_ARTIFACTS_STRING} \$ISO7816_PATH/pcsc/transport/local/keypme_card_management_client/ || echo \"Set ISO7816_PATH environment variable to copy the C binary to KeypMe PCSC drivers.\""
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Copy KeypMe Card Management Client C library to ISO7816"
    VERBATIM # Tells CMake to stop messing with quotes and spaces
    )
