cmake_minimum_required(VERSION 3.22)
project(Ambivalence VERSION 1.1.0 LANGUAGES C CXX)
# ============================================================================
# C++20
# ============================================================================
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ============================================================================
# JUCE
#   Pass the path to your JUCE checkout with -DJUCE_PATH=/path/to/JUCE,
#   or install JUCE in one of the standard locations below.
# ============================================================================
if(NOT DEFINED JUCE_PATH OR JUCE_PATH STREQUAL "")
    foreach(_juce_candidate
        ${CMAKE_CURRENT_SOURCE_DIR}/JUCE
        ${CMAKE_BINARY_DIR}/JUCE
        ${CMAKE_HOME_DIRECTORY}/../JUCE
        $ENV{HOME}/JUCE
        /opt/JUCE
        /usr/local/JUCE
        /Applications/JUCE)
        if(EXISTS "${_juce_candidate}/modules/juce_core")
            set(JUCE_PATH "${_juce_candidate}")
            break()
        endif()
    endforeach()
endif()
if(NOT JUCE_PATH)
    message(FATAL_ERROR
        "JUCE not found. Set -DJUCE_PATH=/path/to/JUCE or install JUCE in a standard location.")
endif()
set(JUCE_PATH "${JUCE_PATH}" CACHE PATH "Path to the JUCE repository" FORCE)
set(_juce_binary_dir "${CMAKE_BINARY_DIR}/JUCE")
if(_juce_binary_dir STREQUAL "${JUCE_PATH}")
    set(_juce_binary_dir "${CMAKE_BINARY_DIR}/JUCE-build")
endif()
add_subdirectory(${JUCE_PATH} ${_juce_binary_dir})
# ============================================================================
# plugin definition
# ============================================================================
juce_add_plugin(Ambivalence
    COMPANY_NAME            "OTODESK"
    PLUGIN_MANUFACTURER_CODE "Otdk"
    PLUGIN_CODE             "Ambi"
    FORMATS                 VST3 Standalone
    PRODUCT_NAME            "Ambivalence1.1"
    PLUGIN_DESCRIPTION      "16-channel FDN Algorithmic Reverb"
    IS_SYNTH                FALSE
    NEEDS_MIDI_INPUT        FALSE
    NEEDS_MIDI_OUTPUT       FALSE
    IS_MIDI_EFFECT          FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    VST3_AUTO_MANIFEST      FALSE
    COPY_PLUGIN_AFTER_BUILD FALSE
    VERSION                 "1.1.0"
)
# ============================================================================
# build info (Git branch, commit, dirty state)
# ============================================================================
execute_process(COMMAND git rev-parse --abbrev-ref HEAD
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE AMBIVALENCE_GIT_BRANCH
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET)
if(NOT AMBIVALENCE_GIT_BRANCH)
    set(AMBIVALENCE_GIT_BRANCH "unknown")
endif()

execute_process(COMMAND git rev-parse --short HEAD
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE AMBIVALENCE_GIT_COMMIT
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET)
if(NOT AMBIVALENCE_GIT_COMMIT)
    set(AMBIVALENCE_GIT_COMMIT "unknown")
endif()

execute_process(COMMAND git status --porcelain
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE AMBIVALENCE_GIT_STATUS
    ERROR_QUIET)
if(AMBIVALENCE_GIT_STATUS)
    set(AMBIVALENCE_GIT_DIRTY 1)
else()
    set(AMBIVALENCE_GIT_DIRTY 0)
endif()

configure_file(Source/BuildInfo.h.in ${CMAKE_CURRENT_BINARY_DIR}/BuildInfo.h @ONLY)
# ============================================================================
# sources (only existing files)
# ============================================================================
target_sources(Ambivalence PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}/BuildInfo.h
    Source/BuildInfo.h.in
    Source/PluginProcessor.h
    Source/PluginProcessor.cpp
    Source/PluginEditor.h
    Source/PluginEditor.cpp
    Source/PluginParameters.h
    Source/PluginParameters.cpp
    Source/PresetManager.h
    Source/PresetManager.cpp
    Source/GUI/AmbivalenceUI.h
    Source/GUI/AmbivalenceUI.cpp
    Source/AlgorithmPresets.h
    Source/DSP/DSPConstants.h
    Source/DSP/DelayMemory.h
    Source/DSP/BiquadFilters.h
    Source/DSP/BiquadFilters.cpp
    Source/DSP/MagnitudeResponseFitter.h
    Source/DSP/MagnitudeResponseFitter.cpp
    Source/DSP/UniversalEngine.h
    Source/DSP/UniversalEngine.cpp
    Source/DSP/AcousticMetrics.h
    Source/DSP/AcousticMetrics.cpp
    Source/GUI/DecayCurveViz.h
    Source/GUI/DecayCurveViz.cpp
    Source/DSP/Saturator.h
    Source/DSP/OutputLimiter.h
    Source/DSP/OutputEQ.h
)# ============================================================================
# include paths
# ============================================================================
target_include_directories(Ambivalence PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/Source
    ${CMAKE_CURRENT_SOURCE_DIR}/Source/DSP
    ${CMAKE_CURRENT_SOURCE_DIR}/Source/GUI
    ${CMAKE_CURRENT_BINARY_DIR}
)
# ============================================================================
# JUCE
# ============================================================================
target_link_libraries(Ambivalence
    PRIVATE
        juce::juce_audio_basics
        juce::juce_audio_devices
        juce::juce_audio_formats
        juce::juce_audio_plugin_client
        juce::juce_audio_processors
        juce::juce_audio_utils
        juce::juce_core
        juce::juce_data_structures
        juce::juce_dsp
        juce::juce_events
        juce::juce_graphics
        juce::juce_gui_basics
        juce::juce_gui_extra
    PUBLIC
        juce::juce_recommended_config_flags
        juce::juce_recommended_lto_flags
        juce::juce_recommended_warning_flags
)
# ============================================================================
# compile definitions
# ============================================================================
target_compile_definitions(Ambivalence PRIVATE
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=0
    JUCE_VST3_CAN_REPLACE_VST2=0
    JUCE_DISPLAY_SPLASH_SCREEN=0
    AMBIVALENCE_VERSION="1.1.0"
)
# ============================================================================
# JUCE header generation
# ============================================================================
juce_generate_juce_header(Ambivalence)
# ============================================================================
# build message
# ============================================================================
message(STATUS "===========================================")
message(STATUS "Ambivalence VST3 - CMake Configuration")
message(STATUS "JUCE: ${JUCE_PATH}")
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
message(STATUS "===========================================")