cmake_minimum_required(VERSION 3.22)

project(RMX19 VERSION 1.0.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "arch")
  set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "deployment target")
endif()

# ---------------------------------------------------------------------------
# Git + compile-time build info (shown in the LCD status footer)
# ---------------------------------------------------------------------------
if(NOT DEFINED BUILD_GIT_BRANCH)
  execute_process(COMMAND git -C "${CMAKE_CURRENT_SOURCE_DIR}" rev-parse --abbrev-ref HEAD
                  OUTPUT_VARIABLE _GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE _OK)
  if(NOT _OK EQUAL 0)
    set(BUILD_GIT_BRANCH "no-vcs")
  else()
    set(BUILD_GIT_BRANCH "${_GIT_BRANCH}")
  endif()
endif()

if(NOT DEFINED BUILD_GIT_COMMIT)
  execute_process(COMMAND git -C "${CMAKE_CURRENT_SOURCE_DIR}" rev-parse --short HEAD
                  OUTPUT_VARIABLE _GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE _OK)
  if(NOT _OK EQUAL 0)
    set(BUILD_GIT_COMMIT "0000000")
  else()
    set(BUILD_GIT_COMMIT "${_GIT_COMMIT}")
  endif()
endif()

if(NOT DEFINED BUILD_GIT_DIRTY)
  execute_process(COMMAND git -C "${CMAKE_CURRENT_SOURCE_DIR}" status --porcelain
                  OUTPUT_VARIABLE _GIT_DIRTY OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE _OK)
  if(NOT _OK EQUAL 0)
    set(BUILD_GIT_DIRTY "?")
  elseif(NOT "${_GIT_DIRTY}" STREQUAL "")
    set(BUILD_GIT_DIRTY "*")
  else()
    set(BUILD_GIT_DIRTY "")
  endif()
endif()

string(TIMESTAMP BUILD_DATE "%Y-%m-%d")
string(TIMESTAMP BUILD_TIME "%H:%M")

configure_file(Source/BuildInfo.h.in ${CMAKE_CURRENT_BINARY_DIR}/Source/BuildInfo.h @ONLY)
message(STATUS "RMX-19 build: ${BUILD_GIT_BRANCH} ${BUILD_GIT_COMMIT}${BUILD_GIT_DIRTY} @ ${BUILD_DATE} ${BUILD_TIME}")

# ---------------------------------------------------------------------------
# JUCE
# ---------------------------------------------------------------------------
if(NOT DEFINED JUCE_ROOT)
  if(EXISTS "$ENV{HOME}/JUCE/CMakeLists.txt")
    set(JUCE_ROOT "$ENV{HOME}/JUCE")
  elseif(EXISTS "/opt/JUCE/CMakeLists.txt")
    set(JUCE_ROOT "/opt/JUCE")
  endif()
endif()

if(NOT DEFINED JUCE_ROOT OR NOT EXISTS "${JUCE_ROOT}/CMakeLists.txt")
  message(FATAL_ERROR "JUCE not found. Set -DJUCE_ROOT=<path to JUCE source>")
endif()

add_subdirectory(${JUCE_ROOT} juce)

juce_add_plugin(RMX19
  PRODUCT_NAME            "RMX-19"
  PLUGIN_NAME             "RMX-19"
  BUNDLE_ID               "com.rackmodule.rmx19"
  COMPANY_NAME            "Rack Module Labs"
  COMPANY_WEBSITE         "https://localhost/rmx19"
  COMPANY_EMAIL           "dev@null.local"
  VERSION                 "1.0.0"
  DESCRIPTION             "19 inch rack digital sound module"
  PLUGIN_MANUFACTURER_CODE "Rmlb"
  PLUGIN_CODE             "Rmx1"
  FORMATS                 AU VST3
  IS_SYNTH                TRUE
  NEEDS_MIDI_INPUT        TRUE
  EDITOR_WANTS_KEYBOARD_FOCUS TRUE
)

set(RMX19_SOURCES
  Source/PluginProcessor.cpp
  Source/PluginEditor.cpp
  Source/LcdPanel.cpp
  Source/PresetBank.cpp
  Source/SynthEngine.cpp
  Source/Params.cpp
)

juce_add_binary_data(RMX19_Assets
  NAMESPACE BinaryData
  SOURCES
    b3.png
)

target_sources(RMX19 PRIVATE ${RMX19_SOURCES})
target_include_directories(RMX19 PRIVATE
  "${CMAKE_CURRENT_SOURCE_DIR}/Source"
  "${CMAKE_CURRENT_BINARY_DIR}/Source")

target_link_libraries(RMX19 PRIVATE
  RMX19_Assets
  juce::juce_audio_utils
  juce::juce_gui_basics
  juce::juce_dsp)

target_compile_definitions(RMX19 PRIVATE JUCE_MODAL_LOOPS_PERMITTED=1
  JUCE_VST3_CAN_REPLACE_VST2=0)

# ---------------------------------------------------------------------------
# Offline probe (dev only): runs the processor with scripted MIDI, no GUI.
# ---------------------------------------------------------------------------
add_executable(rmx_probe Source/Probe.cpp
  Source/PluginProcessor.cpp
  Source/PluginEditor.cpp
  Source/LcdPanel.cpp
  Source/PresetBank.cpp
  Source/SynthEngine.cpp
  Source/Params.cpp)
target_include_directories(rmx_probe PRIVATE
  "${CMAKE_CURRENT_SOURCE_DIR}/Source"
  "${CMAKE_CURRENT_BINARY_DIR}/Source"
  "${CMAKE_CURRENT_BINARY_DIR}/juce_binarydata_RMX19_Assets/JuceLibraryCode")
target_link_libraries(rmx_probe PRIVATE
  RMX19_Assets
  juce::juce_audio_utils
  juce::juce_gui_basics
  juce::juce_dsp)