# SPDX-FileCopyrightText: 2023 g10 code GmbH
# SPDX-Contributor: Carl Schwan <carl.schwan@gnupg.com>
# SPDX-License-Identifier: BSD-2-Clause

add_definitions(-DDATAROUTDIR="${KDE_INSTALL_FULL_DATAROOTDIR}")
add_definitions(-DTRANSLATION_DOMAIN=\"gpgol-js-native\")

add_subdirectory(rootcagenerator)

add_library(gpgol-client-static STATIC)

target_sources(gpgol-client-static PRIVATE
    emailviewer.cpp
    emailviewer.h
    websocketclient.cpp
    websocketclient.h
    messagedispatcher.cpp
    messagedispatcher.h
    firsttimedialog.cpp
    firsttimedialog.h

    # Identity
    identity/addressvalidationjob.cpp
    identity/addressvalidationjob.h
    identity/identitymanager.cpp
    identity/identitymanager.h
    identity/identitydialog.cpp
    identity/identitydialog.h
    identity/identity.cpp
    identity/identity.h
    identity/signature.h
    identity/signature.cpp
    identity/signatureconfigurator.cpp
    identity/signatureconfigurator.h
    identity/signaturerichtexteditor.cpp
    identity/signaturerichtexteditor_p.h

    # Draft
    draft/draft.cpp
    draft/draft.h
    draft/draftmanager.cpp
    draft/draftmanager.h

    # EWS integration
    ews/ewsattachment.cpp
    ews/ewsattachment.h
    ews/ewsattendee.cpp
    ews/ewsattendee.h
    ews/ewsclient_debug.cpp
    ews/ewsclient_debug.h
    ews/ewsid.cpp
    ews/ewsid.h
    ews/ewsitem.cpp
    ews/ewsitem.h
    ews/ewsitemshape.cpp
    ews/ewsitemshape.h
    ews/ewsitembase.cpp
    ews/ewsitembase.h
    ews/ewsitembase_p.h
    ews/ewsmailbox.cpp
    ews/ewsmailbox.h
    ews/ewsmessagedispatcher.cpp
    ews/ewsmessagedispatcher.h
    ews/ewsoccurrence.cpp
    ews/ewsoccurrence.h
    ews/ewspropertyfield.cpp
    ews/ewspropertyfield.h
    ews/ewsrecurrence.cpp
    ews/ewsrecurrence.h
    ews/ewsserverversion.cpp
    ews/ewsserverversion.h
    ews/ewstypes.cpp
    ews/ewstypes.h
    ews/ewsxml.cpp
    ews/ewsxml.h
    ews/ewscreateitemrequest.cpp
    ews/ewscreateitemrequest.h
    ews/ewsgetfolderrequest.cpp
    ews/ewsgetfolderrequest.h
    ews/ewsupdateitemrequest.cpp
    ews/ewsupdateitemrequest.h
    ews/ewsrequest.cpp
    ews/ewsrequest.h
    ews/ewsjob.cpp
    ews/ewsjob.h
    ews/ewsclient.cpp
    ews/ewsclient.h
    ews/ewsfinditemrequest.cpp
    ews/ewsfinditemrequest.h
    ews/ewsgetitemrequest.cpp
    ews/ewsgetitemrequest.h
    ews/ewsgetfolderrequest.cpp
    ews/ewsgetfolderrequest.h
    ews/ewsfolder.cpp
    ews/ewsfolder.h
    ews/ewscreatefolderrequest.cpp
    ews/ewscreatefolderrequest.h
    ews/ewseffectiverights.h
    ews/ewseffectiverights.cpp
    ews/ewsfoldershape.cpp
    ews/ewsfoldershape.h
    ews/ewscopyitemrequest.cpp
    ews/ewscopyitemrequest.h
    ews/ewsgetfoldercontentrequest.cpp
    ews/ewsgetfoldercontentrequest.h

    reencrypt/reencryptjob.cpp
    reencrypt/reencryptjob.h
    reencrypt/choosekeydialog.cpp
    reencrypt/choosekeydialog.h
    reencrypt/certificatelineedit.cpp
    reencrypt/certificatelineedit.h

    # Editor
    editor/addresseelineedit.cpp
    editor/addresseelineedit.h
    editor/addresseelineeditmanager.cpp
    editor/addresseelineeditmanager.h
    editor/bodytexteditor.cpp
    editor/bodytexteditor.h
    editor/composerviewbase.cpp
    editor/composerviewbase.h
    editor/composerwindow.cpp
    editor/composerwindow.h
    editor/composerwindowfactory.cpp
    editor/composerwindowfactory.h
    editor/cryptostateindicatorwidget.cpp
    editor/cryptostateindicatorwidget.h
    editor/kmcomposerglobalaction.cpp
    editor/kmcomposerglobalaction.h
    editor/nearexpirywarning.cpp
    editor/nearexpirywarning.h
    editor/mailtemplates.cpp
    editor/mailtemplates.h
    editor/recipient.cpp
    editor/recipient.h
    editor/recipientline.cpp
    editor/recipientline.h
    editor/recipientseditor.cpp
    editor/recipientseditor.h
    editor/util.h
    editor/util.cpp
    editor/kmailcompletion.cpp
    editor/kmailcompletion.h
    editor/composersignatures.cpp
    editor/composersignatures.h
    editor/nodehelper.cpp
    editor/nodehelper.h
    editor/signaturecontroller.cpp
    editor/signaturecontroller.h
    editor/spellcheckerconfigdialog.cpp
    editor/spellcheckerconfigdialog.h

    # Editor job
    editor/job/abstractencryptjob.h
    editor/job/autocryptheadersjob.h
    editor/job/contentjobbase.h
    editor/job/contentjobbase_p.h
    editor/job/composerjob.cpp
    editor/job/composerjob.h
    editor/job/encryptjob.h
    editor/job/inserttextfilejob.h
    editor/job/itipjob.h
    editor/job/jobbase.h
    editor/job/jobbase_p.h
    editor/job/maintextjob.h
    editor/job/multipartjob.h
    editor/job/protectedheadersjob.h
    editor/job/signencryptjob.h
    editor/job/signjob.h
    editor/job/singlepartjob.h
    editor/job/skeletonmessagejob.h
    editor/job/transparentjob.h
    editor/job/autocryptheadersjob.cpp
    editor/job/contentjobbase.cpp
    editor/job/encryptjob.cpp
    editor/job/inserttextfilejob.cpp
    editor/job/itipjob.cpp
    editor/job/jobbase.cpp
    editor/job/maintextjob.cpp
    editor/job/multipartjob.cpp
    editor/job/protectedheadersjob.cpp
    editor/job/saveasfilejob.cpp
    editor/job/saveasfilejob.h
    editor/job/signencryptjob.cpp
    editor/job/signjob.cpp
    editor/job/singlepartjob.cpp
    editor/job/skeletonmessagejob.cpp
    editor/job/transparentjob.cpp

    ## Editor Part
    editor/part/globalpart.h
    editor/part/infopart.h
    editor/part/itippart.h
    editor/part/messagepart.h
    editor/part/textpart.h
    editor/part/globalpart.cpp
    editor/part/infopart.cpp
    editor/part/itippart.cpp
    editor/part/messagepart.cpp
    editor/part/textpart.cpp

    ## Attachment
    editor/attachment/attachmentjob.cpp
    editor/attachment/attachmentjob.h
    editor/attachment/attachmentclipboardjob.cpp
    editor/attachment/attachmentclipboardjob.h
    editor/attachment/attachmentcompressjob.cpp
    editor/attachment/attachmentcompressjob.h
    editor/attachment/attachmentcontroller.cpp
    editor/attachment/attachmentcontroller.h
    editor/attachment/attachmentcontrollerbase.cpp
    editor/attachment/attachmentcontrollerbase.h
    editor/attachment/attachmentfromfolderjob.cpp
    editor/attachment/attachmentfromfolderjob.h
    editor/attachment/attachmentfrommimecontentjob.cpp
    editor/attachment/attachmentfrommimecontentjob.h
    editor/attachment/attachmentfromurlbasejob.cpp
    editor/attachment/attachmentfromurlbasejob.h
    editor/attachment/attachmentfromurljob.cpp
    editor/attachment/attachmentfromurljob.h
    editor/attachment/attachmentfromurlutils.cpp
    editor/attachment/attachmentfromurlutils.h
    editor/attachment/attachmentfrompublickeyjob.cpp
    editor/attachment/attachmentfrompublickeyjob.h
    editor/attachment/attachmentloadjob.cpp
    editor/attachment/attachmentloadjob.h
    editor/attachment/attachmentmodel.cpp
    editor/attachment/attachmentmodel.h
    editor/attachment/attachmentpart.cpp
    editor/attachment/attachmentpart.h
    editor/attachment/attachmentpropertiesdialog.cpp
    editor/attachment/attachmentpropertiesdialog.h
    editor/attachment/attachmentupdatejob.cpp
    editor/attachment/attachmentupdatejob.h
    editor/attachment/attachmentview.cpp
    editor/attachment/attachmentview.h

    # Multiplyingline
    multiplyingline/multiplyingline.cpp
    multiplyingline/multiplyingline.h
    multiplyingline/multiplyinglineeditor.cpp
    multiplyingline/multiplyinglineeditor.h
    multiplyingline/multiplyinglineview_p.cpp
    multiplyingline/multiplyinglineview_p.h

    # Utils
    utils/kuniqueservice.h
    utils/kuniqueservice.cpp
    utils/systemtrayicon.h
    utils/systemtrayicon.cpp
)
if (WIN32)
    add_definitions(-DHAVE_QDBUS=false)
    target_sources(gpgol-client-static PRIVATE utils/kuniqueservice_win.cpp)
else()
    add_definitions(-DHAVE_QDBUS=true)
    target_sources(gpgol-client-static PRIVATE utils/kuniqueservice_dbus.cpp)
endif()

ki18n_wrap_ui(gpgol-client-static
    editor/attachment/ui/attachmentpropertiesdialog.ui
    editor/attachment/ui/attachmentpropertiesdialog_readonly.ui
)

ecm_qt_declare_logging_category(gpgol-client-static_SRCS
    HEADER gpgol_client_debug.h
    IDENTIFIER GPGOL_CLIENT_LOG
    CATEGORY_NAME org.gpgol.client
    DESCRIPTION "General client log"
    EXPORT GPGOL
)

ecm_qt_declare_logging_category(gpgol-client-static_SRCS
    HEADER websocket_debug.h
    IDENTIFIER WEBSOCKET_LOG
    CATEGORY_NAME org.gpgol.client.websocket
    DESCRIPTION "Websocket connection in the client"
    EXPORT GPGOL
)

ecm_qt_declare_logging_category(gpgol-client-static_SRCS
    HEADER ewsresource_debug.h
    IDENTIFIER EWSRES_LOG
    CATEGORY_NAME org.gpgol.ews
    DESCRIPTION "Ews mail client"
    EXPORT GPGOL
)

ecm_qt_declare_logging_category(gpgol-client-static_SRCS
    HEADER ewscli_debug.h
    IDENTIFIER EWSCLI_LOG
    CATEGORY_NAME org.gpgol.ews.client
    DESCRIPTION "ews client (gpgol-client)"
    EXPORT GPGOL
)

ecm_qt_declare_logging_category(gpgol-client-static_SRCS
    HEADER editor_debug.h
    IDENTIFIER EDITOR_LOG
    CATEGORY_NAME org.gpgol.editor
    DESCRIPTION "mail composer"
    EXPORT GPGOL
)

set(WARN_TOOMANY_RECIPIENTS_DEFAULT true)
set(ALLOW_SEMICOLON_AS_ADDRESS_SEPARATOR_DEFAULT true)

configure_file(editor/settings/messagecomposer.kcfg.in ${CMAKE_CURRENT_BINARY_DIR}/messagecomposer.kcfg)

kconfig_add_kcfg_files(gpgol-client-static editor/settings/messagecomposersettings.kcfgc config.kcfgc)

install(FILES composerui.rc DESTINATION ${KDE_INSTALL_KXMLGUIDIR}/gpgol-client)

target_sources(gpgol-client-static PUBLIC ${gpgol-client-static_SRCS})

ki18n_wrap_ui(gpgol-client-static firsttimedialog.ui)

target_link_libraries(gpgol-client-static PUBLIC
    common
    rootcagenerator

    LibGpgError::LibGpgError

    Qt6::HttpServer
    Qt6::Widgets
    Qt6::PrintSupport
    Qt6::WebSockets

    KF6::I18n
    KF6::JobWidgets
    KF6::CalendarCore
    KF6::ConfigCore
    KF6::ConfigGui
    KF6::Contacts
    KF6::Completion
    KF6::CoreAddons
    KF6::ColorScheme
    KF6::Codecs
    KF6::GuiAddons
    KF6::SonnetUi
    KF6::SonnetCore
    KF6::WidgetsAddons
    KF6::XmlGui
    KF6::Archive
    KF6::KIOWidgets

    KPim6::MimeTreeParserCore
    KPim6::MimeTreeParserWidgets
    KPim6::Libkleo

    ${_gpgol_dbusaddons_libs}
)

if(Gpgmepp_VERSION VERSION_GREATER_EQUAL "2.0.0")
    target_compile_definitions(gpgol-client-static PUBLIC GPGME2)
endif()

set(GPGOLWEB_ICON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/icons")
file(GLOB ICONS_PNGS "${GPGOLWEB_ICON_DIR}/*.png")
file(GLOB ICONS_SVGS "${GPGOLWEB_ICON_DIR}/*.svg")
ecm_add_app_icon(_gpgol-client_SRCS ICONS ${ICONS_PNGS} ${ICONS_SVGS})
ecm_install_icons(ICONS ${ICONS_PNGS} ${ICONS_SVGS} DESTINATION ${KDE_INSTALL_ICONDIR})
if (ICONS_SVGS)
    list(GET ICONS_SVGS 0 app_icon_svg)
    configure_file(icons/icons.qrc.in icons.qrc @ONLY)
    set(_gpgol-client_SRCS ${_gpgol-client_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/icons.qrc)
endif()

add_executable(gpgol-client main.cpp ${_gpgol-client_SRCS})
qt_add_resources(gpgol-client "manifest"
    PREFIX "/gpgol-client"
    FILES manifest.xml.in
)
target_link_libraries(gpgol-client PRIVATE gpgol-client-static)

if (BUILD_TESTING)
    add_subdirectory(autotests)
endif()

install(TARGETS gpgol-client ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES com.gnupg.gpgolweb.desktop DESTINATION ${KDE_INSTALL_APPDIR})
