cmake_minimum_required(VERSION 3.20)

project(NerdRankCppSdk
    VERSION 0.1.0
    DESCRIPTION "C++ SDK for the NerdRank leaderboard API"
    LANGUAGES CXX)

option(NERDRANK_BUILD_EXAMPLES "Build NerdRank SDK examples" ON)

find_package(CURL REQUIRED)

add_library(nerdrank_cpp
    src/client.cpp
    src/http_client.cpp
    src/json.cpp)

add_library(NerdRank::nerdrank_cpp ALIAS nerdrank_cpp)

target_compile_features(nerdrank_cpp PUBLIC cxx_std_17)

target_include_directories(nerdrank_cpp
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>)

target_link_libraries(nerdrank_cpp PUBLIC CURL::libcurl)

if(MSVC)
    target_compile_options(nerdrank_cpp PRIVATE /W4)
else()
    target_compile_options(nerdrank_cpp PRIVATE -Wall -Wextra -Wpedantic)
endif()

if(NERDRANK_BUILD_EXAMPLES)
    add_executable(submit_score_example examples/submit_score.cpp)
    target_link_libraries(submit_score_example PRIVATE NerdRank::nerdrank_cpp)
endif()

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

install(TARGETS nerdrank_cpp
    EXPORT NerdRankCppTargets
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

install(EXPORT NerdRankCppTargets
    NAMESPACE NerdRank::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/NerdRankCpp)

configure_package_config_file(
    cmake/NerdRankCppConfig.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/NerdRankCppConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/NerdRankCpp)

write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/NerdRankCppConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion)

install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/NerdRankCppConfig.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/NerdRankCppConfigVersion.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/NerdRankCpp)
