cmake_minimum_required(VERSION 3.14)
project(ukui-file-metadata LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FeatureSummary)
include(GNUInstallDirs)
feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

include(CheckStructHasMember)

# Dependencies
set(REQUIRED_QT_VERSION 5.12.8)
option(BUILD_WITH_QT6 "Build against Qt 6" OFF)

# An explicit Qt 6 request takes precedence over Qt targets loaded by a parent.
if(BUILD_WITH_QT6 OR TARGET Qt6::Core)
    set(QT_VERSION_MAJOR 6)
    find_package(Qt6 COMPONENTS Core Gui Widgets REQUIRED)
elseif(TARGET Qt5::Core)
    set(QT_VERSION_MAJOR 5)
    find_package(Qt5 ${REQUIRED_QT_VERSION} COMPONENTS Core Gui Widgets REQUIRED)
else()
    find_package(Qt5 ${REQUIRED_QT_VERSION} COMPONENTS Core Gui Widgets REQUIRED)
    set(QT_VERSION_MAJOR 5)
endif()


set(POPPLER_LIB "")
if(QT_VERSION_MAJOR EQUAL 5)
    set(POPPLER_LIB poppler-qt5)
elseif (QT_VERSION_MAJOR EQUAL 6)
    set(POPPLER_LIB poppler-qt6)
    find_package(Iconv REQUIRED)
endif ()

find_package(PkgConfig REQUIRED)
# zip_encryption_method_supported() was introduced in libzip 1.7.0.
pkg_check_modules(ZIP REQUIRED IMPORTED_TARGET libzip>=1.7.0)
set(UKUI_FILE_METADATA_PC_PKGS uchardet libavcodec libavformat libavutil libswscale taglib tesseract lept)
foreach(PC_LIB IN LISTS UKUI_FILE_METADATA_PC_PKGS)
    string(TOUPPER "${PC_LIB}" PC_PREFIX)
    # Normalize libav* package names to the shorter imported-target prefixes
    # used elsewhere in the tree, e.g. libavcodec -> AVCODEC.
    string(REGEX REPLACE "^LIB" "" PC_PREFIX "${PC_PREFIX}")
    pkg_check_modules(${PC_PREFIX} REQUIRED IMPORTED_TARGET ${PC_LIB})
endforeach()
# poppler-qt5 / poppler-qt6 do not fit the generic prefix normalization above,
# so keep a stable POPPLER imported-target prefix for consumers.
pkg_check_modules(POPPLER REQUIRED IMPORTED_TARGET ${POPPLER_LIB})

enable_testing()
add_subdirectory(src)
if (BUILD_TESTING)
    # zlib and minizip are only needed by autotests to generate ZIP fixtures.
    # Production library uses libzip exclusively for ZIP operations.
    find_package(ZLIB REQUIRED)
    pkg_check_modules(MINIZIP REQUIRED IMPORTED_TARGET minizip)
    add_subdirectory(autotests)
    add_subdirectory(tests)
endif()

feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
