cmake_minimum_required(VERSION 3.22)
project(Mindball VERSION 0.0.5 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0 CACHE STRING "Minimum macOS deployment target")

if(CMAKE_BUILD_TYPE STREQUAL "" AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release)
endif()

set(MINDBALL_FORMATS "AU VST3 Standalone" CACHE STRING "Plugin formats to build (space separated)")
separate_arguments(_formats UNIX_COMMAND "${MINDBALL_FORMATS}")

set(JUCE_ROOT "" CACHE PATH "Path to a local JUCE source tree (default: fetched from GitHub)")
if(JUCE_ROOT)
    add_subdirectory(${JUCE_ROOT} juce)
else()
    include(FetchContent)
    FetchContent_Declare(juce
        GIT_REPOSITORY https://github.com/juce-framework/JUCE.git
        GIT_TAG        8.0.9
        GIT_SHALLOW    TRUE)
    FetchContent_MakeAvailable(juce)
endif()

# A JUCE GUI plugin needs the core system headers to compile on Linux. Detect
# them up front so a missing package produces a clear error instead of a
# confusing compile failure. GTK and libcurl are never required.
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    set(_mindball_headers  "X11/Xlib.h"                      "freetype2/freetype/freetype.h"
                           "fontconfig/fontconfig.h"         "alsa/asoundlib.h")
    set(_mindball_packages "libx11-dev"                      "libfreetype-dev"
                           "libfontconfig-dev"               "libasound2-dev")
    set(_mindball_missing "")

    foreach(_i RANGE 0 3)
        list(GET _mindball_headers  ${_i} _header)
        list(GET _mindball_packages ${_i} _package)
        find_path(_mindball_hdr_${_i} NAMES "${_header}" QUIET)
        if(NOT _mindball_hdr_${_i})
            string(APPEND _mindball_missing "  ${_header}   (package: ${_package})\n")
        endif()
    endforeach()

    if(_mindball_missing)
        message(FATAL_ERROR
            "Missing required system headers for the Linux build:\n${_mindball_missing}"
            "Install them with:\n"
            "  sudo apt-get install pkg-config libx11-dev libfreetype-dev libfontconfig-dev libasound2-dev\n")
    endif()
endif()

juce_add_plugin(Mindball
    PRODUCT_NAME            "Mindball"
    VENDOR_NAME             "Mindball"
    VERSION                 "0.0.5"
    DESCRIPTION             "Mindball - a minimalist delay plugin"
    FORMATS                 ${_formats}
    PLUGIN_MANUFACTURER_CODE Mind
    PLUGIN_CODE             Mbll
    COPY_PLUGIN_AFTER_BUILD TRUE
    COMPANY_COPYRIGHT       "2026 Mindball")

target_sources(Mindball PRIVATE
    Source/PluginProcessor.cpp
    Source/PluginEditor.cpp)

target_include_directories(Mindball PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/buildinfo)
target_link_libraries(Mindball PRIVATE
    juce::juce_audio_processors
    juce::juce_audio_utils
    juce::juce_audio_devices
    juce::juce_gui_basics)

# New VST3-only plugin: no VST2 has ever been released, so the parameter-ID
# migration warning is irrelevant.
target_compile_definitions(Mindball PRIVATE JUCE_IGNORE_VST3_MISMATCHED_PARAMETER_ID_WARNING)

# juce_core enables libcurl by default on Linux; without NEEDS_CURL the JUCE
# helper targets don't link -lcurl, so that would fail at link time with
# undefined references to curl_easy_setopt. We use no network features, so
# disable it. (GTK/webkit2gtk is never required because juce_gui_extra is not
# linked.)
target_compile_definitions(Mindball PRIVATE JUCE_USE_CURL=0)

# ---- git / build info -----------------------------------------------------
find_package(Git QUIET)
set(MINDBALL_GIT_HASH   "n/a")
set(MINDBALL_GIT_BRANCH "n/a")
set(MINDBALL_GIT_DIRTY  false)
if(Git_FOUND)
    execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short=8 HEAD
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        RESULT_VARIABLE _git_hash_res
        OUTPUT_VARIABLE _git_hash
        ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(_git_hash_res EQUAL 0 AND _git_hash)
        set(MINDBALL_GIT_HASH "${_git_hash}")
        execute_process(COMMAND ${GIT_EXECUTABLE} branch --show-current
            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
            RESULT_VARIABLE _git_branch_res
            OUTPUT_VARIABLE _git_branch
            ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
        if(_git_branch_res EQUAL 0 AND _git_branch)
            set(MINDBALL_GIT_BRANCH "${_git_branch}")
        endif()
        execute_process(COMMAND ${GIT_EXECUTABLE} status --porcelain
            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
            RESULT_VARIABLE _git_status_res
            OUTPUT_VARIABLE _git_status
            ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
        string(LENGTH "${_git_status}" _status_len)
        if(_status_len GREATER 0)
            set(MINDBALL_GIT_DIRTY true)
        endif()
    endif()
endif()
string(TIMESTAMP MINDBALL_BUILD_TIME "%Y-%m-%d %H:%M:%S")

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Source/BuildInfo.h.in
               ${CMAKE_CURRENT_BINARY_DIR}/buildinfo/BuildInfo.h @ONLY)

juce_generate_juce_header(Mindball)
