cmake_minimum_required(VERSION 3.15)
project(FreeEQ8 VERSION 2.3.1)

set(CMAKE_CXX_STANDARD 17)

# Universal binary for macOS (Intel + Apple Silicon)
if(APPLE)
    set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "Build universal binary")
    set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum macOS version")
endif()

# ---- JUCE ----
# Option A: JUCE as submodule in ./JUCE (recommended)
#   git submodule add https://github.com/juce-framework/JUCE.git JUCE
# Option B: Point JUCE_DIR to your local JUCE folder:
#   cmake -DJUCE_DIR=/path/to/JUCE ..
#
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/JUCE/CMakeLists.txt")
  add_subdirectory(JUCE)
elseif (DEFINED JUCE_DIR AND EXISTS "${JUCE_DIR}/CMakeLists.txt")
  add_subdirectory("${JUCE_DIR}" JUCE)
else()
  message(FATAL_ERROR "JUCE not found. Add as submodule in ./JUCE or pass -DJUCE_DIR=/path/to/JUCE")
endif()

juce_add_plugin(FreeEQ8
    COMPANY_NAME "TizWildinEntertainment"
    IS_SYNTH FALSE
    NEEDS_MIDI_INPUT FALSE
    NEEDS_MIDI_OUTPUT FALSE
    IS_MIDI_EFFECT FALSE
    COPY_PLUGIN_AFTER_BUILD TRUE
    PLUGIN_MANUFACTURER_CODE TzWd
    PLUGIN_CODE FEQ8
    FORMATS VST3 AU Standalone
    # juce_vst3_helper.exe loads the built plugin to emit moduleinfo.json and
    # has been observed hanging indefinitely on Windows CI. The manifest is
    # optional metadata, so skip generating it during the build.
    VST3_AUTO_MANIFEST FALSE
    PRODUCT_NAME "FreeEQ8"
    BUNDLE_ID "com.tizwildinentertainment.freeeq8"
    COMPANY_URL "https://github.com/GareBear99/FreeEQ8"
    COMPANY_EMAIL "GareBear99@users.noreply.github.com"
    DESCRIPTION "Professional 8-Band Parametric EQ"
)

target_sources(FreeEQ8 PRIVATE
    Source/PluginProcessor.cpp
    Source/PluginProcessor.h
    Source/PluginEditor.cpp
    Source/PluginEditor.h
    Source/Config.h
    Source/UpdateChecker.h
    Source/LicenseValidator.h
    Source/DSP/Biquad.h
    Source/DSP/SvfBiquad.h
    Source/DSP/SvfBandArray.h
    Source/DSP/NaturalPhaseEngine.h
    Source/DSP/EQBand.h
    Source/DSP/SpectrumFIFO.h
    Source/DSP/LinearPhaseEngine.h
    Source/DSP/MatchEQ.h
    Source/DSP/ResonanceDetector.h
    Source/DSP/IntentMode.h
    Source/DSP/FrequencyExplainer.h
    Source/UI/ResponseCurveComponent.h
    Source/UI/ResponseCurveComponent.cpp
    Source/UI/LevelMeter.h
    Source/Presets/PresetManager.h
    Source/Presets/PresetManager.cpp
)

target_compile_definitions(FreeEQ8 PRIVATE
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=0
    JUCE_VST3_CAN_REPLACE_VST2=0
)

target_link_libraries(FreeEQ8 PRIVATE
    juce::juce_audio_utils
    juce::juce_dsp
    juce::juce_cryptography
)

# ── ProEQ8 commercial target
juce_add_plugin(ProEQ8
    COMPANY_NAME "TizWildinEntertainment"
    IS_SYNTH FALSE
    NEEDS_MIDI_INPUT FALSE
    NEEDS_MIDI_OUTPUT FALSE
    IS_MIDI_EFFECT FALSE
    COPY_PLUGIN_AFTER_BUILD TRUE
    PLUGIN_MANUFACTURER_CODE TzWd
    PLUGIN_CODE PEQ8
    FORMATS VST3 AU
    VST3_AUTO_MANIFEST FALSE
    PRODUCT_NAME "ProEQ8"
    BUNDLE_ID "com.tizwildinentertainment.proeq8"
    COMPANY_URL "https://github.com/GareBear99/FreeEQ8"
    COMPANY_EMAIL "GareBear99@users.noreply.github.com"
    DESCRIPTION "Professional 24-Band Parametric EQ"
)

target_sources(ProEQ8 PRIVATE
    Source/PluginProcessor.cpp
    Source/PluginProcessor.h
    Source/PluginEditor.cpp
    Source/PluginEditor.h
    Source/Config.h
    Source/UpdateChecker.h
    Source/LicenseValidator.h
    Source/DSP/Biquad.h
    Source/DSP/SvfBiquad.h
    Source/DSP/SvfBandArray.h
    Source/DSP/NaturalPhaseEngine.h
    Source/DSP/EQBand.h
    Source/DSP/SpectrumFIFO.h
    Source/DSP/LinearPhaseEngine.h
    Source/DSP/MatchEQ.h
    Source/DSP/ResonanceDetector.h
    Source/DSP/IntentMode.h
    Source/DSP/FrequencyExplainer.h
    Source/UI/ResponseCurveComponent.h
    Source/UI/ResponseCurveComponent.cpp
    Source/UI/LevelMeter.h
    Source/Presets/PresetManager.h
    Source/Presets/PresetManager.cpp
)

target_compile_definitions(ProEQ8 PRIVATE
    PROEQ8=1
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=1
    JUCE_VST3_CAN_REPLACE_VST2=0
)

target_link_libraries(ProEQ8 PRIVATE
    juce::juce_audio_utils
    juce::juce_dsp
    juce::juce_cryptography
)

# ProEQ8 enables JUCE_USE_CURL=1 for license activation. On Linux, juce_core
# resolves its networking through libcurl, so the library must be linked
# explicitly or the VST3 target fails with undefined `curl_*` references.
# macOS and Windows use native networking APIs, where JUCE_USE_CURL is a no-op.
if(UNIX AND NOT APPLE)
    find_package(CURL REQUIRED)
    target_link_libraries(ProEQ8 PRIVATE CURL::libcurl)
endif()

# ── Optional test target (standalone, no JUCE dependency) ────────────
option(FREEEQ8_BUILD_TESTS "Build unit tests" OFF)

if (FREEEQ8_BUILD_TESTS)
    add_executable(FreeEQ8_Tests Tests/BiquadTest.cpp)
    target_compile_features(FreeEQ8_Tests PRIVATE cxx_std_17)

    # Shelf regression guards. Both are standalone (Biquad.h pulls only
    # <cmath>/<algorithm>) and return non-zero on failure, so CI fails loudly if
    # the shelf coefficient domain error ever reappears.
    add_executable(FreeEQ8_ShelfNaNSweep Tests/ShelfNaNSweepTest.cpp)
    target_compile_features(FreeEQ8_ShelfNaNSweep PRIVATE cxx_std_17)

    add_executable(FreeEQ8_ShelfResponse Tests/ShelfResponseTest.cpp)
    target_compile_features(FreeEQ8_ShelfResponse PRIVATE cxx_std_17)

    add_executable(FreeEQ8_AuditTests Tests/AuditRegressionTest.cpp)
    target_compile_features(FreeEQ8_AuditTests PRIVATE cxx_std_17)
    find_package(Threads REQUIRED)
    target_link_libraries(FreeEQ8_AuditTests PRIVATE Threads::Threads)
endif()
