# SPDX-FileCopyrightText: 2025 Prayag Jain <prayagjain2@gmail.com>
#
# SPDX-License-Identifier: BSD-2-Clause

cmake_minimum_required(VERSION 3.27)

set(DRAWY_VERSION "1.0.0")
project(drawy VERSION ${DRAWY_VERSION})

set(DRAWY_LIB_VERSION "${DRAWY_VERSION}")

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_SCAN_FOR_MODULES OFF)

set(KF_MIN_VERSION "6.19.0")
set(QT_REQUIRED_VERSION "6.9.0")
find_package(ECM ${KF_MIN_VERSION} CONFIG REQUIRED)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})

include(ECMQtDeclareLoggingCategory)
include(ECMPoQmTools)
include(KDEInstallDirs)
include(FeatureSummary)
include(ECMInstallIcons)
include(GenerateExportHeader)
include(ECMAddAppIcon)
include(KDECMakeSettings)
include(ECMAddTests)
include(ECMDeprecationSettings)
include(ECMSetupVersion)
include(KDECompilerSettings NO_POLICY_SCOPE)
set(SharedMimeInfo_MINIMUM_VERSION "1.10")
find_package(SharedMimeInfo ${SharedMimeInfo_MINIMUM_VERSION} REQUIRED)

kde_enable_exceptions()

ecm_set_disabled_deprecation_versions(QT 6.11.0  KF 6.25.0)

# Find Qt6
find_package(Qt6 ${QT_REQUIRED_VERSION} REQUIRED COMPONENTS Widgets)
if(BUILD_TESTING)
    find_package(Qt6 ${QT_REQUIRED_VERSION} REQUIRED COMPONENTS Test)
    add_definitions(-DBUILD_TESTING)
endif()
find_package(
    KF6
    ${KF_MIN_VERSION}
    REQUIRED
    COMPONENTS
        Crash
        CoreAddons
        WidgetsAddons
        Config
        ConfigWidgets
        XmlGui
        IconThemes
        I18n
        SyntaxHighlighting
)

find_package(KF6DocTools ${KF_MIN_VERSION})
set_package_properties(
    KF6DocTools
    PROPERTIES
        DESCRIPTION
            "Tools to generate documentation"
        TYPE
            OPTIONAL
)

# shall we use DBus?
# enabled per default on Linux & BSD systems
set(USE_DBUS_DEFAULT OFF)
if(UNIX AND NOT APPLE AND NOT HAIKU)
    set(USE_DBUS_DEFAULT ON)
endif()

option(USE_DBUS "Build components using DBus" ${USE_DBUS_DEFAULT})
if(USE_DBUS)
    set(WITH_DBUS TRUE)
endif()

option(USE_UNITY_CMAKE_SUPPORT "Use UNITY cmake support (speedup compile time)" OFF)

option(ENABLE_PCH "Enable Precompiled Headers support" ON)

set(COMPILE_WITH_UNITY_CMAKE_SUPPORT OFF)
if(USE_UNITY_CMAKE_SUPPORT)
    set(COMPILE_WITH_UNITY_CMAKE_SUPPORT ON)
endif()

file(
    GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES
    *.cpp
    *.hpp
)
if(EXISTS "${PROJECT_SOURCE_DIR}/.git/")
    set(GIT_SOURCE_TARBALL TRUE)
endif()

if(GIT_SOURCE_TARBALL)
    set(PRE_COMMIT_INSTALLED FALSE)
    if(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
        if(EXISTS "${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit")
            file(READ "${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit" FILE_CONTENTS)
            string(
                FIND "${FILE_CONTENTS}"
                "File generated by pre-commit"
                INDEX
            )
            if(${INDEX} GREATER_EQUAL 0)
                set(PRE_COMMIT_INSTALLED TRUE)
            endif()
        endif()
    endif()
    if(NOT ${PRE_COMMIT_INSTALLED})
        function(install_hook executable hook_name)
            message(
                STATUS
                "This module has ${hook_name} support. ${hook_name} binary was found. Installing ${hook_name} hook"
            )
            execute_process(
                COMMAND
                    "${executable}" install -f
                ERROR_QUIET
                RESULT_VARIABLE _precommitresult
                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
            )
            if(_precommitresult EQUAL 0)
                message(STATUS "${hook_name} installed.")
            else()
                message(
                    WARNING
                    "Error during installing ${hook_name} hook: ${executable} project source dir ${PROJECT_SOURCE_DIR}"
                )
                include(KDEGitCommitHooks)
                include(KDEClangFormat)
                kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES})
            endif()
        endfunction()

        find_program(PREK_EXECUTABLE prek)
        if(PREK_EXECUTABLE)
            install_hook(${PREK_EXECUTABLE} "Prek")
        else()
            find_program(PRE_COMMIT_EXECUTABLE pre-commit)
            if(PRE_COMMIT_EXECUTABLE)
                install_hook(${PRE_COMMIT_EXECUTABLE} "pre-commit")
            else()
                message(WARNING "This module has pre-commit support. pre-commit binary was not found.")
                include(KDEGitCommitHooks)
                include(KDEClangFormat)
                kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES})
            endif()
        endif()
    endif()
endif()

# ZSTD for compression
find_package(PkgConfig REQUIRED)
pkg_check_modules(ZSTD REQUIRED libzstd)

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    # Not setting for GNU due to too many warnings related to private members of base classes or around lambdas
    # see e.g. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56556 or https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79328
    string(APPEND CMAKE_CXX_FLAGS " -Wshadow")
endif()

include_directories(${CMAKE_CURRENT_BINARY_DIR})

if(BUILD_TESTING)
    find_package(Qt6 ${QT_REQUIRED_VERSION} REQUIRED COMPONENTS Test)
    add_definitions(-DBUILD_TESTING)
endif()

configure_file(config-drawy.h.in ${CMAKE_CURRENT_BINARY_DIR}/config-drawy.hpp)

option(WARNINGS_AS_ERRORS "Warnings are errors -Werror" OFF)
if(WARNINGS_AS_ERRORS)
    if(MSVC)
        add_compile_options(/WX)
        add_compile_options(/wd4996)
    else()
        add_compile_options(-Werror)
        add_compile_options(-Wno-error=deprecated-declarations)
    endif()
endif()

add_definitions(-DQT_NO_CONTEXTLESS_CONNECT)

add_subdirectory(src)

ecm_qt_install_logging_categories(
    EXPORT DRAWY
    FILE drawy.categories
    DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR}
)

update_xdg_mimetypes(${KDE_INSTALL_MIMEDIR})
ki18n_install(po)
if(KF6DocTools_FOUND)
    kdoctools_install(po)
    add_subdirectory(doc)
endif()
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)

ecm_setup_version(${PROJECT_VERSION}
    VARIABLE_PREFIX ${PROJECT_NAME}
    SOVERSION ${PROJECT_VERSION_MAJOR}
    VERSION_HEADER config-drawy.h.in
)
