cmake_minimum_required(VERSION 3.22)
project(Monolith VERSION 0.6.6 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "Minimum macOS")
add_subdirectory(third_party/JUCE EXCLUDE_FROM_ALL)


add_library(monolith_engine STATIC native/Engine.cpp native/CabinetSlot.cpp)
target_include_directories(monolith_engine PUBLIC native)
target_link_libraries(monolith_engine PUBLIC juce::juce_dsp juce::juce_audio_formats)
target_compile_definitions(monolith_engine PUBLIC JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0
    JUCE_VST3_CAN_REPLACE_VST2=0)
set_target_properties(monolith_engine PROPERTIES POSITION_INDEPENDENT_CODE ON)

juce_add_plugin(Monolith
    COMPANY_NAME "Nullforge" BUNDLE_ID "audio.nullforge.monolith"
    PLUGIN_MANUFACTURER_CODE Nlfg PLUGIN_CODE Mnlt
    FORMATS AU VST3 Standalone PRODUCT_NAME "Monolith"
    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
    MICROPHONE_PERMISSION_ENABLED TRUE
    MICROPHONE_PERMISSION_TEXT "Monolith processes your guitar input."
    AU_MAIN_TYPE kAudioUnitType_Effect VST3_CATEGORIES Fx Distortion)
juce_add_binary_data(MonolithAssets SOURCES native/assets/volcanic-teal.png
    native/assets/monolith-front-lighting.png
    native/presets/sovereign.monolith native/presets/riftbreaker.monolith
    native/presets/iron-verdict.monolith native/presets/grave-current.monolith native/presets/drive-it-deep.monolith)
target_link_libraries(Monolith PRIVATE MonolithAssets)
target_sources(Monolith PRIVATE native/Processor.cpp native/Editor.cpp native/AmpArtwork.cpp native/FactoryPresets.cpp)
target_link_libraries(Monolith PRIVATE monolith_engine juce::juce_audio_utils
    PUBLIC juce::juce_recommended_config_flags juce::juce_recommended_warning_flags)

juce_add_console_app(monolith_check PRODUCT_NAME "Monolith engine checks")
target_sources(monolith_check PRIVATE native/EngineCheck.cpp)
target_link_libraries(monolith_check PRIVATE monolith_engine)
enable_testing()
add_test(NAME engine COMMAND monolith_check)
juce_add_console_app(monolith_host_check PRODUCT_NAME "Monolith host checks")
target_sources(monolith_host_check PRIVATE native/HostCheck.cpp)
target_link_libraries(monolith_host_check PRIVATE Monolith monolith_engine juce::juce_audio_utils)
add_test(NAME host_state COMMAND monolith_host_check)
juce_add_console_app(monolith_cabinet_check PRODUCT_NAME "Monolith cabinet checks")
target_sources(monolith_cabinet_check PRIVATE native/CabinetCheck.cpp)
target_link_libraries(monolith_cabinet_check PRIVATE monolith_engine)
add_test(NAME custom_cabinets COMMAND monolith_cabinet_check)

juce_add_console_app(monolith_feature_check PRODUCT_NAME "Monolith feature checks")
target_sources(monolith_feature_check PRIVATE native/FeatureCheck.cpp)
target_link_libraries(monolith_feature_check PRIVATE monolith_engine)
add_test(NAME metal_space_visuals COMMAND monolith_feature_check)

juce_add_console_app(monolith_reverb_check PRODUCT_NAME "Monolith reverb checks")
target_sources(monolith_reverb_check PRIVATE native/ReverbCheck.cpp)
target_link_libraries(monolith_reverb_check PRIVATE monolith_engine)
add_test(NAME reverb COMMAND monolith_reverb_check)

juce_add_console_app(monolith_pitch_check PRODUCT_NAME "Monolith pitch checks")
target_sources(monolith_pitch_check PRIVATE native/PitchCheck.cpp)
target_link_libraries(monolith_pitch_check PRIVATE monolith_engine)
add_test(NAME transpose COMMAND monolith_pitch_check)

juce_add_console_app(monolith_artwork_check PRODUCT_NAME "Monolith artwork checks")
target_sources(monolith_artwork_check PRIVATE native/ArtworkCheck.cpp)
target_link_libraries(monolith_artwork_check PRIVATE Monolith juce::juce_audio_utils)
add_test(NAME rendered_artwork COMMAND monolith_artwork_check)
