cmake_minimum_required(VERSION 3.22)
project(SAK_BUS VERSION 0.1.1 LANGUAGES C CXX)
option(SAK_BUILD_PLUGIN "Build VST3 and standalone" ON)
option(SAK_BUILD_TESTS "Build the production DSP measurement suite" ON)
option(SAK_MEASUREMENTS_IN_CTEST "Run Python plots/reference baselines as part of CTest" OFF)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/JUCE/CMakeLists.txt")
  set(SAK_JUCE_DEFAULT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/JUCE")
else()
  set(SAK_JUCE_DEFAULT "C:/JUCE")
endif()
set(SAK_JUCE_DIR "${SAK_JUCE_DEFAULT}" CACHE PATH "JUCE 8 source directory")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
enable_testing()
add_library(sakbus_dsp INTERFACE)
target_include_directories(sakbus_dsp INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/SAK-BUS/Source" "${CMAKE_CURRENT_SOURCE_DIR}/shared")
if(MSVC)
  target_compile_options(sakbus_dsp INTERFACE /W4 /permissive- /fp:precise)
else()
  target_compile_options(sakbus_dsp INTERFACE -Wall -Wextra -Wpedantic)
endif()
if(SAK_BUILD_TESTS)
  add_executable(sakbus_regression tests/regression.cpp)
  target_link_libraries(sakbus_regression PRIVATE sakbus_dsp)
  add_test(NAME dsp_regression COMMAND sakbus_regression)
  add_library(sakbus_bridge SHARED tests/bridge.cpp)
  target_link_libraries(sakbus_bridge PRIVATE sakbus_dsp)
  add_library(sakbus_magnetic_fit SHARED tests/magnetic_fit_bridge.cpp)
  target_link_libraries(sakbus_magnetic_fit PRIVATE sakbus_dsp)
  if(SAK_MEASUREMENTS_IN_CTEST)
    find_package(Python3 COMPONENTS Interpreter REQUIRED)
    add_test(NAME measured_reference_and_regression
      COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tools/measure.py"
        --bridge $<TARGET_FILE:sakbus_bridge> --output "${CMAKE_CURRENT_BINARY_DIR}/measurements" --verify)
  endif()
endif()
if(SAK_BUILD_PLUGIN)
  if(NOT EXISTS "${SAK_JUCE_DIR}/CMakeLists.txt")
    message(FATAL_ERROR "Set SAK_JUCE_DIR to your JUCE source checkout; SAK_BUILD_PLUGIN=OFF builds only DSP measurements.")
  endif()
  add_subdirectory("${SAK_JUCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/JUCE" EXCLUDE_FROM_ALL)
  juce_add_plugin(SAKBus
    COMPANY_NAME "SAK Audio" BUNDLE_ID "audio.sak.bus"
    PLUGIN_MANUFACTURER_CODE Saka PLUGIN_CODE Sakb
    PRODUCT_NAME "SAK-BUS" DESCRIPTION "Stereo analog bus compressor"
    FORMATS VST3 Standalone IS_SYNTH FALSE NEEDS_MIDI_INPUT FALSE
    NEEDS_MIDI_OUTPUT FALSE IS_MIDI_EFFECT FALSE EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    COPY_PLUGIN_AFTER_BUILD FALSE VST3_CATEGORIES Fx Dynamics)
  juce_generate_juce_header(SAKBus)
  juce_add_binary_data(SAKBusAssets SOURCES SAK-BUS/assets/sak_bus_fascia.png SAK-BUS/assets/sak_bus_knob.png)
  target_sources(SAKBus PRIVATE SAK-BUS/Source/PluginProcessor.cpp SAK-BUS/Source/PluginProcessor.h SAK-BUS/Source/PluginEditor.cpp SAK-BUS/Source/PluginEditor.h)
  target_compile_definitions(SAKBus PUBLIC JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0)
  target_link_libraries(SAKBus PRIVATE sakbus_dsp juce::juce_audio_utils juce::juce_dsp
    PUBLIC SAKBusAssets juce::juce_recommended_config_flags)
  if(SAK_BUILD_TESTS)
    add_executable(sakbus_plugin_tests tests/plugin_smoke.cpp)
    target_link_libraries(sakbus_plugin_tests PRIVATE SAKBus sakbus_dsp)
    target_include_directories(sakbus_plugin_tests PRIVATE "${SAK_JUCE_DIR}/modules" "${CMAKE_CURRENT_BINARY_DIR}/SAKBus_artefacts/JuceLibraryCode")
    target_compile_definitions(sakbus_plugin_tests PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
    add_test(NAME plugin_state_and_audio COMMAND sakbus_plugin_tests)
  endif()
endif()
