cmake_minimum_required(VERSION 3.17)

# Create project
project(rkvac-protocol-multos
        VERSION 1.0.0
        LANGUAGES C)

# Enable C 90 standard
set(CMAKE_C_STANDARD 90)

# SmartCard support options
option(RKVAC_PROTOCOL_MULTOS "MultOS version" ON)
option(RKVAC_PROTOCOL_REMOTE "Remote Multos Card" OFF)

# Build type
set(DEFAULT_BUILD_TYPE "Release")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
    set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
    # Set the possible values of build type for cmake-gui
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release")
endif()

# Custom CMake Modules path
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

find_package(OpenSSL REQUIRED) # OpenSSL package
find_package(MCL REQUIRED) # MCL package
find_package(PCSC REQUIRED) # required to communicate with SmartCards

# Project-level includes
include_directories(.)

set(EXECUTABLE_COMMON_SOURCE
        crypto/config/config.h
        crypto/include/models/issuer.h
        crypto/include/models/revocation-authority.h
        crypto/include/models/user.h
        crypto/include/models/verifier.h
        crypto/include/system.h
        crypto/include/types.h
        crypto/helpers/hash_helper.c
        crypto/helpers/hash_helper.h
        crypto/helpers/hex_helper.c
        crypto/helpers/hex_helper.h
        crypto/helpers/mcl_helper.c
        crypto/helpers/mcl_helper.h
        crypto/helpers/file_helper.h
        crypto/helpers/file_helper.c
        crypto/src/controllers/issuer.c
        crypto/src/controllers/issuer.h
        crypto/src/controllers/revocation-authority.c
        crypto/src/controllers/revocation-authority.h
        crypto/src/controllers/verifier.c
        crypto/src/controllers/verifier.h
        crypto/src/setup.c
        crypto/src/setup.h

        service/include/attributes.h
        service/include/multos/apdu.h
        service/lib/apdu/command.c
        service/lib/apdu/command.h
        service/lib/helpers/multos_helper.c
        service/lib/helpers/multos_helper.h
        service/lib/pcsc/reader.h
        service/lib/pcsc/reader.c
        service/lib/helpers/mem_helper.h
        service/lib/helpers/mem_helper.c
        service/config/service-config.h
        service/include/help.h

        main.c
        )

# Remote MULTOS Card Binary
if (RKVAC_PROTOCOL_REMOTE)
    add_executable(${PROJECT_NAME}-${PROJECT_VERSION} ${EXECUTABLE_COMMON_SOURCE}
            service/config/network-config.h
            service/lib/ntw/remote-reader.h
            service/lib/ntw/remote-reader.c
            service/src/controllers/remote/user.h
            service/src/controllers/remote/user.c
            )
    target_link_libraries(${PROJECT_NAME}-${PROJECT_VERSION} PRIVATE MCL::Bn256 OpenSSL::Crypto PCSC::PCSC)
    target_compile_definitions(${PROJECT_NAME}-${PROJECT_VERSION} PRIVATE RKVAC_PROTOCOL_MULTOS RKVAC_PROTOCOL_REMOTE)
# Local MULTOS Card binary
else()
    add_executable(${PROJECT_NAME}-${PROJECT_VERSION} ${EXECUTABLE_COMMON_SOURCE}
            service/src/controllers/multos/user.c
            service/src/controllers/multos/user.h
            )
    target_link_libraries(${PROJECT_NAME}-${PROJECT_VERSION} PRIVATE MCL::Bn256 OpenSSL::Crypto PCSC::PCSC)
    target_compile_definitions(${PROJECT_NAME}-${PROJECT_VERSION} PRIVATE RKVAC_PROTOCOL_MULTOS)
endif()



