cmake_minimum_required(VERSION 3.22)
project(DOA303 VERSION 1.1.2)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum macOS version")

# Use a local JUCE checkout if given (-DJUCE_DIR=/path/to/JUCE), otherwise download it.
if(DEFINED JUCE_DIR)
    add_subdirectory(${JUCE_DIR} JUCE)
else()
    include(FetchContent)
    FetchContent_Declare(JUCE
        GIT_REPOSITORY https://github.com/juce-framework/JUCE.git
        GIT_TAG        8.0.4
        GIT_SHALLOW    TRUE)
    FetchContent_MakeAvailable(JUCE)
endif()

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

juce_add_plugin(DOA303
    COMPANY_NAME             "Design On Acid"
    PRODUCT_NAME             "DOA303"
    BUNDLE_ID                "com.designonacid.doa303"
    PLUGIN_MANUFACTURER_CODE Acdl
    PLUGIN_CODE              Sqlc
    IS_SYNTH                 TRUE
    NEEDS_MIDI_INPUT         TRUE
    NEEDS_MIDI_OUTPUT        FALSE
    IS_MIDI_EFFECT           FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    VST3_CATEGORIES          Instrument Synth
    AU_MAIN_TYPE             kAudioUnitType_MusicDevice
    COPY_PLUGIN_AFTER_BUILD  FALSE
    FORMATS                  ${DOA303_FORMATS})

juce_add_binary_data(DOA303Brand SOURCES Assets/DOA.svg)

target_sources(DOA303 PRIVATE
    Source/PluginProcessor.cpp
    Source/PluginEditor.cpp)

target_include_directories(DOA303 PRIVATE Source)

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

target_link_libraries(DOA303
    PRIVATE
        DOA303Brand
        juce::juce_audio_utils
    PUBLIC
        juce::juce_recommended_config_flags
        juce::juce_recommended_lto_flags
        juce::juce_recommended_warning_flags)

# Optional headless test: renders audio through the full plugin and snapshots the UI
option(DOA303_BUILD_TESTS "Build the plugin smoke test" OFF)
if(DOA303_BUILD_TESTS)
    add_executable(DOA303SmokeTest tests/smoke_test.cpp)
    target_include_directories(DOA303SmokeTest PRIVATE Source $<TARGET_PROPERTY:DOA303,INCLUDE_DIRECTORIES>)
    target_compile_definitions(DOA303SmokeTest PRIVATE $<TARGET_PROPERTY:DOA303,COMPILE_DEFINITIONS>)
    target_link_libraries(DOA303SmokeTest PRIVATE DOA303 juce::juce_recommended_config_flags)
endif()

include(CTest)
if(BUILD_TESTING)
    add_executable(DOA303DspTest tests/dsp_test.cpp)
    add_test(NAME DSP COMMAND DOA303DspTest)
endif()
