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")
    if(Git_FOUND)
        set(JUCE_CLONE_DIR "${CMAKE_CURRENT_BINARY_DIR}/juce")
        if(EXISTS "${JUCE_CLONE_DIR}/CMakeLists.txt")
            message(STATUS "Using JUCE from previous clone at ${JUCE_CLONE_DIR}")
            set(JUCE_DIR "${JUCE_CLONE_DIR}")
        elseif(EXISTS "${JUCE_CLONE_DIR}")
            message(FATAL_ERROR "${JUCE_CLONE_DIR} exists but is not a JUCE checkout. Remove it and re-run, or pass -DJUCE_DIR=<path>.")
        else()
            message(STATUS "JUCE not found at ${JUCE_DIR}; cloning into ${JUCE_CLONE_DIR}...")
            execute_process(
                COMMAND ${GIT_EXECUTABLE} clone --depth 1 https://github.com/juce-framework/JUCE.git "${JUCE_CLONE_DIR}"
                RESULT_VARIABLE JUCE_CLONE_RESULT
            )
            if(NOT JUCE_CLONE_RESULT EQUAL 0)
                message(FATAL_ERROR "Failed to clone JUCE. Pass -DJUCE_DIR=<path> to point at an existing checkout.")
            endif()
            set(JUCE_DIR "${JUCE_CLONE_DIR}")
        endif()
    else()
        message(FATAL_ERROR "JUCE not found at ${JUCE_DIR} and Git is unavailable. Pass -DJUCE_DIR=<path> or install Git.")
    endif()
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()
