get_target_property(GENERATED_INCLUDE_DIR generate_cpp_files EVEREST_GENERATED_INCLUDE_DIR)
find_package(libevent)
find_package(OpenSSL 3)

set(LIB_EVEREST_TLS_TESTS_DIR "${PROJECT_SOURCE_DIR}/lib/everest/tls/tests")
set(TESTS_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/tests/include")

set(TLS_TEST_FILES
        alt_openssl-pki.conf
        iso_pkey.asn1
        openssl-pki.conf
        ocsp_response.der
        pki.sh
)

add_custom_command(
    OUTPUT ${TLS_TEST_FILES}
    COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/pki
    COMMAND cd pki && cp ${TLS_TEST_FILES} ${CMAKE_CURRENT_BINARY_DIR}/
    WORKING_DIRECTORY ${LIB_EVEREST_TLS_TESTS_DIR}
)

add_custom_target(v2g_test_files_target
    DEPENDS ${TLS_TEST_FILES}
)

set(TLS_GTEST_NAME v2g_openssl_test)
add_executable(${TLS_GTEST_NAME})
add_dependencies(${TLS_GTEST_NAME} v2g_test_files_target)

add_dependencies(${TLS_GTEST_NAME} generate_cpp_files)

target_include_directories(${TLS_GTEST_NAME} PRIVATE
    .. ../crypto
    ${GENERATED_INCLUDE_DIR}
    ${CMAKE_BINARY_DIR}/generated/modules/${MODULE_NAME}
)

target_compile_definitions(${TLS_GTEST_NAME} PRIVATE
    -DUNIT_TEST
)

target_sources(${TLS_GTEST_NAME} PRIVATE
    ${LIB_EVEREST_TLS_TESTS_DIR}/gtest_main.cpp
    log.cpp
    openssl_test.cpp
    ../crypto/crypto_openssl.cpp
)

target_link_libraries(${TLS_GTEST_NAME} PRIVATE
    GTest::gtest
    cbv2g::din
    cbv2g::iso2
    cbv2g::tp
    everest::framework
    everest::evse_security
    everest::tls
)

set(V2G_MAIN_NAME v2g_server)
add_executable(${V2G_MAIN_NAME})

add_dependencies(${V2G_MAIN_NAME} generate_cpp_files)

target_include_directories(${V2G_MAIN_NAME} PRIVATE
    .. ../connection ${TESTS_INCLUDE_DIR}
    ${GENERATED_INCLUDE_DIR}
    ${CMAKE_BINARY_DIR}/generated/modules/${MODULE_NAME}
    ${CMAKE_BINARY_DIR}/generated/include
)

target_compile_definitions(${V2G_MAIN_NAME} PRIVATE
    -DUNIT_TEST
)

target_sources(${V2G_MAIN_NAME} PRIVATE
    ../connection/connection.cpp
    ../connection/tls_connection.cpp
    ../tools.cpp
    ../v2g_ctx.cpp
    log.cpp
    requirement.cpp
    v2g_main.cpp
)

target_link_libraries(${V2G_MAIN_NAME} PRIVATE
    cbv2g::din
    cbv2g::iso2
    cbv2g::tp
    everest::log
    everest::framework
    everest::evse_security
    everest::tls
    -levent -lpthread -levent_pthreads
)

# runs fine locally, fails in CI
add_test(${TLS_GTEST_NAME} ${TLS_GTEST_NAME})
ev_register_test_target(${TLS_GTEST_NAME})


set(DIN_SERVER_NAME din_server_test)
add_executable(${DIN_SERVER_NAME})

target_include_directories(${DIN_SERVER_NAME} PRIVATE
    .. ../connection ${TESTS_INCLUDE_DIR}
    ${GENERATED_INCLUDE_DIR}
    ${CMAKE_BINARY_DIR}/generated/modules/${MODULE_NAME}
    ${CMAKE_BINARY_DIR}/generated/include
)
add_dependencies(${DIN_SERVER_NAME} generate_cpp_files)

target_compile_definitions(${DIN_SERVER_NAME} PRIVATE
    -DUNIT_TEST
    -DLIBEVSE_CRYPTO_SUPPLIER_OPENSSL
)

target_sources(${DIN_SERVER_NAME} PRIVATE
    din_server_test.cpp
    log.cpp
    ../din_server.cpp
    ../tools.cpp # TODO: Maybe mock this one
)

target_link_libraries(${DIN_SERVER_NAME}
    PRIVATE
        GTest::gtest_main
        OpenSSL::SSL
        OpenSSL::Crypto
        cbv2g::din
        cbv2g::iso2
        cbv2g::tp
        everest::framework
        everest::evse_security
        everest::tls
)

add_test(${DIN_SERVER_NAME} ${DIN_SERVER_NAME})
ev_register_test_target(${DIN_SERVER_NAME})

set(SDP_NAME sdp_test)
add_executable(${SDP_NAME})
target_include_directories(${SDP_NAME} PRIVATE
    .. ../connection ${TESTS_INCLUDE_DIR}
    ${GENERATED_INCLUDE_DIR}
    ${CMAKE_BINARY_DIR}/generated/modules/${MODULE_NAME}
    ${CMAKE_BINARY_DIR}/generated/include
)
add_dependencies(${SDP_NAME} generate_cpp_files)

target_compile_definitions(${SDP_NAME} PRIVATE
    -DUNIT_TEST
)

target_sources(${SDP_NAME} PRIVATE
    sdp_test.cpp
    log.cpp
    ../sdp.cpp
    ../tools.cpp
)

target_link_libraries(${SDP_NAME}
    PRIVATE
        GTest::gtest_main
        cbv2g::tp
        everest::framework
        everest::tls
)

add_test(${SDP_NAME} ${SDP_NAME})
ev_register_test_target(${SDP_NAME})

set(V2GCTX_NAME v2g_ctx_test)
add_executable(${V2GCTX_NAME})

target_include_directories(${V2GCTX_NAME} PRIVATE
    .. ../connection ${TESTS_INCLUDE_DIR}
    ${GENERATED_INCLUDE_DIR}
    ${CMAKE_BINARY_DIR}/generated/modules/${MODULE_NAME}
    ${CMAKE_BINARY_DIR}/generated/include
)
add_dependencies(${V2GCTX_NAME} generate_cpp_files)

target_compile_definitions(${V2GCTX_NAME} PRIVATE
    -DUNIT_TEST
    -DLIBEVSE_CRYPTO_SUPPLIER_OPENSSL
)

target_sources(${V2GCTX_NAME} PRIVATE
    v2g_ctx_test.cpp
    log.cpp
    tools_test.cpp
    ../v2g_ctx.cpp
    ../tools.cpp
)

target_link_libraries(${V2GCTX_NAME}
    PRIVATE
        GTest::gtest_main
        OpenSSL::SSL
        OpenSSL::Crypto
        cbv2g::din
        cbv2g::iso2
        cbv2g::tp
        everest::framework
        everest::evse_security
        everest::tls
        -levent -lpthread -levent_pthreads
)

add_test(${V2GCTX_NAME} ${V2GCTX_NAME})
ev_register_test_target(${V2GCTX_NAME})
