include(GenerateExportHeader)
include(CMakePackageConfigHelpers)

# ----------- Library -----------
add_library(uuidp SHARED uuidp.cpp)
# Export all symbols on MSVC if you don’t annotate every function
set_target_properties(uuidp PROPERTIES
  WINDOWS_EXPORT_ALL_SYMBOLS ON
  OUTPUT_NAME "uuidp"
  VERSION ${PROJECT_VERSION}
  SOVERSION ${PROJECT_VERSION_MAJOR}
)
# Export header (defines UUIDP_EXPORT macro)
generate_export_header(uuidp
  EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/uuidp_export.h"
)

# Public headers for consumers (build + install)
target_include_directories(uuidp
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
    $<INSTALL_INTERFACE:include>
)
# Optional: Debug postfix on MSVC
set_target_properties(uuidp PROPERTIES DEBUG_POSTFIX "d")

# ----------- Tool -----------
add_executable(uuid-gen uuid-gen.cpp)
target_link_libraries(uuid-gen PRIVATE uuidp)

# ----------- Install (runtime/import lib/headers) -----------
include(GNUInstallDirs)

# Install the DLL/EXE to bin, the import lib (.lib) to lib
install(TARGETS uuidp
  EXPORT uuidpTargets
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}          # .dll (Windows)
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}          # .so/.dylib (posix)
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}          # .lib (import/static)
  INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

install(TARGETS uuid-gen
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

# Headers (yours + generated export header)
install(FILES
  "${CMAKE_CURRENT_SOURCE_DIR}/uuidp.h"
  "${CMAKE_CURRENT_BINARY_DIR}/uuidp_export.h"
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

# ----------- CMake package (find_package support) -----------
# Where to place the package config
set(ConfigPackageLocation "${CMAKE_INSTALL_LIBDIR}/cmake/libuuidp")

# Export the targets file
install(EXPORT uuidpTargets
  FILE libuuidpTargets.cmake
  NAMESPACE uuidp::
  # IMPORTANT: Set the desired exported name of the target inside the namespace
  # This makes the consumer use 'uuidp::uuidp'
  # TARGET_NAME is the internal target name: uuidp
  # Renaming the internal target to `uuidp_lib` and exporting it as `uuidp` is another common pattern.
  # But here, we just rely on the default behavior that makes NAMESPACE::TARGET_NAME
  DESTINATION "${ConfigPackageLocation}"
)

# Config + version files
configure_package_config_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/../uuid.cmake.in"
  "${CMAKE_CURRENT_BINARY_DIR}/libuuidpConfig.cmake"
  INSTALL_DESTINATION "${ConfigPackageLocation}"
  NO_CHECK_REQUIRED_COMPONENTS_MACRO
)

write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/libuuidpConfigVersion.cmake"
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY AnyNewerVersion
)

install(FILES
  "${CMAKE_CURRENT_BINARY_DIR}/libuuidpConfig.cmake"
  "${CMAKE_CURRENT_BINARY_DIR}/libuuidpConfigVersion.cmake"
  DESTINATION "${ConfigPackageLocation}"
)

# ----------- CPack (WiX) -----------
if(WIN32)
  set(CPACK_GENERATOR "WIX")
  set(CPACK_PACKAGE_NAME "uuidp")
  set(CPACK_PACKAGE_VENDOR "tuxist.de")
  set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "uuidp - A C++ uuid Library")
  set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
  set(CPACK_PACKAGE_INSTALL_DIRECTORY "libuuidp")
  # WiX expects an .rtf license typically; provide an RTF if possible
  set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.rtf")
  # Stable, product-wide GUID (do not change between versions)
  set(CPACK_WIX_UPGRADE_GUID "fdedd700-d2a1-5dbe-8157-640d83d42577")
  include(CPack)
endif()
