# Do not let the option()s override variables here
cmake_minimum_required(VERSION 3.13)

if(NOT DEFINED PROJECT_NAME)
  if(NOT DEFINED libkazv_INSTALL_HEADERS)
    set(libkazv_INSTALL_HEADERS ON)
  endif()
endif()

project(libkazv)

set(libkazvSourceRoot ${CMAKE_CURRENT_SOURCE_DIR})

set(libkazv_VERSION_MAJOR 1)
set(libkazv_VERSION_MINOR 0)
set(libkazv_VERSION_PATCH 0)
set(libkazv_VERSION_STRING ${libkazv_VERSION_MAJOR}.${libkazv_VERSION_MINOR}.${libkazv_VERSION_PATCH})
set(libkazv_SOVERSION 8)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

option(libkazv_BUILD_TESTS "Build tests" ON)
option(libkazv_BUILD_EXAMPLES "Build examples" ON)
option(libkazv_BUILD_KAZVJOB "Build libkazvjob the async and networking library" ON)
option(libkazv_OUTPUT_LEVEL "Output level: Debug>=90, Info>=70, Quiet>=20, no output=1" 0)
option(libkazv_ENABLE_COVERAGE "Enable code coverage information" OFF)
option(libkazv_ERROR_ON_WARNING "Turn compiler warnings to errors. Only use for development purposes." OFF)
option(libkazv_USE_cryptopp_CONFIG "Use cryptopp config module instead of Findcryptopp.cmake" OFF)

if(libkazv_ENABLE_COVERAGE)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -fPIC -O0")
endif()

if(libkazv_ERROR_ON_WARNING)
  message(STATUS "Turning compiler warnings to errors. This should only be used for development purposes.")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
endif()

if((libkazv_BUILD_TESTS OR libkazv_BUILD_EXAMPLES) AND NOT libkazv_BUILD_KAZVJOB)
  message(FATAL_ERROR
    "You asked kazvjob not to be built, but asked to build tests or examples. Tests and examples both depend on kazvjob. This is not possible.")
endif()

if(libkazv_BUILD_TESTS)
  set(BUILD_TESTING ON)
  include(CTest)
  set(CMAKE_CTEST_ARGUMENTS --output-on-failure --output-junit test-report.xml)
endif()

# Build shared libraries by default
if(NOT DEFINED BUILD_SHARED_LIBS)
  set(BUILD_SHARED_LIBS ON)
endif()

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
  set(LIBKAZV_BUILT_WITH_DEBUG 1)
else()
  set(LIBKAZV_BUILT_WITH_DEBUG 0)
endif()


find_package(Boost REQUIRED COMPONENTS serialization regex)


if(libkazv_BUILD_KAZVJOB)
  find_package(cpr REQUIRED)

  set(THREADS_PREFER_PTHREAD_FLAG ON)
  find_package(Threads REQUIRED)
endif()

if(libkazv_BUILD_TESTS)
  find_package(Catch2 REQUIRED)
endif()

find_package(nlohmann_json REQUIRED)

find_package(Immer REQUIRED)

find_package(Zug REQUIRED)

find_package(Lager REQUIRED)

if(libkazv_USE_cryptopp_CONFIG)
  # In some environments, use cryptopp config instead of Findcryptopp.cmake
  find_package(cryptopp REQUIRED CONFIG)
  set(CRYPTOPP_TARGET_NAME cryptopp-shared)
else()
  find_package(cryptopp REQUIRED)
  set(CRYPTOPP_TARGET_NAME cryptopp)
endif()

find_package(vodozemac REQUIRED)

if(libkazv_BUILD_EXAMPLES)
  find_package(PkgConfig REQUIRED)
  pkg_check_modules(LIBHTTPSERVER REQUIRED libhttpserver)
endif()

if(libkazv_OUTPUT_LEVEL)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLIBKAZV_OUTPUT_LEVEL=${libkazv_OUTPUT_LEVEL}")
endif()

include(GNUInstallDirs)

set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/libkazv)

add_subdirectory(src)

install(EXPORT libkazvTargets
  NAMESPACE
    libkazv::
  DESTINATION
    ${ConfigPackageLocation}
)

install(
  FILES cmake/libkazvConfig.cmake
  DESTINATION ${ConfigPackageLocation})

# cpr does not install a good config file.
# We use the find module instead.
install(
  FILES cmake/Findcpr.cmake
  DESTINATION ${ConfigPackageLocation})
