cmake_minimum_required(VERSION 3.16)
project(flutter_image_compress_linux_plugin LANGUAGES C CXX)

set(PLUGIN_NAME "flutter_image_compress_linux_plugin")

option(USE_SYSTEM_LIBS "Use system-installed codec libraries via pkg-config" OFF)
option(USE_VENDORED "Link against vendored libs found via CMAKE_PREFIX_PATH" OFF)

find_package(PkgConfig REQUIRED)

# --- Flutter plugin registration library (C++) ---
# Only built when invoked by Flutter's build system (which provides
# apply_standard_settings, flutter, and GTK targets).
if(COMMAND apply_standard_settings)
  add_library(${PLUGIN_NAME} SHARED
    flutter_image_compress_linux_plugin.cc
  )
  apply_standard_settings(${PLUGIN_NAME})
  set_target_properties(${PLUGIN_NAME} PROPERTIES
    CXX_VISIBILITY_PRESET hidden
  )
  target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
  target_include_directories(${PLUGIN_NAME} INTERFACE
    "${CMAKE_CURRENT_SOURCE_DIR}/include"
  )
  target_link_libraries(${PLUGIN_NAME} PRIVATE flutter)
  target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK)
endif()

# --- Codec wrapper library (C) ---
# Find codec libraries
if(USE_VENDORED)
  # When building with vendored libs, find them via CMAKE_PREFIX_PATH
  find_library(JPEG_LIB jpeg REQUIRED)
  find_library(PNG_LIB png REQUIRED)
  find_library(WEBP_LIB webp REQUIRED)
  find_library(HEIF_LIB heif REQUIRED)
  find_library(EXIF_LIB exif REQUIRED)
  find_path(JPEG_INCLUDE jpeglib.h REQUIRED)
  find_path(PNG_INCLUDE png.h REQUIRED)
  find_path(WEBP_INCLUDE webp/encode.h REQUIRED)
  find_path(HEIF_INCLUDE libheif/heif.h REQUIRED)
  find_path(EXIF_INCLUDE libexif/exif-data.h REQUIRED)
elseif(USE_SYSTEM_LIBS)
  pkg_check_modules(JPEG REQUIRED IMPORTED_TARGET libjpeg)
  pkg_check_modules(PNG REQUIRED IMPORTED_TARGET libpng)
  pkg_check_modules(WEBP REQUIRED IMPORTED_TARGET libwebp)
  pkg_check_modules(HEIF REQUIRED IMPORTED_TARGET libheif)
  pkg_check_modules(EXIF REQUIRED IMPORTED_TARGET libexif)
else()
  pkg_check_modules(JPEG IMPORTED_TARGET libjpeg)
  pkg_check_modules(PNG IMPORTED_TARGET libpng)
  pkg_check_modules(WEBP IMPORTED_TARGET libwebp)
  pkg_check_modules(HEIF IMPORTED_TARGET libheif)
  pkg_check_modules(EXIF IMPORTED_TARGET libexif)
endif()

add_library(codec_wrapper SHARED src/codec_wrapper.c)
target_include_directories(codec_wrapper PRIVATE src)
set_target_properties(codec_wrapper PROPERTIES
  C_STANDARD 11
  OUTPUT_NAME "codec_wrapper"
  PREFIX "lib"
  INSTALL_RPATH "$ORIGIN"
)

if(USE_VENDORED)
  target_include_directories(codec_wrapper PRIVATE ${JPEG_INCLUDE} ${PNG_INCLUDE} ${WEBP_INCLUDE} ${HEIF_INCLUDE} ${EXIF_INCLUDE})
  target_link_libraries(codec_wrapper PRIVATE ${JPEG_LIB} ${PNG_LIB} ${WEBP_LIB} ${HEIF_LIB} ${EXIF_LIB})
else()
  foreach(LIB JPEG PNG WEBP HEIF EXIF)
    if(${LIB}_FOUND)
      target_link_libraries(codec_wrapper PRIVATE PkgConfig::${LIB})
    endif()
  endforeach()
endif()

target_link_libraries(codec_wrapper PRIVATE m)

# --- Bundle libcodec_wrapper.so into the Flutter app ---
if(COMMAND apply_standard_settings)
  list(APPEND flutter_image_compress_linux_bundled_libraries $<TARGET_FILE:codec_wrapper>)
  # Also bundle pre-built codec .so files if present
  set(BUNDLE_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bundle/lib")
  if(EXISTS "${BUNDLE_LIB_DIR}")
    file(GLOB BUNDLED_LIBS "${BUNDLE_LIB_DIR}/*.so*")
    list(APPEND flutter_image_compress_linux_bundled_libraries ${BUNDLED_LIBS})
  endif()
  set(flutter_image_compress_linux_bundled_libraries ${flutter_image_compress_linux_bundled_libraries} PARENT_SCOPE)
endif()

# --- Native test binary (standalone, not part of Flutter build) ---
option(BUILD_TESTS "Build native test binary" OFF)
if(BUILD_TESTS)
  enable_testing()
  add_executable(test_codec_wrapper test/test_codec_wrapper.c)
  target_link_libraries(test_codec_wrapper PRIVATE codec_wrapper)
  target_include_directories(test_codec_wrapper PRIVATE src)
  set_target_properties(test_codec_wrapper PROPERTIES
    C_STANDARD 11
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/test"
  )
  add_test(NAME codec_wrapper_tests
    COMMAND test_codec_wrapper
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  )
endif()
