cmake_minimum_required(VERSION 3.22)

# ============================================================================
#  NEXT GEN KICK 2  -  Pure Synthesis Kick Engine (OTODESK)
#  JUCE 8.0 系 / VST3 + Standalone
# ============================================================================
project(NextGenKick VERSION 2.0.0 LANGUAGES C CXX)

# ----------------------------------------------------------------------------
#  C++20
# ----------------------------------------------------------------------------
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ----------------------------------------------------------------------------
#  JUCE の場所
#   SampleChord 側と同じく C:/JUCE を参照します。
#   別の場所に JUCE を置いている場合は、構成時に
#       -DJUCE_PATH="D:/path/to/JUCE"
#   のように上書きできます。
# ----------------------------------------------------------------------------
set(JUCE_PATH "C:/JUCE" CACHE PATH "Path to the JUCE checkout")
add_subdirectory(${JUCE_PATH} ${CMAKE_BINARY_DIR}/JUCE)

# ----------------------------------------------------------------------------
#  プラグイン定義
# ----------------------------------------------------------------------------
juce_add_plugin(NextGenKick
    COMPANY_NAME             "OTODESK"
    PLUGIN_MANUFACTURER_CODE "Otdk"
    PLUGIN_CODE              "Ngk2"
    FORMATS                  VST3 Standalone
    PRODUCT_NAME             "NEXT GEN KICK 2"
    PLUGIN_DESCRIPTION       "Pure Synthesis Kick Engine"
    IS_SYNTH                 TRUE
    NEEDS_MIDI_INPUT         TRUE
    NEEDS_MIDI_OUTPUT        FALSE
    IS_MIDI_EFFECT           FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    VST3_AUTO_MANIFEST       FALSE
    COPY_PLUGIN_AFTER_BUILD  FALSE
    VERSION                  "2.0.0"
)

# ----------------------------------------------------------------------------
#  ソース
#   ※ 開発計画(フェーズ)に沿って Source/DSP・Source/GUI へ段階的に分割します。
#     新しい .cpp を追加したら、ここに 1 行足してください。
# ----------------------------------------------------------------------------
target_sources(NextGenKick PRIVATE
    # --- プラグインコア ---
    Source/PluginProcessor.h
    Source/PluginProcessor.cpp
    Source/FactoryPresets.cpp
    Source/PluginEditor.h
    Source/PluginEditor.cpp

    # --- DSP モジュール（アルゴリズム毎に分割）---
    Source/DSP/KickMath.h
    Source/DSP/Saturation.h
    Source/DSP/MultiEnvelope.h
    Source/DSP/AnalyzerDSP.h
    Source/DSP/AnalyzerDSP.cpp

    # --- エフェクト(FXラック骨組み。Phase2 でProcessor/GUIに接続)---
    Source/DSP/Effects/AudioEffect.h
    Source/DSP/Effects/EffectChain.h
    Source/DSP/Effects/ADAA_Saturation.h
    Source/DSP/Effects/BitCrusher.h
    Source/DSP/Effects/NoiseGenerator.h
    Source/DSP/Effects/OTT_Multiband.h
    Source/DSP/Effects/GlueCompressor.h
    Source/DSP/Effects/Limiter.h
    Source/DSP/Effects/TransientShaper.h

    # --- GUI モジュール ---
    Source/GUI/ArcLookAndFeel.h
    Source/GUI/ArcLookAndFeel.cpp
    Source/GUI/EnvelopeEditor.h
    Source/GUI/EnvelopeEditor.cpp
    Source/GUI/FxLane.h
    Source/GUI/PresetBrowser.h
    Source/GUI/SpectrumAnalyzer.h
)

# ----------------------------------------------------------------------------
#  インクルードパス
# ----------------------------------------------------------------------------
target_include_directories(NextGenKick PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/Source
    ${CMAKE_CURRENT_SOURCE_DIR}/Source/DSP
    ${CMAKE_CURRENT_SOURCE_DIR}/Source/GUI
)

# ----------------------------------------------------------------------------
#  JUCE モジュール
# ----------------------------------------------------------------------------
target_link_libraries(NextGenKick
    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
)

# ----------------------------------------------------------------------------
#  コンパイル定義
# ----------------------------------------------------------------------------
target_compile_definitions(NextGenKick PRIVATE
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=0
    JUCE_VST3_CAN_REPLACE_VST2=0
    JUCE_DISPLAY_SPLASH_SCREEN=0
    JUCE_STRICT_REFCOUNTEDPOINTER=1
    NEXTGENKICK_VERSION="2.0.0"
)

# ----------------------------------------------------------------------------
#  JUCE ヘッダー生成（#include <JuceHeader.h> を使うため）
# ----------------------------------------------------------------------------
juce_generate_juce_header(NextGenKick)

# ----------------------------------------------------------------------------
#  MSVC コンパイルオプション（SIMD/AVX2・UTF-8・最適化）
# ----------------------------------------------------------------------------
if(MSVC)
    target_compile_options(NextGenKick PRIVATE
        /arch:AVX2
        /utf-8
        /W3
        /wd4819
        $<$<CONFIG:Release>:/O2 /fp:fast>
    )
endif()

# ----------------------------------------------------------------------------
#  ビルドメッセージ
# ----------------------------------------------------------------------------
message(STATUS "===========================================")
message(STATUS " NEXT GEN KICK 2  -  CMake Configuration")
message(STATUS "  JUCE       : ${JUCE_PATH}")
message(STATUS "  Build Type : ${CMAKE_BUILD_TYPE}")
message(STATUS "===========================================")
