cmake_minimum_required(VERSION 3.13)

project(test-deepin-reader LANGUAGES CXX C)

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

# 查找依赖
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBJPEG REQUIRED libjpeg)
pkg_check_modules(DDJVU REQUIRED ddjvuapi)
pkg_check_modules(FREETYPE REQUIRED freetype2)

# Use pdfium in system default
if (NOT USE_PDFIUM_BUNDLE)
    pkg_check_modules(Deepin-pdfium REQUIRED IMPORTED_TARGET deepin-pdfium)
endif()

# 查找 Qt 版本（优先 Qt6）
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
set(QT_DESIRED_VERSION ${QT_VERSION_MAJOR})

message(STATUS ">>> Test building with Qt${QT_DESIRED_VERSION}")

# 定义必需的 Qt 组件
set(qt_required_components Core Gui Widgets Network Sql Svg Concurrent Xml Test)

if (QT_DESIRED_VERSION MATCHES 6)
    list(APPEND qt_required_components Core5Compat)
endif()

find_package(Qt${QT_DESIRED_VERSION} REQUIRED COMPONENTS ${qt_required_components})

if(NOT QT_DESIRED_VERSION MATCHES 6)
    find_package(Qt5DBus REQUIRED)
    find_package(Qt5PrintSupport QUIET)
endif()

# 设置 DTK 版本
if (QT_DESIRED_VERSION MATCHES 6)
    set(DTK_VERSION_MAJOR 6)
    find_package(Dtk${DTK_VERSION_MAJOR} REQUIRED COMPONENTS Widget Gui Core)
    set(DTK_USE_TARGETS ON)
else()
    set(DTK_VERSION_MAJOR "")
    find_package(DtkWidget REQUIRED)
    find_package(DtkGui REQUIRED)
    find_package(DtkCore REQUIRED)
    set(DTK_USE_TARGETS OFF)
endif()

# 查找 Google Test
find_package(GTest REQUIRED)

# XPS 支持
option(XPS_SUPPORT "Enable XPS document format support" ON)
set(XPS_SUPPORT_RESOLVED ${XPS_SUPPORT})
set(XPS_DEPS_FOUND OFF)

if (XPS_SUPPORT)
    pkg_check_modules(XPS_DEPS QUIET libgxps cairo glib-2.0 gobject-2.0)
    if (XPS_DEPS_FOUND)
        message(STATUS ">>> XPS support enabled (libgxps dependencies detected)")
        add_compile_definitions(XPS_SUPPORT_ENABLED)
        set(XPS_SUPPORT_RESOLVED ON)
    else()
        message(WARNING ">>> XPS support disabled: missing libgxps/cairo/glib-2.0/gobject-2.0 dependencies")
        set(XPS_SUPPORT_RESOLVED OFF)
    endif()
else()
    set(XPS_SUPPORT_RESOLVED OFF)
endif()

set(XPS_SUPPORT_ENABLED ${XPS_SUPPORT_RESOLVED})

# OFD 支持（检测结果继承自顶层 CMakeLists.txt 的 OFD_SUPPORT_ENABLED / ROFD_*）
if (OFD_SUPPORT_ENABLED)
    pkg_check_modules(OFD_CAIRO REQUIRED cairo)
endif()

# ====== 收集 reader 源文件 ======
# 递归收集 reader/ 下所有源文件，排除 main.cpp
# 新增子模块时无需修改此文件
file(GLOB_RECURSE READER_ALL_SOURCES
    "${CMAKE_SOURCE_DIR}/reader/*.cpp"
    "${CMAKE_SOURCE_DIR}/reader/*.c"
    "${CMAKE_SOURCE_DIR}/reader/*.h"
)
list(REMOVE_ITEM READER_ALL_SOURCES "${CMAKE_SOURCE_DIR}/reader/main.cpp")

# ====== 自动发现 reader 子目录作为 include 路径 ======
file(GLOB READER_SUBDIRS LIST_DIRECTORIES true "${CMAKE_SOURCE_DIR}/reader/*")
foreach(_dir ${READER_SUBDIRS})
    if(IS_DIRECTORY "${_dir}")
        list(APPEND READER_INCLUDE_DIRS "${_dir}")
    endif()
endforeach()
list(APPEND READER_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/reader")

# ====== 收集测试源文件 ======
file(GLOB_RECURSE TEST_SOURCES
    "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/*.h"
)
# 排除非测试辅助目录（如 at/、files/ 等资源目录）
list(FILTER TEST_SOURCES EXCLUDE REGEX "${CMAKE_CURRENT_SOURCE_DIR}/at/")
list(FILTER TEST_SOURCES EXCLUDE REGEX "${CMAKE_CURRENT_SOURCE_DIR}/files/")
list(FILTER TEST_SOURCES EXCLUDE REGEX "${CMAKE_CURRENT_SOURCE_DIR}/include/")
# batch-print 测试为独立可执行文件（见 batch-print/CMakeLists.txt），不并入本测试目标
list(FILTER TEST_SOURCES EXCLUDE REGEX "${CMAKE_CURRENT_SOURCE_DIR}/batch-print/")

# ====== 合并所有源文件 ======
set(ALL_SOURCES
    ${READER_ALL_SOURCES}
    ${TEST_SOURCES}
)

# ====== 定义测试可执行文件 ======
add_executable(${PROJECT_NAME} ${ALL_SOURCES})

set_target_properties(${PROJECT_NAME} PROPERTIES
    AUTOMOC ON
    AUTORCC ON
    AUTOUIC ON
)

# ====== 包含目录 ======
# READER_INCLUDE_DIRS 由上方自动发现，新增子模块时无需手动添加
target_include_directories(${PROJECT_NAME} PUBLIC
    ${READER_INCLUDE_DIRS}
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include/gtest
    ${PDFIUM_INCLUDE_DIRS}
    $<$<BOOL:${XPS_SUPPORT_ENABLED}>:${XPS_DEPS_INCLUDE_DIRS}>
    $<$<BOOL:${OFD_SUPPORT_ENABLED}>:${ROFD_INCLUDE_DIR}>
    $<$<BOOL:${OFD_SUPPORT_ENABLED}>:${OFD_CAIRO_INCLUDE_DIRS}>
)

# DTK 包含目录（Qt5 使用变量，Qt6 使用目标）
if(NOT QT_DESIRED_VERSION MATCHES 6)
    target_include_directories(${PROJECT_NAME} PUBLIC
        ${DtkWidget_INCLUDE_DIRS}
        ${DtkGui_INCLUDE_DIRS}
        ${DtkCore_INCLUDE_DIRS}
    )
endif()

# ====== 编译定义 ======
target_compile_definitions(${PROJECT_NAME} PRIVATE
    QT_DEPRECATED_WARNINGS
    UTSOURCEDIR="${CMAKE_CURRENT_SOURCE_DIR}"
    APP_VERSION="${APP_VERSION}"
    INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}"
    INSTALL_LIBDIR="${CMAKE_INSTALL_LIBDIR}"
)

if (QT_DESIRED_VERSION MATCHES 6)
    target_compile_definitions(${PROJECT_NAME} PRIVATE QT_VERSION_6)
endif()

# ====== 编译选项 ======
target_compile_options(${PROJECT_NAME} PRIVATE
    -g -Wall -fno-access-control -O0 -fno-inline
    -fprofile-arcs -ftest-coverage
    -fstack-protector-strong -D_FORTIFY_SOURCE=1 -fPIC
    $<$<BOOL:${XPS_SUPPORT_ENABLED}>:${XPS_DEPS_CFLAGS_OTHER}>
    $<$<BOOL:${OFD_SUPPORT_ENABLED}>:${OFD_CAIRO_CFLAGS_OTHER}>
)

target_link_options(${PROJECT_NAME} PRIVATE
    -g -Wall -fprofile-arcs -ftest-coverage -O0
    -pie -z lazy
)

# ====== 链接库 ======
set(TEST_LINK_LIBS
    Qt${QT_DESIRED_VERSION}::Core
    Qt${QT_DESIRED_VERSION}::Gui
    Qt${QT_DESIRED_VERSION}::Widgets
    Qt${QT_DESIRED_VERSION}::Network
    Qt${QT_DESIRED_VERSION}::Sql
    Qt${QT_DESIRED_VERSION}::Svg
    Qt${QT_DESIRED_VERSION}::Concurrent
    Qt${QT_DESIRED_VERSION}::Xml
    Qt${QT_DESIRED_VERSION}::Test
    GTest::GTest
    ${LIBJPEG_LIBRARIES}
    ${DDJVU_LIBRARIES}
    ${FREETYPE_LIBRARIES}
)

if (QT_DESIRED_VERSION MATCHES 6)
    list(APPEND TEST_LINK_LIBS Qt${QT_DESIRED_VERSION}::Core5Compat)
else()
    list(APPEND TEST_LINK_LIBS
        Qt5::DBus
        dl
        pthread
    )
    if(Qt5PrintSupport_FOUND)
        list(APPEND TEST_LINK_LIBS Qt5::PrintSupport)
    endif()
endif()

# DTK 链接
if(DTK_USE_TARGETS)
    list(APPEND TEST_LINK_LIBS
        Dtk${DTK_VERSION_MAJOR}::Widget
        Dtk${DTK_VERSION_MAJOR}::Gui
        Dtk${DTK_VERSION_MAJOR}::Core
    )
else()
    list(APPEND TEST_LINK_LIBS
        ${DtkWidget_LIBRARIES}
        ${DtkGui_LIBRARIES}
        ${DtkCore_LIBRARIES}
    )
endif()

# XPS 链接
if (XPS_SUPPORT_ENABLED)
    list(APPEND TEST_LINK_LIBS ${XPS_DEPS_LIBRARIES})
endif()

# OFD 链接
if (OFD_SUPPORT_ENABLED)
    list(APPEND TEST_LINK_LIBS ${ROFD_FFI_LIBRARY} ${OFD_CAIRO_LIBRARIES})
endif()

# PDFium 链接
if (USE_PDFIUM_BUNDLE)
    target_include_directories(${PROJECT_NAME} PUBLIC
        ${CMAKE_SOURCE_DIR}/3rdparty/deepin-pdfium/include
    )
    # 需要先构建 deepin-pdfium
    target_link_libraries(${PROJECT_NAME} PRIVATE ${TEST_LINK_LIBS} deepin-pdfium-reader)
else()
    list(APPEND TEST_LINK_LIBS PkgConfig::Deepin-pdfium)
    target_link_libraries(${PROJECT_NAME} PRIVATE ${TEST_LINK_LIBS})
endif()

# ====== 资源文件 =====#
if (QT_DESIRED_VERSION MATCHES 6)
    qt6_add_resources(RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/files.qrc)
else()
    qt5_add_resources(RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/files.qrc)
endif()
target_sources(${PROJECT_NAME} PRIVATE ${RESOURCES})

# 启用测试
enable_testing()
add_test(NAME ${PROJECT_NAME} COMMAND ${PROJECT_NAME})

# 批量打印单元测试（独立 gtest 可执行文件）
add_subdirectory(batch-print)
