cmake_minimum_required(VERSION 3.22)
set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0" CACHE STRING "Minimum macOS")
set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "Release architecture")
project(Petal VERSION 1.3.0 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(JUCE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../work/JUCE" CACHE PATH "JUCE source checkout")
add_subdirectory("${JUCE_PATH}" "${CMAKE_BINARY_DIR}/JUCE" EXCLUDE_FROM_ALL)
juce_add_plugin(Petal
    COMPANY_NAME "Pep Instruments"
    BUNDLE_ID "studio.pep.petal"
    PLUGIN_MANUFACTURER_CODE Peps
    PLUGIN_CODE Peta
    FORMATS AU Standalone
    PRODUCT_NAME "Petal"
    DESCRIPTION "An expressive chord instrument"
    IS_SYNTH TRUE
    NEEDS_MIDI_INPUT TRUE
    NEEDS_MIDI_OUTPUT FALSE
    IS_MIDI_EFFECT FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS TRUE
    COPY_PLUGIN_AFTER_BUILD FALSE
    AU_SANDBOX_SAFE TRUE
    MICROPHONE_PERMISSION_ENABLED FALSE
    AU_MAIN_TYPE kAudioUnitType_MusicDevice)
target_sources(Petal PRIVATE Source/PluginProcessor.cpp Source/PluginEditor.cpp)
target_compile_definitions(Petal PUBLIC JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0 JUCE_DISPLAY_SPLASH_SCREEN=0)
target_link_libraries(Petal PUBLIC juce::juce_audio_utils PRIVATE juce::juce_recommended_config_flags juce::juce_recommended_warning_flags)
add_executable(ChordTests Tests/ChordTests.cpp)
target_include_directories(ChordTests PRIVATE Source)
target_compile_options(ChordTests PRIVATE -UNDEBUG)
enable_testing()
add_test(NAME ChordTests COMMAND ChordTests)
add_executable(SynthTests Tests/SynthTests.cpp)
target_include_directories(SynthTests PRIVATE Source)
target_compile_options(SynthTests PRIVATE -UNDEBUG)
add_test(NAME SynthTests COMMAND SynthTests)
juce_add_console_app(ProcessorTests PRODUCT_NAME "Petal Processor Tests")
target_sources(ProcessorTests PRIVATE Tests/ProcessorTests.cpp)
target_include_directories(ProcessorTests PRIVATE Source)
target_link_libraries(ProcessorTests PRIVATE Petal)
add_test(NAME ProcessorTests COMMAND ProcessorTests)
juce_add_console_app(PadTests PRODUCT_NAME "Petal Pad Tests")
target_sources(PadTests PRIVATE Tests/PadTests.cpp)
target_include_directories(PadTests PRIVATE Source)
target_link_libraries(PadTests PRIVATE Petal)
add_test(NAME PadTests COMMAND PadTests)
juce_add_console_app(KnobTests PRODUCT_NAME "Petal Knob Tests")
target_sources(KnobTests PRIVATE Tests/KnobTests.cpp)
target_include_directories(KnobTests PRIVATE Source)
target_link_libraries(KnobTests PRIVATE Petal)
add_test(NAME KnobTests COMMAND KnobTests)

# Controller profile/state round trips and MIDI lifecycle regressions.
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/Tests/ControllerTests.cpp")
    juce_add_console_app(ControllerTests PRODUCT_NAME "Petal Controller Tests")
    target_sources(ControllerTests PRIVATE Tests/ControllerTests.cpp)
    target_include_directories(ControllerTests PRIVATE Source)
    target_link_libraries(ControllerTests PRIVATE Petal)
    add_test(NAME ControllerTests COMMAND ControllerTests)
endif()

# Explicit offscreen UI checks and review images; not a background CTest job.
juce_add_console_app(ControllerUiTests PRODUCT_NAME "Petal Controller UI Tests")
target_sources(ControllerUiTests PRIVATE Tests/ControllerUiTests.cpp)
target_include_directories(ControllerUiTests PRIVATE Source)
target_compile_definitions(ControllerUiTests PRIVATE CONTROLLER_UI_PETAL=1)
target_link_libraries(ControllerUiTests PRIVATE Petal)
