cmake_minimum_required(VERSION 3.22)

project(TrackCast VERSION 0.1.0 LANGUAGES C CXX)

# ------------------------------------------------------------------------------
#  Licensing
#
#  TrackCast is GPLv3, pela mesma razao que o VibeDAW: e o que torna o JUCE
#  gratuito em perpetuidade, sem teto de faturamento e sem splash screen. E por
#  isso que JUCE_DISPLAY_SPLASH_SCREEN=0 mais abaixo e legitimo; sem GPL, desligar
#  o splash exigiria uma licenca JUCE paga.
#
#  A obrigacao que ela carrega: entregar o fonte junto com qualquer binario
#  distribuido. Ver LICENSE na raiz do projeto.
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
#  Global settings
# ------------------------------------------------------------------------------
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Put all binaries in a predictable place.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

# ------------------------------------------------------------------------------
#  Pull in JUCE
#
#  Option A (recommended for CI / reproducibility): FetchContent a pinned tag.
#  Option B: add_subdirectory a local checkout (faster local iteration).
#  Toggle with -DTRACKCAST_JUCE_LOCAL=/path/to/JUCE
# ------------------------------------------------------------------------------
if (DEFINED TRACKCAST_JUCE_LOCAL)
    message(STATUS "TrackCast: using local JUCE at ${TRACKCAST_JUCE_LOCAL}")
    add_subdirectory(${TRACKCAST_JUCE_LOCAL} ${CMAKE_BINARY_DIR}/JUCE)
else()
    include(FetchContent)
    FetchContent_Declare(
        juce
        GIT_REPOSITORY https://github.com/juce-framework/JUCE.git
        GIT_TAG        8.0.4          # pin a stable tag; JUCE 7 tags work identically here
        GIT_SHALLOW    TRUE)
    FetchContent_MakeAvailable(juce)
endif()

# ------------------------------------------------------------------------------
#  The application target
#
#  There is no dedicated "audio app" helper: a standalone audio app is a GUI app
#  that links the audio modules. AudioAppComponent lives in juce_audio_utils.
# ------------------------------------------------------------------------------
juce_add_gui_app(TrackCast
    PRODUCT_NAME   "TrackCast"
    COMPANY_NAME   "TrackCast"
    VERSION        ${PROJECT_VERSION}
    # ICON_BIG     "${CMAKE_CURRENT_SOURCE_DIR}/Resources/icon.png"
    MICROPHONE_PERMISSION_ENABLED FALSE)   # standalone: we only want output for MVP

juce_generate_juce_header(TrackCast)

target_sources(TrackCast PRIVATE
    Source/Main.cpp
    Source/MainComponent.cpp
    Source/Audio/AudioEngine.cpp
    Source/Audio/Deck.cpp
    Source/Audio/TrackLoader.cpp
    Source/Audio/BeatDetector.cpp
    Source/Audio/KeyDetector.cpp
    Source/Audio/TrackAnalysis.cpp
    Source/Audio/LoudnessMeter.cpp
    Source/Audio/MixRecorder.cpp
    Source/GUI/TrackCastLookAndFeel.cpp
    Source/Library/AnalysisCache.cpp
    Source/Library/TrackLibrary.cpp
    Source/Library/AnalysisQueue.cpp
    Source/Midi/MidiController.cpp)

# ------------------------------------------------------------------------------
#  Optional embedded fonts (fully code-driven UI — no runtime asset files).
#  Drop any .ttf into Assets/Fonts/ and it is bundled into the binary via
#  BinaryData; the LookAndFeel picks up the first one automatically. If the
#  folder is empty the app compiles and falls back to the system font.
# ------------------------------------------------------------------------------
file(GLOB TRACKCAST_FONTS CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/Assets/Fonts/*.ttf")
if (TRACKCAST_FONTS)
    juce_add_binary_data(TrackCastData SOURCES ${TRACKCAST_FONTS})
    target_link_libraries(TrackCast PRIVATE TrackCastData)
    target_compile_definitions(TrackCast PRIVATE TRACKCAST_HAS_EMBEDDED_FONT=1)
    message(STATUS "TrackCast: embedding font(s): ${TRACKCAST_FONTS}")
else()
    message(STATUS "TrackCast: no fonts in Assets/Fonts — using system font. Add Inter-Regular.ttf to embed.")
endif()

target_compile_definitions(TrackCast PRIVATE
    JUCE_WEB_BROWSER=0
    JUCE_USE_CURL=0
    # Enable the built-in MP3 decoder. Note the licensing caveat in JUCE docs:
    # the MP3 patents have expired, but confirm for your distribution region.
    JUCE_USE_MP3AUDIOFORMAT=1
    JUCE_STRICT_REFCOUNTEDPOINTER=1
    JUCE_DISPLAY_SPLASH_SCREEN=0)

target_link_libraries(TrackCast PRIVATE
    juce::juce_audio_utils      # AudioAppComponent, AudioTransportSource, format readers
    juce::juce_dsp              # IIR filters, ProcessorChain, oscillators, etc.
    PRIVATE
    juce::juce_recommended_config_flags
    juce::juce_recommended_lto_flags
    juce::juce_recommended_warning_flags)
