cmake_minimum_required(VERSION 3.15)
project(DateTime 
    VERSION 1.1.2
    DESCRIPTION "A C++ library containing time-related tools"
    LANGUAGES C CXX
)

set(CMAKE_C_STANDARD 17)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

option(BUILD_TESTING "Build unit tests" OFF)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_STATIC_LIBS "Build static libraries" ON)
set(DATETIME_INSTALL_LIBDIR "lib" CACHE STRING "Library installation directory")
set(DATETIME_INSTALL_BINDIR "bin" CACHE STRING "Runtime installation directory")
set(DATETIME_INSTALL_INCLUDEDIR "include" CACHE STRING "Header installation directory")
set(DATETIME_INSTALL_CMAKEDIR "lib/cmake/DateTime" CACHE STRING "CMake config installation directory")

# Validate options
if(NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS)
    message(FATAL_ERROR "At least one of BUILD_SHARED_LIBS or BUILD_STATIC_LIBS must be enabled")
endif()

# Set build type to Release if not specified
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
endif()

# Compiler-specific options
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
    set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wextra")
    set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
elseif(MSVC)
    set(CMAKE_CXX_FLAGS_DEBUG "/Od /Zi /W4")
    set(CMAKE_CXX_FLAGS_RELEASE "/O2 /DNDEBUG")
endif()

add_subdirectory(src)

if(BUILD_TESTING)
  enable_testing()
  add_subdirectory(tests)
endif()

# Package configuration
include(CMakePackageConfigHelpers)

# Create config files
configure_package_config_file(
    DateTimeConfig.cmake.in
    "${CMAKE_CURRENT_BINARY_DIR}/DateTimeConfig.cmake"
    INSTALL_DESTINATION ${DATETIME_INSTALL_CMAKEDIR}
)

write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/DateTimeConfigVersion.cmake"
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
)

# Install config files
install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/DateTimeConfig.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/DateTimeConfigVersion.cmake"
    DESTINATION ${DATETIME_INSTALL_CMAKEDIR}
)

# Add a manual uninstall target
configure_file(
  ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
  ${CMAKE_BINARY_DIR}/cmake_uninstall.cmake
  IMMEDIATE @ONLY
)

add_custom_target(uninstall
  COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/cmake_uninstall.cmake
)