cmake_minimum_required(VERSION 3.15)
project(FlyLoLayer3-FFGL VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ============================================================================
# FFGL SDK as static library
# ============================================================================
set(SDK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/source/lib)

add_library(ffgl-sdk STATIC
    ${SDK_DIR}/FFGLSDK.h
    ${SDK_DIR}/FFGLSDK.cpp
)

target_include_directories(ffgl-sdk PUBLIC ${SDK_DIR})
target_compile_features(ffgl-sdk PUBLIC cxx_std_17)

# Platform-specific GL setup
if(APPLE)
    target_compile_definitions(ffgl-sdk PUBLIC TARGET_OS_MAC)
    find_library(OPENGL_FRAMEWORK OpenGL REQUIRED)
    target_link_libraries(ffgl-sdk PUBLIC ${OPENGL_FRAMEWORK})
elseif(WIN32)
    target_compile_definitions(ffgl-sdk PUBLIC TARGET_OS_WIN)
    # GLEW from deps/
    set(GLEW_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/glew-2.1.0)
    target_include_directories(ffgl-sdk PUBLIC ${GLEW_DIR}/include)
    target_link_libraries(ffgl-sdk PUBLIC
        ${GLEW_DIR}/lib/Release/x64/glew32s.lib
        opengl32
    )
    target_compile_definitions(ffgl-sdk PUBLIC GLEW_STATIC)
endif()

# ============================================================================
# Helper function to create FFGL plugin targets
# ============================================================================
function(add_ffgl_plugin PLUGIN_NAME)
    set(PLUGIN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/source/plugins/${PLUGIN_NAME})

    # Collect all .cpp and .h files in the plugin directory
    file(GLOB PLUGIN_SOURCES ${PLUGIN_DIR}/*.cpp ${PLUGIN_DIR}/*.h)

    add_library(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES})
    target_link_libraries(${PLUGIN_NAME} PRIVATE ffgl-sdk)

    if(APPLE)
        # macOS: Build as .bundle (CFBundle for Resolume)
        set_target_properties(${PLUGIN_NAME} PROPERTIES
            BUNDLE TRUE
            BUNDLE_EXTENSION "bundle"
            MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/cmake/MacOSXBundleInfo.plist.in
            MACOSX_BUNDLE_BUNDLE_NAME ${PLUGIN_NAME}
            MACOSX_BUNDLE_GUI_IDENTIFIER "com.strangeloopstudios.${PLUGIN_NAME}"
            MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}"
            MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}"
            # Build universal binary (Intel + Apple Silicon)
            OSX_ARCHITECTURES "x86_64;arm64"
        )
        # Export symbols for FFGL host
        target_link_options(${PLUGIN_NAME} PRIVATE -exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffgl_exports.txt)
    elseif(WIN32)
        # Windows: Build as .dll with module definition file
        set_target_properties(${PLUGIN_NAME} PROPERTIES
            SUFFIX ".dll"
        )
        target_sources(${PLUGIN_NAME} PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}/build/windows/FFGLPlugins.def
        )
    endif()

    # Output to binaries directory
    set_target_properties(${PLUGIN_NAME} PROPERTIES
        LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/binaries
        RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/binaries
    )
endfunction()

# ============================================================================
# All 24 FlyLo LAYER3 Plugins
# ============================================================================

# GPU Visual Effects
add_ffgl_plugin(FlyLoFeedback)
add_ffgl_plugin(FlyLoFractal)
add_ffgl_plugin(FlyLoFractalTunnel)
add_ffgl_plugin(FlyLoGridMorph)
add_ffgl_plugin(FlyLoLinework)
add_ffgl_plugin(FlyLoMirror)
add_ffgl_plugin(FlyLoOrganic)
add_ffgl_plugin(FlyLoParticles)
add_ffgl_plugin(FlyLoSilhouette)
add_ffgl_plugin(FlyLoTunnel)

# Void Series
add_ffgl_plugin(FlyLoVoidBio)
add_ffgl_plugin(FlyLoVoidCathedral)
add_ffgl_plugin(FlyLoVoidLattice)
add_ffgl_plugin(FlyLoVoidNerve)
add_ffgl_plugin(FlyLoVoidscape)

# Blob Tracking
add_ffgl_plugin(FlyLoBlobWarp)
add_ffgl_plugin(FlyLoBlobCosmic)
add_ffgl_plugin(FlyLoBlobFeedback)
add_ffgl_plugin(FlyLoBlobNeural)
add_ffgl_plugin(FlyLoBlobAura)

# Camera FX
add_ffgl_plugin(FlyLoASCII)
add_ffgl_plugin(FlyLoPixelSort)
add_ffgl_plugin(FlyLoVHS)
add_ffgl_plugin(FlyLoCRT)

# Blob Tracker (standalone with overlay visualization)
add_ffgl_plugin(FlyLoBlobTracker)

# Laser Trace (edge-following laser pattern, strobe, HSV)
add_ffgl_plugin(FlyLoLaserTrace)

# Filament (constellation of glowing nodes + chromatic strands)
add_ffgl_plugin(FlyLoFilament)
