cmake_minimum_required(VERSION 3.22)
project(SAK_IRON VERSION 0.3.0 LANGUAGES C CXX)
option(SAK_BUILD_PLUGIN "Build VST3 and standalone" ON)
option(SAK_BUILD_TESTS "Build production DSP and host integration tests" ON)
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(sakiron_dsp INTERFACE)
target_include_directories(sakiron_dsp INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/Source")
if(MSVC)
  target_compile_options(sakiron_dsp INTERFACE /W4 /permissive- /fp:precise)
else()
  target_compile_options(sakiron_dsp INTERFACE -Wall -Wextra -Wpedantic)
endif()
if(SAK_BUILD_TESTS)
  add_executable(iron_regression tests/regression.cpp)
  target_link_libraries(iron_regression PRIVATE sakiron_dsp)
  add_test(NAME dsp_regression COMMAND iron_regression)
  add_library(iron_bridge SHARED tests/bridge.cpp)
  target_link_libraries(iron_bridge PRIVATE sakiron_dsp)
  add_library(iron_calibration_bridge SHARED tests/bridge.cpp)
  target_link_libraries(iron_calibration_bridge PRIVATE sakiron_dsp)
  target_compile_definitions(iron_calibration_bridge PRIVATE SAKIRON_CALIBRATION_PASS=1)
  add_library(iron_lf_lab SHARED tests/lf_lab.cpp)
  target_link_libraries(iron_lf_lab PRIVATE sakiron_dsp)
  add_library(iron_ssl_candidates SHARED tests/ssl_candidates.cpp)
  target_link_libraries(iron_ssl_candidates PRIVATE sakiron_dsp)
  add_executable(iron_ssl_circuit_tests tests/ssl_circuit_tests.cpp)
  target_link_libraries(iron_ssl_circuit_tests PRIVATE sakiron_dsp)
  add_test(NAME ssl_driven_circuit_invariants COMMAND iron_ssl_circuit_tests)
endif()
if(SAK_BUILD_PLUGIN)
  if(NOT EXISTS "${SAK_JUCE_DIR}/CMakeLists.txt")
    message(FATAL_ERROR "Set SAK_JUCE_DIR to JUCE source, or SAK_BUILD_PLUGIN=OFF for DSP validation only.")
  endif()
  add_subdirectory("${SAK_JUCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/JUCE" EXCLUDE_FROM_ALL)
  juce_add_plugin(SAKIron
    COMPANY_NAME "SAK Audio" BUNDLE_ID "audio.sak.iron"
    PLUGIN_MANUFACTURER_CODE Saka PLUGIN_CODE Saki
    PRODUCT_NAME "SAK-IRON" DESCRIPTION "Driven analog path and magnetic saturation"
    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 Distortion)
  juce_generate_juce_header(SAKIron)
  juce_add_binary_data(SAKIronAssets SOURCES assets/sak_iron_fascia.png
    assets/sak_iron_knob.png assets/sak_iron_selector.png)
  target_sources(SAKIron PRIVATE Source/PluginProcessor.cpp Source/PluginProcessor.h
    Source/PluginEditor.cpp Source/PluginEditor.h)
  target_compile_definitions(SAKIron PUBLIC JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0)
  target_link_libraries(SAKIron PRIVATE sakiron_dsp juce::juce_audio_utils juce::juce_dsp
    PUBLIC SAKIronAssets juce::juce_recommended_config_flags)
  if(SAK_BUILD_TESTS)
    add_executable(iron_plugin_tests tests/plugin_smoke.cpp)
    target_link_libraries(iron_plugin_tests PRIVATE SAKIron sakiron_dsp)
    target_include_directories(iron_plugin_tests PRIVATE "${SAK_JUCE_DIR}/modules"
      "${CMAKE_CURRENT_BINARY_DIR}/SAKIron_artefacts/JuceLibraryCode")
    target_compile_definitions(iron_plugin_tests PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
    add_test(NAME plugin_state_and_audio COMMAND iron_plugin_tests)
    # Load the actual VST3 through an independent JUCE host, exercising the
    # format wrapper and host-visible latency/state rather than only the class.
    add_executable(iron_host_tests tests/vst3_host.cpp)
    target_link_libraries(iron_host_tests PRIVATE sakiron_dsp juce::juce_audio_utils
      PUBLIC juce::juce_recommended_config_flags)
    target_compile_definitions(iron_host_tests PRIVATE JUCE_PLUGINHOST_VST3=1
      JUCE_PLUGINHOST_VST=0 JUCE_PLUGINHOST_AU=0 JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0)
    add_test(NAME actual_vst3_host COMMAND iron_host_tests
      "${CMAKE_CURRENT_BINARY_DIR}/SAKIron_artefacts/$<CONFIG>/VST3/SAK-IRON.vst3"
      "${CMAKE_CURRENT_BINARY_DIR}/host_validation.json")
  endif()
endif()
