cmake_minimum_required(VERSION 3.22)
project(Monoslicer VERSION 1.0.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_subdirectory(lib/JUCE)

juce_add_plugin(Monoslicer
    COMPANY_NAME           "Monoslicer"
    PLUGIN_MANUFACTURER_CODE RcSp
    PLUGIN_CODE            MsP1
    FORMATS                AU VST3 Standalone
    PRODUCT_NAME           "Monoslicer"
    IS_SYNTH               TRUE
    NEEDS_MIDI_INPUT       TRUE
    NEEDS_MIDI_OUTPUT      FALSE
    IS_MIDI_EFFECT         FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS TRUE
    COPY_PLUGIN_AFTER_BUILD TRUE
    VST3_CATEGORIES        Instrument Sampler
)

target_sources(Monoslicer PRIVATE
    Source/PluginProcessor.cpp
    Source/PluginEditor.cpp
    Source/SliceManager.cpp
    Source/WaveformDisplay.cpp
    Source/PianoRollDisplay.cpp
)

execute_process(
    COMMAND git rev-parse --short HEAD
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_COMMIT_HASH
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET
)

if(NOT GIT_COMMIT_HASH)
    set(GIT_COMMIT_HASH "unknown")
endif()

execute_process(
    COMMAND git symbolic-ref --short HEAD
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_BRANCH
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET
)

execute_process(
    COMMAND git diff --quiet HEAD
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    RESULT_VARIABLE GIT_DIRTY_RESULT
)

execute_process(
    COMMAND git diff --cached --quiet
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    RESULT_VARIABLE GIT_CACHED_DIRTY_RESULT
)

set(GIT_DIRTY "")
if(NOT GIT_DIRTY_RESULT EQUAL 0 OR NOT GIT_CACHED_DIRTY_RESULT EQUAL 0)
    set(GIT_DIRTY "-dirty")
endif()

if(GIT_BRANCH)
    set(GIT_VERSION "${GIT_BRANCH} @ ${GIT_COMMIT_HASH}${GIT_DIRTY}")
else()
    set(GIT_VERSION "detached @ ${GIT_COMMIT_HASH}${GIT_DIRTY}")
endif()

target_compile_definitions(Monoslicer PUBLIC
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=0
    JUCE_VST3_CAN_REPLACE_VST2=0
    GIT_VERSION="${GIT_VERSION}"
)

target_link_libraries(Monoslicer
    PRIVATE
        juce::juce_audio_utils
        juce::juce_audio_processors
        juce::juce_audio_formats
        juce::juce_dsp
    PUBLIC
        juce::juce_recommended_config_flags
        juce::juce_recommended_lto_flags
)

# Drag and drop regression test. Off by default: a console app needs its own copy
# of the JUCE modules, so building it by default would roughly double build time.
# Enable with -DMONOSLICER_BUILD_TESTS=ON, or just use `make test`.
option(MONOSLICER_BUILD_TESTS "Build the test executables" OFF)

if(MONOSLICER_BUILD_TESTS)
  juce_add_console_app(MonoslicerDnDTest
      PRODUCT_NAME "MonoslicerDnDTest"
  )
  target_sources(MonoslicerDnDTest PRIVATE
      Tests/DragAndDropTest.cpp
      Source/PluginProcessor.cpp
      Source/PluginEditor.cpp
      Source/SliceManager.cpp
      Source/WaveformDisplay.cpp
      Source/PianoRollDisplay.cpp
  )
  target_compile_definitions(MonoslicerDnDTest PUBLIC
      JUCE_WEB_BROWSER=0
      JUCE_USE_CURL=0
      JUCE_VST3_CAN_REPLACE_VST2=0
      JucePlugin_Name="Monoslicer"
      GIT_VERSION="${GIT_VERSION}"
      # handleDragDrop() defers filesDropped() via MessageManager::callAsync, so the
      # test needs to be able to pump the message loop to observe it.
      JUCE_MODAL_LOOPS_PERMITTED=1
  )
  target_link_libraries(MonoslicerDnDTest
      PRIVATE
          juce::juce_audio_utils
          juce::juce_audio_processors
          juce::juce_audio_formats
          juce::juce_dsp
  )
endif()

# Suppress JUCE / VST3 SDK warnings globally for all targets.
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations -Wno-implicit-int-conversion-on-negation")
