cmake_minimum_required(VERSION 3.13)

project(zynk VERSION 0.41.0 LANGUAGES C)

# Prefer C99; the code is compatible with C99/C11
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)

option(BUILD_STRICT "Enable strict compiler warnings" ON)

# Feature toggles — all ON by default, disable with -DWITH_<FEATURE>=OFF
option(WITH_ZYNK             "Key-value store command (!zynk)"         ON)
option(WITH_PING             "Ping/pong command"                       ON)
option(WITH_VERSION          "Version command"                         ON)
option(WITH_HELP             "Help command"                            ON)
option(WITH_QUIT             "Quit/die shutdown command"               ON)
option(WITH_WEATHER          "Weather command (requires curl)"         ON)
option(WITH_FORECAST         "Forecast command (requires curl)"        ON)
option(WITH_STOCK            "Stock quote command (requires curl)"     ON)
option(WITH_CALC             "Calculator command (requires bc)"        ON)
option(WITH_TIME             "Time/timezone command"                   ON)
option(WITH_SEEN             "Seen command (tracks nick activity)"     ON)
option(WITH_TELL             "Tell command (pending messages)"         ON)
option(WITH_GITLOG           "Git log command"                         ON)
option(WITH_CHANGELOG        "Changelog command"                       ON)
option(WITH_AI               "AI question command (requires opencode)" ON)
option(WITH_CODE             "AI code change command (ops only)"       OFF)
option(WITH_REBUILD          "Rebuild command (ops only)"              OFF)
option(WITH_UPTIME           "Uptime command"                          ON)
option(WITH_RELOAD           "Hot-reload command (ops only)"           ON)
option(WITH_RESTART          "Restart command (ops only)"              ON)
option(WITH_YT               "YouTube title command (requires curl)"   ON)
option(WITH_GREETING_OR_CHAT "Greeting/chat with AI fallback"          ON)

# Map WITH_* options to HAS_CMD_* compile definitions and print feature status
message(STATUS "=============================================================================")
message(STATUS "Feature configuration for zynk (${PROJECT_VERSION}):")
message(STATUS "=============================================================================")
foreach(_feat ZYNK PING VERSION HELP QUIT WEATHER FORECAST STOCK
              CALC TIME SEEN TELL GITLOG CHANGELOG AI CODE
              REBUILD UPTIME RELOAD RESTART YT GREETING_OR_CHAT)
  string(TOLOWER "${_feat}" _feat_lower)
  if(WITH_${_feat})
    list(APPEND _cmd_defs "HAS_CMD_${_feat}")
    message(STATUS "[ON]  ${_feat} (!${_feat_lower})")
  else()
    message(STATUS "[OFF] ${_feat} (!${_feat_lower})")
  endif()
endforeach()
message(STATUS "=============================================================================")

# Homebrew OpenSSL hint on macOS (set before find_package)
if(APPLE AND DEFINED ENV{HOMEBREW_PREFIX})
  list(APPEND CMAKE_PREFIX_PATH
       "$ENV{HOMEBREW_PREFIX}/opt/openssl"
       "$ENV{HOMEBREW_PREFIX}/opt/openssl@3")
endif()

find_package(OpenSSL REQUIRED)

add_executable(zynk zynk.c)

if(BUILD_STRICT)
  if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
    target_compile_options(zynk PRIVATE -Wall -Wextra -Wformat=2
      -Wstrict-prototypes -pedantic -fstack-protector-strong
      $<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>,$<CONFIG:MinSizeRel>>:SHELL:-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3>)
    target_link_options(zynk PRIVATE -Wl,-z,relro,-z,now -Wl,-z,noexecstack)
  endif()
endif()

target_compile_definitions(zynk PRIVATE ${_cmd_defs} ZYNK_VERSION="${PROJECT_VERSION}")
target_link_libraries(zynk PRIVATE OpenSSL::SSL OpenSSL::Crypto)

# dlopen/dlsym come from libdl on Unix-like systems (not needed on macOS)
if(UNIX AND NOT APPLE)
  find_library(DL_LIBRARY dl)
  if(DL_LIBRARY)
    target_link_libraries(zynk PRIVATE ${DL_LIBRARY})
  endif()
endif()

install(TARGETS zynk RUNTIME DESTINATION bin)
