cmake_minimum_required(VERSION 3.24)

project(EetCpp
    VERSION 2.0.0
    LANGUAGES CXX
)

option(EETCPP_BUILD_PLAYGROUND "Build the manual EET v4 Playground CLI" ON)

include(CTest)
include(CMakePackageConfigHelpers)

find_package(Qt6 6.5 REQUIRED COMPONENTS Core Network)
find_package(PkgConfig REQUIRED)
pkg_check_modules(XMLSEC1 REQUIRED IMPORTED_TARGET xmlsec1)
find_path(LIBXML2_INCLUDE_DIR libxml/parser.h
    HINTS
        ${CMAKE_PREFIX_PATH}/opt/libxml2/include/libxml2
        /opt/homebrew/opt/libxml2/include/libxml2
        /usr/local/opt/libxml2/include/libxml2
)
find_library(LIBXML2_LIBRARY NAMES xml2
    HINTS
        ${CMAKE_PREFIX_PATH}/opt/libxml2/lib
        /opt/homebrew/opt/libxml2/lib
        /usr/local/opt/libxml2/lib
)
if(NOT LIBXML2_INCLUDE_DIR OR NOT LIBXML2_LIBRARY)
    message(FATAL_ERROR "A libxml2 installation compatible with xmlsec1 is required.")
endif()

add_library(EetCpp STATIC
    libEet/eetcpp_global.h
    libEet/eetv4request.cpp
    libEet/eetv4request.h
    libEet/eetv4xml.cpp
    libEet/eetv4xml.h
    libEet/eetv4soap.cpp
    libEet/eetv4soap.h
    libEet/eetv4signer.cpp
    libEet/eetv4signer.h
    libEet/eetv4response.cpp
    libEet/eetv4response.h
    libEet/eetv4client.cpp
    libEet/eetv4client.h
    libEet/eetca.cpp
    libEet/eetca.h
)

add_library(EetCpp::EetCpp ALIAS EetCpp)

target_compile_features(EetCpp PUBLIC cxx_std_17)
target_compile_definitions(EetCpp PRIVATE EETCPP_LIBRARY)
target_include_directories(EetCpp
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/libEet>
        $<INSTALL_INTERFACE:include/EetCpp>
    PRIVATE
        ${LIBXML2_INCLUDE_DIR}
)
target_link_libraries(EetCpp
    PUBLIC
        Qt6::Core
        Qt6::Network
        ${LIBXML2_LIBRARY}
        PkgConfig::XMLSEC1
)

set_target_properties(EetCpp PROPERTIES
    EXPORT_NAME EetCpp
    VERSION ${PROJECT_VERSION}
    SOVERSION ${PROJECT_VERSION_MAJOR}
)

include(GNUInstallDirs)

install(TARGETS EetCpp
    EXPORT EetCppTargets
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(FILES
    libEet/eetcpp_global.h
    libEet/eetcpp.h
    libEet/eetv4request.h
    libEet/eetv4xml.h
    libEet/eetv4soap.h
    libEet/eetv4signer.h
    libEet/eetv4response.h
    libEet/eetv4client.h
    libEet/eetca.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/EetCpp
)

configure_package_config_file(
    eetcpp-config.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/EetCppConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/EetCpp
)
write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/EetCppConfigVersion.cmake
    COMPATIBILITY SameMajorVersion
)

install(EXPORT EetCppTargets
    FILE EetCppTargets.cmake
    NAMESPACE EetCpp::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/EetCpp
)
install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/EetCppConfig.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/EetCppConfigVersion.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/EetCpp
)

if(BUILD_TESTING)
    add_subdirectory(tests)
endif()

if(EETCPP_BUILD_PLAYGROUND)
    add_subdirectory(playground)
endif()
