cmake_minimum_required(VERSION 3.22)

project(MonoStep VERSION 1.0.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0")
set(CMAKE_OSX_ARCHITECTURES "arm64")

# --- build metadata (git info + build date) ----------------------------------
set(MONOSTEP_GIT_STRING "no-vcs")

find_package(Git QUIET)
if(Git_FOUND)
    execute_process(
        COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_LIST_DIR}" rev-parse --short HEAD
        OUTPUT_VARIABLE MONOSTEP_GIT_HASH
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET
    )
    execute_process(
        COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_LIST_DIR}" status --porcelain
        OUTPUT_VARIABLE MONOSTEP_GIT_PORCELAIN
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET
    )

    if(MONOSTEP_GIT_HASH)
        set(MONOSTEP_GIT_STRING "${MONOSTEP_GIT_HASH}")
        if(NOT MONOSTEP_GIT_PORCELAIN STREQUAL "")
            string(APPEND MONOSTEP_GIT_STRING "-dirty")
        endif()
    endif()
endif()

if(NOT DEFINED JUCE_DIR)
    set(JUCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../juce")
endif()

if(NOT EXISTS "${JUCE_DIR}/CMakeLists.txt")
    message(FATAL_ERROR "JUCE not found at ${JUCE_DIR}. Pass -DJUCE_DIR=<path> or clone it next to this project.")
endif()

add_subdirectory("${JUCE_DIR}" juce_build)

juce_add_plugin(MonoStep
    VERSION 1.0.0
    COMPANY_NAME "armin"
    BUNDLE_ID "com.armin.monostep"
    FORMATS VST3
    PRODUCT_NAME "MonoStep"
    PLUGIN_MANUFACTURER_CODE Armn
    PLUGIN_CODE MStp
    DESCRIPTION "Monophonic 2-oscillator step-sequencer synth"
    EDITOR_NAME MonoStepAudioProcessorEditor
    IS_SYNTH TRUE
    NEEDS_MIDI_INPUT TRUE
    VST3_AUTO_MANIFEST TRUE
)

juce_generate_juce_header(MonoStep)

target_sources(MonoStep PRIVATE
    Source/PluginProcessor.cpp
    Source/PluginEditor.cpp
    Source/ui/SequencerMatrix.cpp
)

target_include_directories(MonoStep PRIVATE Source)

target_compile_definitions(MonoStep PRIVATE
    JUCE_WEB_BROWSER=0
    JUCE_VST3_CAN_REPLACE_VST2=0
    MONOSTEP_GIT_INFO="${MONOSTEP_GIT_STRING}"
)

option(MONOSTEP_BUILD_TESTS "Build the headless host test" ON)

if(MONOSTEP_BUILD_TESTS)
    juce_add_console_app(MonoStepTestHost
        PRODUCT_NAME MonoStepTestHost
    )
    juce_generate_juce_header(MonoStepTestHost)
    target_link_libraries(MonoStepTestHost PRIVATE
        juce::juce_audio_processors
        juce::juce_audio_formats
    )
    target_include_directories(MonoStepTestHost PRIVATE Source)
    target_sources(MonoStepTestHost PRIVATE
        Source/PluginProcessor.cpp
        tests/TestHost.cpp
    )
    target_compile_definitions(MonoStepTestHost PRIVATE
        MONOSTEP_HEADLESS=1
        JUCE_PLUGINHOST_VST3=1
    )
endif()
