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(Moonharp VERSION 1.1.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(Moonharp
    COMPANY_NAME "Pep Instruments"
    BUNDLE_ID "studio.pep.moonharp"
    PLUGIN_MANUFACTURER_CODE Peps
    PLUGIN_CODE Mnhp
    FORMATS AU Standalone
    PRODUCT_NAME "Moonharp"
    DESCRIPTION "A classic electronic autoharp"
    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(Moonharp PRIVATE Source/PluginProcessor.cpp Source/PluginEditor.cpp)
target_compile_definitions(Moonharp PUBLIC JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0 JUCE_DISPLAY_SPLASH_SCREEN=0)
target_link_libraries(Moonharp PUBLIC juce::juce_audio_utils PRIVATE juce::juce_recommended_config_flags juce::juce_recommended_warning_flags)
enable_testing()
add_executable(CoreTests Tests/CoreTests.cpp)
target_include_directories(CoreTests PRIVATE Source)
target_compile_options(CoreTests PRIVATE -UNDEBUG)
add_test(NAME CoreTests COMMAND CoreTests)
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 "Moonharp Processor Tests")
target_sources(ProcessorTests PRIVATE Tests/ProcessorTests.cpp)
target_include_directories(ProcessorTests PRIVATE Source)
target_link_libraries(ProcessorTests PRIVATE Moonharp)
add_test(NAME ProcessorTests COMMAND ProcessorTests)

# 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 "Moonharp Controller Tests")
    target_sources(ControllerTests PRIVATE Tests/ControllerTests.cpp)
    target_include_directories(ControllerTests PRIVATE Source)
    target_link_libraries(ControllerTests PRIVATE Moonharp)
    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 "Moonharp Controller UI Tests")
target_sources(ControllerUiTests PRIVATE Tests/ControllerUiTests.cpp)
target_include_directories(ControllerUiTests PRIVATE Source)
target_compile_definitions(ControllerUiTests PRIVATE CONTROLLER_UI_PETAL=0)
target_link_libraries(ControllerUiTests PRIVATE Moonharp)
