cmake_minimum_required(VERSION 3.16)
project(dfm-extension-seafile VERSION 0.1.7 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_AUTOMOC ON)

find_package(dfm-extension REQUIRED)
find_package(Threads REQUIRED)
find_package(PkgConfig REQUIRED)
find_package(Qt6 REQUIRED COMPONENTS Widgets)
# Only libsearpc is required at link time. Repo list responses are parsed as
# JSON so the plugin does not depend on libseafile GObject types matching the
# Linglong-bundled seaf-daemon version.
#
# Do not use IMPORTED_TARGET for libsearpc: some distro .pc files add
# -I${includedir}/searpc even when headers live flat in ${includedir}.
pkg_check_modules(SEARPC REQUIRED libsearpc)
set(_SEARPC_INCLUDE_DIRS "")
foreach(_inc IN LISTS SEARPC_INCLUDE_DIRS)
    if(EXISTS "${_inc}")
        list(APPEND _SEARPC_INCLUDE_DIRS "${_inc}")
    endif()
endforeach()
set(SEARPC_INCLUDE_DIRS "${_SEARPC_INCLUDE_DIRS}")
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0 gio-2.0)
find_library(JANSSON_LIBRARY NAMES jansson
    PATHS /usr/lib/x86_64-linux-gnu
    REQUIRED)

# Auto-login / share-link HTTP APIs use accounts.db + libcurl.
find_library(CURL_LIBRARY NAMES curl curl.so.4
    PATHS /usr/lib/x86_64-linux-gnu ${CMAKE_PREFIX_PATH}
    PATH_SUFFIXES lib lib/x86_64-linux-gnu
    REQUIRED)
find_library(SQLITE3_LIBRARY NAMES sqlite3 sqlite3.so.0
    PATHS /usr/lib/x86_64-linux-gnu ${CMAKE_PREFIX_PATH}
    PATH_SUFFIXES lib lib/x86_64-linux-gnu
    REQUIRED)
set(EXTRA_INCLUDE_DIRS "")
find_path(CURL_INCLUDE_DIR curl/curl.h
    PATH_SUFFIXES x86_64-linux-gnu
)
find_path(SQLITE3_INCLUDE_DIR sqlite3.h)
if(DFM_EXTENSION_ROOT)
    list(APPEND EXTRA_INCLUDE_DIRS
        "${DFM_EXTENSION_ROOT}/include"
        "${DFM_EXTENSION_ROOT}/include/x86_64-linux-gnu")
endif()
if(CURL_INCLUDE_DIR)
    list(APPEND EXTRA_INCLUDE_DIRS "${CURL_INCLUDE_DIR}")
endif()
if(SQLITE3_INCLUDE_DIR)
    list(APPEND EXTRA_INCLUDE_DIRS "${SQLITE3_INCLUDE_DIR}")
endif()
if(NOT CURL_INCLUDE_DIR AND NOT DFM_EXTENSION_ROOT)
    message(FATAL_ERROR "curl/curl.h not found")
endif()
if(NOT SQLITE3_INCLUDE_DIR AND NOT DFM_EXTENSION_ROOT)
    message(FATAL_ERROR "sqlite3.h not found")
endif()

include(GNUInstallDirs)

if(DFM_EXTENSION_ROOT)
    set(dfm-extension_INCLUDE_DIR "${DFM_EXTENSION_ROOT}/include")
    link_directories("${DFM_EXTENSION_ROOT}/${CMAKE_INSTALL_LIBDIR}")
endif()

add_library(${PROJECT_NAME} SHARED
    src/seafile-plugin.cpp
    src/seafile-core.cpp
    src/seafile-rpc-client.cpp
    src/seafile-account.cpp
    src/seafile-emblem-plugin.cpp
    src/seafile-menu-plugin.cpp
)

target_include_directories(${PROJECT_NAME}
    PRIVATE
        ${dfm-extension_INCLUDE_DIR}
        ${EXTRA_INCLUDE_DIRS}
        ${SEARPC_INCLUDE_DIRS}
        ${CMAKE_CURRENT_SOURCE_DIR}/src
)

target_link_libraries(${PROJECT_NAME}
    PRIVATE
        ${dfm-extension_LIBRARIES}
        ${SEARPC_LIBRARIES}
        ${CURL_LIBRARY}
        ${SQLITE3_LIBRARY}
        Threads::Threads
)

target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic)

# Qt6 dialog for share-link password / expire-days (mirrors seafile-client).
add_executable(seafile-dfm-share-link-dialog
    src/share-link-dialog/main.cpp
    src/share-link-dialog/share-link-dialog.cpp
    src/share-link-dialog/share-link-dialog.h
    src/seafile-account.cpp
)
target_include_directories(seafile-dfm-share-link-dialog PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${EXTRA_INCLUDE_DIRS}
    ${GLIB_INCLUDE_DIRS}
)
target_link_libraries(seafile-dfm-share-link-dialog PRIVATE
    Qt6::Widgets
    PkgConfig::GLIB
    ${JANSSON_LIBRARY}
    ${CURL_LIBRARY}
    ${SQLITE3_LIBRARY}
)
target_compile_options(seafile-dfm-share-link-dialog PRIVATE
    -Wall -Wextra -Wpedantic
)

option(BUILD_RPC_SMOKE_TEST "Build the live Seafile daemon smoke test" OFF)
if(BUILD_RPC_SMOKE_TEST)
    add_executable(seafile-rpc-smoke
        tests/rpc-smoke.cpp
        src/seafile-core.cpp
        src/seafile-rpc-client.cpp
        src/seafile-account.cpp
    )
    target_include_directories(seafile-rpc-smoke PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src
        ${EXTRA_INCLUDE_DIRS}
        ${SEARPC_INCLUDE_DIRS}
    )
    target_link_libraries(seafile-rpc-smoke PRIVATE
        ${SEARPC_LIBRARIES}
        ${CURL_LIBRARY}
        ${SQLITE3_LIBRARY}
        Threads::Threads
    )
    target_compile_options(seafile-rpc-smoke PRIVATE
        -Wall -Wextra -Wpedantic
    )
endif()

if(NOT DEFINED DFM_EXT_PLUGIN_DIR)
    if(DEFINED LIB_INSTALL_DIR)
        set(DFM_EXT_PLUGIN_DIR
            ${LIB_INSTALL_DIR}/dde-file-manager/plugins/extensions)
    else()
        set(DFM_EXT_PLUGIN_DIR
            ${CMAKE_INSTALL_LIBDIR}/dde-file-manager/plugins/extensions)
    endif()
endif()

set(SEAFILE_DFM_LIBEXEC_DIR
    ${CMAKE_INSTALL_LIBEXECDIR}/dde-file-manager-seafile-plugin)

install(TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION ${DFM_EXT_PLUGIN_DIR}
)
install(TARGETS seafile-dfm-share-link-dialog
    RUNTIME DESTINATION ${SEAFILE_DFM_LIBEXEC_DIR}
)
install(DIRECTORY icons/
    DESTINATION ${CMAKE_INSTALL_DATADIR}/icons
)
