cmake_minimum_required(VERSION 3.22)
project(Kompanion LANGUAGES CXX)
set(PROJECT_VERSION "0.0.1")

set(QT_MIN_VERSION "6.8.0")
set(KF6_MIN_VERSION "6.8.0")
set(KDE_COMPILERSETTINGS_LEVEL "5.82")

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(ECM ${KF6_MIN_VERSION} REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})

include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(ECMMarkAsTest)
include(ECMMarkNonGuiExecutable)
include(FeatureSummary)
include(CheckIncludeFile)
include(CheckIncludeFiles)
include(CheckSymbolExists)
include(ECMOptionalAddSubdirectory)
include(KDEClangFormat)
include(ECMDeprecationSettings)

include(KDEGitCommitHooks)

find_package(Qt6 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
    Core
    Sql
)

option(KOMPANION_USE_GUI "Build optional GUI components using Qt6Gui" ON)
if (KOMPANION_USE_GUI)
    find_package(Qt6 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Gui)
endif()

set(KOMPANION_KCONFIG_TARGET "")
find_package(KF6Config ${KF6_MIN_VERSION} QUIET)
if (KF6Config_FOUND)
    set(KOMPANION_KCONFIG_TARGET KF6::ConfigCore)
else()
    find_package(KF5Config QUIET)
    if (KF5Config_FOUND)
        set(KOMPANION_KCONFIG_TARGET KF5::ConfigCore)
    endif()
endif()
add_feature_info("KConfig" NOT (KOMPANION_KCONFIG_TARGET STREQUAL "") "Persist settings via KConfig if available.")

find_package(Qt6Test ${QT_MIN_VERSION} CONFIG QUIET)
set_package_properties(Qt6Test PROPERTIES
         PURPOSE "Required for tests"
         TYPE OPTIONAL
         )
add_feature_info("Qt6Test" Qt6Test_FOUND "Required for building tests")


set(KOMPANION_DB_INIT_INSTALL_DIR "${KDE_INSTALL_FULL_DATADIR}/kompanion/db/init")
install(DIRECTORY db/init/ DESTINATION ${KDE_INSTALL_DATADIR}/kompanion/db/init FILES_MATCHING PATTERN "*.sql")

option(BUILD_KOMPANION_CLI "Build Kompanion Qt command-line client" ON)

add_subdirectory(src/dal)

add_executable(kom_mcp
    src/main.cpp
)
target_include_directories(kom_mcp PRIVATE src)
target_link_libraries(kom_mcp PRIVATE kom_dal)
if (NOT KOMPANION_KCONFIG_TARGET STREQUAL "")
    target_link_libraries(kom_mcp PRIVATE ${KOMPANION_KCONFIG_TARGET})
    target_compile_definitions(kom_mcp PRIVATE HAVE_KCONFIG)
endif()
target_compile_options(kom_mcp PRIVATE -fexceptions)
target_compile_definitions(kom_mcp PRIVATE
  PROJECT_SOURCE_DIR="${CMAKE_SOURCE_DIR}"
  KOMPANION_DB_INIT_INSTALL_DIR="${KOMPANION_DB_INIT_INSTALL_DIR}"
)

install(TARGETS kom_mcp RUNTIME DESTINATION bin)

option(BUILD_TESTS "Build tests" ON)

if (BUILD_KOMPANION_CLI)
  add_executable(kompanion
      src/cli/KompanionApp.cpp
  )
  target_include_directories(kompanion PRIVATE src)
  target_link_libraries(kompanion PRIVATE
      Qt6::Core
      Qt6::Sql
      kom_dal
  )
  target_compile_definitions(kompanion PRIVATE
    PROJECT_SOURCE_DIR="${CMAKE_SOURCE_DIR}"
    KOMPANION_DB_INIT_INSTALL_DIR="${KOMPANION_DB_INIT_INSTALL_DIR}"
  )
  if (NOT KOMPANION_KCONFIG_TARGET STREQUAL "")
      target_link_libraries(kompanion PRIVATE ${KOMPANION_KCONFIG_TARGET})
      target_compile_definitions(kompanion PRIVATE HAVE_KCONFIG)
  endif()
  target_compile_options(kompanion PRIVATE -fexceptions -Wno-unused-function)
  install(TARGETS kompanion RUNTIME DESTINATION bin)
endif()

if (BUILD_TESTS)
  enable_testing()
  add_subdirectory(tests)
endif()

feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
