cmake_minimum_required(VERSION 3.22)

project(EMiXvst VERSION 0.2.17 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

include(FetchContent)
FetchContent_Declare(
    JUCE
    GIT_REPOSITORY https://github.com/juce-framework/JUCE.git
    GIT_TAG 9.0.2
    GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(JUCE)

set(EMIXVST_FORMATS VST3 Standalone)
if(APPLE)
    list(APPEND EMIXVST_FORMATS AU)
endif()

juce_add_plugin(EMiXvst
    COMPANY_NAME "EMiX"
    BUNDLE_ID "com.emix.emixvst"
    PLUGIN_MANUFACTURER_CODE Emix
    PLUGIN_CODE EmxV
    FORMATS ${EMIXVST_FORMATS}
    PRODUCT_NAME "EMiXvst"
    DESCRIPTION "EMX-inspired synth sound engine"
    IS_SYNTH TRUE
    NEEDS_MIDI_INPUT TRUE
    NEEDS_MIDI_OUTPUT FALSE
    IS_MIDI_EFFECT FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    COPY_PLUGIN_AFTER_BUILD FALSE
    VST3_CATEGORIES Instrument Synth
    AU_MAIN_TYPE kAudioUnitType_MusicDevice
)

# Generate JuceHeader.h for source files that include <JuceHeader.h>.
# JUCE CMake projects do not create this compatibility header unless asked.
juce_generate_juce_header(EMiXvst)

target_sources(EMiXvst PRIVATE
    Source/PluginProcessor.cpp
    Source/PluginProcessor.h
    Source/PluginEditor.cpp
    Source/PluginEditor.h
    Source/EmxEngine.cpp
    Source/EmxEngine.h
)

target_compile_definitions(EMiXvst PUBLIC
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=0
    JUCE_VST3_CAN_REPLACE_VST2=0
)

target_link_libraries(EMiXvst PRIVATE
    juce::juce_audio_utils
    juce::juce_audio_processors
    juce::juce_dsp
    juce::juce_recommended_config_flags
    juce::juce_recommended_warning_flags
)

option(EMIX_BUILD_TESTS "Build preset and effect-routing regression checks" OFF)
if(EMIX_BUILD_TESTS)
    enable_testing()
    add_executable(EMiXPresetTests)
    target_sources(EMiXPresetTests PRIVATE Tests/PresetTests.cpp)
    target_include_directories(EMiXPresetTests PRIVATE Source "${CMAKE_CURRENT_BINARY_DIR}/EMiXvst_artefacts/JuceLibraryCode" $<TARGET_PROPERTY:juce::juce_core,INTERFACE_INCLUDE_DIRECTORIES>)
    target_link_libraries(EMiXPresetTests PRIVATE EMiXvst)
    add_test(NAME preset_and_fx COMMAND EMiXPresetTests
        "${CMAKE_CURRENT_SOURCE_DIR}/Tests/drowning.json" "${CMAKE_CURRENT_BINARY_DIR}/test-data")
endif()
