cmake_minimum_required(VERSION 3.15) 
project(LumberJack LANGUAGES CXX)

# System and compiler configurations
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)

# ==========================================
# 1. CORE LIBRARY TARGET
# ==========================================
add_library(LumberJack_core 
    log_parsing/log_parsing.cpp 
    ip_to_geo/ip_to_geo.cpp 
    env_reader/env.cpp
    third_party/src/GeoLite2PP.cpp 
    third_party/src/GeoLite2PP_error_category.cpp
)

# Include paths for your modules and MaxMind headers
target_include_directories(LumberJack_core PRIVATE 
    ${CMAKE_CURRENT_SOURCE_DIR}/log_parsing 
    ${CMAKE_CURRENT_SOURCE_DIR}/ip_to_geo 
    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/include
)

# CROSS-PLATFORM FIXED: Automatically links appropriate binary dependencies based on OS
if(WIN32)
    if(MSVC)
        # Windows via Visual Studio Compiler
        target_link_libraries(LumberJack_core PRIVATE 
            ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/maxminddb.lib
        )
    else()
        # Windows via MinGW/GCC Cross-Toolchain (FIXED: Points to your new library file)
        target_link_libraries(LumberJack_core PRIVATE 
            ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/mingw_libmaxminddb.a
        )
    endif()
    
    # Windows requires Windows Sockets API linked for libmaxminddb network resolutions
    target_link_libraries(LumberJack_core PRIVATE ws2_32)

elseif(APPLE)
    # macOS Specific Path Integrations (Handles Intel /opt/local and Apple Silicon /opt/homebrew)
    find_library(MAXMIND_LIB maxminddb HINTS /opt/homebrew/lib /usr/local/lib /opt/local/lib)
    
    if(MAXMIND_LIB)
        target_link_libraries(LumberJack_core PRIVATE ${MAXMIND_LIB})
    else()
        # Fallback to local static file repository boundary if brew package is missing
        target_link_libraries(LumberJack_core PRIVATE 
            ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/libmaxminddb.a
        )
    endif()
    
else()
    # Standard Linux (Ubuntu, Arch Linux, Fedora, etc.)
    # OPTIMIZATION: Try finding system-installed libmaxminddb first, fallback to local file if missing
    find_library(MAXMIND_LINUX maxminddb)
    if(MAXMIND_LINUX)
        target_link_libraries(LumberJack_core PRIVATE ${MAXMIND_LINUX})
    else()
        target_link_libraries(LumberJack_core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/libmaxminddb.a)
    endif()
endif()

# Version definitions needed by your GeoLite2PP wrapper
target_compile_definitions(LumberJack_core PRIVATE 
    GEOLITE2PP_VERSION="0.0.1"
)

# ==========================================
# 2. FTXUI Library Download
# ==========================================
FetchContent_Declare(
  ftxui
  GIT_REPOSITORY https://github.com/ArthurSonzogni/FTXUI.git
  GIT_TAG        v6.1.9
)
FetchContent_MakeAvailable(ftxui)

# ==========================================
# 3. APPLICATION EXECUTABLE
# ==========================================
add_executable(LumberJack main.cpp)

# Second: Link your internal libraries and FTXUI
target_link_libraries(LumberJack PRIVATE 
    LumberJack_core 
    ftxui::screen 
    ftxui::dom 
    ftxui::component
)

# Third: Apply your static linking flags (Target now exists safely!)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
    if(WIN32)
        if(MSVC)
            set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
        else()
            target_link_options(LumberJack PRIVATE -static)
        endif()
    elseif(APPLE)
        set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES)
    else()
        target_link_options(LumberJack PRIVATE -static-libgcc -static-libstdc++)
    endif()
endif()

# Fourth: Set directory runtime properties
set_target_properties(LumberJack PROPERTIES 
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}"
    RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}"
)

# ==========================================
# 4. TEST SUITE
# ==========================================
enable_testing()
