set(adminive_service_include_dir "${CMAKE_CURRENT_LIST_DIR}/include")
set(adminive_third_party_include_dir "${CMAKE_CURRENT_LIST_DIR}/third_party/include")
set(adminive_frontend_dist_dir "${CMAKE_CURRENT_LIST_DIR}/../../frontend_dist")
file(TO_CMAKE_PATH "${adminive_frontend_dist_dir}" adminive_frontend_dist_dir)
add_library(Adminive_Service INTERFACE)
set_target_properties(Adminive_Service PROPERTIES EXPORT_NAME Service)
add_library(Adminive::Service ALIAS Adminive_Service)
target_include_directories(Adminive_Service INTERFACE "$<BUILD_INTERFACE:${adminive_service_include_dir}>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
target_link_libraries(Adminive_Service INTERFACE Adminive::Core)
add_library(Adminive_Bundled_Service_Dependencies INTERFACE)
target_include_directories(Adminive_Bundled_Service_Dependencies INTERFACE "${adminive_third_party_include_dir}")
add_library(Adminive_Nlohmann INTERFACE)
set_target_properties(Adminive_Nlohmann PROPERTIES EXPORT_NAME Nlohmann)
add_library(Adminive::Nlohmann ALIAS Adminive_Nlohmann)
target_link_libraries(Adminive_Nlohmann INTERFACE Adminive::Service "$<BUILD_INTERFACE:Adminive_Bundled_Service_Dependencies>" "$<INSTALL_INTERFACE:nlohmann_json::nlohmann_json>")
add_library(Adminive_MagicEnum INTERFACE)
set_target_properties(Adminive_MagicEnum PROPERTIES EXPORT_NAME MagicEnum)
add_library(Adminive::MagicEnum ALIAS Adminive_MagicEnum)
target_link_libraries(Adminive_MagicEnum INTERFACE Adminive::Service "$<BUILD_INTERFACE:Adminive_Bundled_Service_Dependencies>" "$<INSTALL_INTERFACE:magic_enum::magic_enum>")
add_library(Adminive_BoostPfr INTERFACE)
set_target_properties(Adminive_BoostPfr PROPERTIES EXPORT_NAME BoostPfr)
add_library(Adminive::BoostPfr ALIAS Adminive_BoostPfr)
target_link_libraries(Adminive_BoostPfr INTERFACE Adminive::Service "$<INSTALL_INTERFACE:Boost::headers>")
find_package(Boost CONFIG QUIET)
if(TARGET Boost::headers)
    target_link_libraries(Adminive_BoostPfr INTERFACE "$<BUILD_INTERFACE:Boost::headers>")
else()
    set(ADMINIVE_BOOST_PFR_INCLUDE_DIR "" CACHE PATH "Directory containing boost/pfr.hpp for source-tree tests")
    if(EXISTS "${ADMINIVE_BOOST_PFR_INCLUDE_DIR}/boost/pfr.hpp")
        target_include_directories(Adminive_BoostPfr INTERFACE "$<BUILD_INTERFACE:${ADMINIVE_BOOST_PFR_INCLUDE_DIR}>")
    elseif(BUILD_TESTING)
        message(FATAL_ERROR "Boost.PFR is required by the adapter contract tests. Install Boost.PFR or set ADMINIVE_BOOST_PFR_INCLUDE_DIR to the directory containing boost/pfr.hpp.")
    endif()
endif()
add_library(Adminive_Httplib INTERFACE)
set_target_properties(Adminive_Httplib PROPERTIES EXPORT_NAME Httplib)
add_library(Adminive::Httplib ALIAS Adminive_Httplib)
target_link_libraries(Adminive_Httplib INTERFACE Adminive::Service "$<BUILD_INTERFACE:Adminive_Bundled_Service_Dependencies>" "$<INSTALL_INTERFACE:httplib::httplib>")
if(WIN32)
    target_compile_definitions(Adminive_Httplib INTERFACE WINVER=0x0A00 _WIN32_WINNT=0x0A00)
    target_link_libraries(Adminive_Httplib INTERFACE ws2_32)
endif()
add_library(Adminive_Drogon INTERFACE)
set_target_properties(Adminive_Drogon PROPERTIES EXPORT_NAME Drogon)
add_library(Adminive::Drogon ALIAS Adminive_Drogon)
target_link_libraries(Adminive_Drogon INTERFACE Adminive::Service "$<INSTALL_INTERFACE:Drogon::Drogon>")
if(TARGET Drogon::Drogon)
    target_link_libraries(Adminive_Drogon INTERFACE "$<BUILD_INTERFACE:Drogon::Drogon>")
elseif(TARGET drogon)
    target_link_libraries(Adminive_Drogon INTERFACE "$<BUILD_INTERFACE:drogon>")
endif()
add_library(Adminive_Default INTERFACE)
set_target_properties(Adminive_Default PROPERTIES EXPORT_NAME Default)
add_library(Adminive::Default ALIAS Adminive_Default)
target_link_libraries(Adminive_Default INTERFACE Adminive::Httplib Adminive::Nlohmann Adminive::MagicEnum)
add_library(Adminive_Example STATIC "${CMAKE_CURRENT_LIST_DIR}/src/example.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/config_store.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/device_tables.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/gallery.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/server_app.cpp")
target_include_directories(Adminive_Example PUBLIC "${CMAKE_CURRENT_LIST_DIR}/src")
target_link_libraries(Adminive_Example PUBLIC Adminive::Default)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    target_compile_options(Adminive_Example PRIVATE "$<$<CONFIG:Debug>:-g1>" "$<$<CONFIG:Release>:-O1>")
endif()
adminive_configure_sanitizers(Adminive_Example)
add_executable(Adminive_Server "${CMAKE_CURRENT_LIST_DIR}/src/main.cpp")
target_compile_definitions(Adminive_Server PRIVATE ADMINIVE_FRONTEND_DIST_DIR="${adminive_frontend_dist_dir}")
target_link_libraries(Adminive_Server PRIVATE Adminive_Example)
adminive_configure_sanitizers(Adminive_Server)
if(MSVC)
    target_compile_options(Adminive_Example PRIVATE /permissive-)
    target_compile_options(Adminive_Server PRIVATE /permissive-)
endif()
if(BUILD_TESTING)
    add_executable(Adminive_Test "${CMAKE_CURRENT_LIST_DIR}/tests/test.cpp")
    target_include_directories(Adminive_Test PRIVATE "${CMAKE_CURRENT_LIST_DIR}/src")
    target_link_libraries(Adminive_Test PRIVATE Adminive_Example)
    adminive_register_test(Adminive_Test "unit;service;runtime")
    add_executable(Adminive_Advanced_Adapter_Test "${CMAKE_CURRENT_LIST_DIR}/tests/advanced_adapter_test.cpp")
    target_link_libraries(Adminive_Advanced_Adapter_Test PRIVATE Adminive::Default Adminive::BoostPfr)
    adminive_register_test(Adminive_Advanced_Adapter_Test "unit;service;adapter")
    add_executable(Adminive_Safety_Test "${CMAKE_CURRENT_LIST_DIR}/tests/safety_test.cpp")
    target_link_libraries(Adminive_Safety_Test PRIVATE Adminive::Default)
    adminive_register_test(Adminive_Safety_Test "unit;service;safety")
    add_executable(Adminive_Config_Store_Test "${CMAKE_CURRENT_LIST_DIR}/tests/config_store_test.cpp")
    target_include_directories(Adminive_Config_Store_Test PRIVATE "${CMAKE_CURRENT_LIST_DIR}/src")
    target_link_libraries(Adminive_Config_Store_Test PRIVATE Adminive_Example)
    adminive_register_test(Adminive_Config_Store_Test "unit;service;persistence")
    add_executable(Adminive_Managed_Test "${CMAKE_CURRENT_LIST_DIR}/tests/managed_test.cpp")
    target_link_libraries(Adminive_Managed_Test PRIVATE Adminive::Default)
    adminive_register_test(Adminive_Managed_Test "unit;concurrency;managed")
    add_executable(Adminive_View_Schema_Test "${CMAKE_CURRENT_LIST_DIR}/tests/view_schema_test.cpp")
    target_link_libraries(Adminive_View_Schema_Test PRIVATE Adminive::Default)
    adminive_register_test(Adminive_View_Schema_Test "unit;protocol;view")
    add_executable(Adminive_Drogon_Adapter_Test "${CMAKE_CURRENT_LIST_DIR}/tests/drogon_adapter_test.cpp")
    target_include_directories(Adminive_Drogon_Adapter_Test BEFORE PRIVATE "${CMAKE_CURRENT_LIST_DIR}/tests/fake_drogon")
    target_link_libraries(Adminive_Drogon_Adapter_Test PRIVATE Adminive::Default)
    adminive_register_test(Adminive_Drogon_Adapter_Test "unit;http;drogon")
    if(ADMINIVE_ENABLE_REAL_DROGON_TESTS)
        add_executable(Adminive_Real_Drogon_Adapter_Test "${CMAKE_CURRENT_LIST_DIR}/tests/real_drogon_adapter_test.cpp")
        target_link_libraries(Adminive_Real_Drogon_Adapter_Test PRIVATE Adminive::Drogon Adminive::Nlohmann)
        adminive_register_test(Adminive_Real_Drogon_Adapter_Test "integration;http;drogon;real-dependency;release")
    endif()
    add_executable(Adminive_Httplib_Adapter_Test "${CMAKE_CURRENT_LIST_DIR}/tests/httplib_adapter_test.cpp")
    target_link_libraries(Adminive_Httplib_Adapter_Test PRIVATE Adminive::Default)
    adminive_register_test(Adminive_Httplib_Adapter_Test "integration;http;httplib")
    add_executable(Adminive_Gallery_Test "${CMAKE_CURRENT_LIST_DIR}/tests/gallery_test.cpp")
    target_include_directories(Adminive_Gallery_Test PRIVATE "${CMAKE_CURRENT_LIST_DIR}/src")
    target_link_libraries(Adminive_Gallery_Test PRIVATE Adminive_Example)
    adminive_register_test(Adminive_Gallery_Test "integration;gallery;protocol;http")
    adminive_register_header_test(Adminive_Service_Header_Nlohmann_Json_Test "adminive/adapters/nlohmann_json.hpp" Adminive::Nlohmann)
    adminive_register_header_test(Adminive_Service_Header_Magic_Enum_Test "adminive/adapters/magic_enum.hpp" Adminive::MagicEnum)
    adminive_register_header_test(Adminive_Service_Header_Boost_Pfr_Test "adminive/adapters/boost_pfr.hpp" Adminive::BoostPfr)
    adminive_register_header_test(Adminive_Service_Header_Httplib_Test "adminive/adapters/httplib.hpp" Adminive::Httplib)
    adminive_register_header_test(Adminive_Service_Header_Drogon_Test "adminive/adapters/drogon.hpp" Adminive::Default)
    target_include_directories(Adminive_Service_Header_Drogon_Test BEFORE PRIVATE "${CMAKE_CURRENT_LIST_DIR}/tests/fake_drogon")
    if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
        target_compile_options(Adminive_Test PRIVATE "$<$<CONFIG:Release>:-O1>")
        target_compile_options(Adminive_Config_Store_Test PRIVATE "$<$<CONFIG:Release>:-O1>")
        target_compile_options(Adminive_Gallery_Test PRIVATE "$<$<CONFIG:Release>:-O1>")
    endif()
    if(MSVC)
        target_compile_options(Adminive_Test PRIVATE /permissive-)
        target_compile_options(Adminive_Advanced_Adapter_Test PRIVATE /permissive-)
        target_compile_options(Adminive_Drogon_Adapter_Test PRIVATE /permissive-)
        target_compile_options(Adminive_Httplib_Adapter_Test PRIVATE /permissive-)
        target_compile_options(Adminive_Gallery_Test PRIVATE /permissive-)
        target_compile_options(Adminive_Safety_Test PRIVATE /permissive-)
        target_compile_options(Adminive_Config_Store_Test PRIVATE /permissive-)
        target_compile_options(Adminive_Managed_Test PRIVATE /permissive-)
        target_compile_options(Adminive_View_Schema_Test PRIVATE /permissive-)
    endif()
endif()
install(TARGETS Adminive_Service EXPORT AdminiveServiceTargets)
install(TARGETS Adminive_Nlohmann EXPORT AdminiveNlohmannTargets)
install(TARGETS Adminive_MagicEnum EXPORT AdminiveMagicEnumTargets)
install(TARGETS Adminive_BoostPfr EXPORT AdminiveBoostPfrTargets)
install(TARGETS Adminive_Httplib EXPORT AdminiveHttplibTargets)
install(TARGETS Adminive_Default EXPORT AdminiveDefaultTargets)
install(TARGETS Adminive_Drogon EXPORT AdminiveDrogonTargets)
install(DIRECTORY "${adminive_service_include_dir}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
