JUCE_REPO    := https://github.com/juce-framework/JUCE.git
JUCE_DIR     := lib/JUCE
JUCE_TAG     := 8.0.9
BUILD_DIR    := build
TEST_BUILD_DIR := build-tests
BUILD_TYPE   := Release
CMAKE_ARGS   := -DCMAKE_BUILD_TYPE=$(BUILD_TYPE)
UNAME_S      := $(shell uname -s)

# Platform-aware CPU count
ifeq ($(UNAME_S),Darwin)
  JOBS := $(shell sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)
else
  JOBS := $(shell nproc 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || echo 4)
endif

ARTEFACTS := $(BUILD_DIR)/Monoslicer_artefacts/$(BUILD_TYPE)
VST3       := $(ARTEFACTS)/VST3/Monoslicer.vst3

# AU only exists on macOS; Standalone is a .app on macOS, a plain binary elsewhere
ifeq ($(UNAME_S),Darwin)
  AU        := $(ARTEFACTS)/AU/Monoslicer.component
  AU_DIR    := ~/Library/Audio/Plug-Ins/Components
  VST3_DIR  := ~/Library/Audio/Plug-Ins/VST3
  FORMATS   := AU and VST3
else
  AU        :=
  VST3_DIR  := ~/.vst3
  FORMATS   := VST3
endif

C_RESET  := \033[0m
C_BOLD   := \033[1m
C_DIM    := \033[93m
C_CYAN   := \033[36m
C_GREEN  := \033[32m
C_YELLOW := \033[33m

STEP = @printf '$(C_BOLD)$(C_CYAN)▸$(C_RESET) $(C_BOLD)$(1)$(C_RESET)\n'
INFO = @printf '$(C_DIM)  $(1)$(C_RESET)\n'
COLORIZE = sed -E "$$(printf ' \
  s/([0-9]+)%%/\033[92m\\1%%\033[0m/g; \
  s/(Building [A-Z]+ object [^ ]+)/\033[34m\\1\033[0m/g; \
  s/(Linking [A-Z]+ [^ ]+)/\033[35m\\1\033[0m/g; \
  s/(Configuring done)/\033[92m\\1\033[0m/g; \
  s/(Generating done)/\033[92m\\1\033[0m/g; \
  s/(Build files have been written to: .+)/\033[92m\\1\033[0m/g; \
  s/(-- [A-Z].+)/\033[96m\\1\033[0m/g; \
  s/(-- .+ - (done|yes|no))$$/\033[92m\\1\033[0m/g; \
  s/(.*error:.*)$$/\033[1m\\1\033[0m/i \
')"

.PHONY: all clean fetch configure build install test

all: build

$(JUCE_DIR)/CMakeLists.txt:
	$(call STEP,Fetching JUCE $(JUCE_TAG))
	$(call INFO,cloning $(C_CYAN)juce-framework/JUCE$(C_RESET)$(C_DIM)@$(JUCE_TAG)$(C_RESET))
	git clone --depth 1 --branch $(JUCE_TAG) $(JUCE_REPO) $(JUCE_DIR) | $(COLORIZE)

fetch: $(JUCE_DIR)/CMakeLists.txt

configure: fetch
	$(call STEP,Configuring CMake)
	$(call INFO,$(C_DIM)cmake -B $(BUILD_DIR) -S . $(CMAKE_ARGS)$(C_RESET))
	cmake -B $(BUILD_DIR) -S . $(CMAKE_ARGS) | $(COLORIZE)

build: configure
	$(call STEP,Building Monoslicer)
	$(call INFO,$(C_DIM)$(C_YELLOW)$(JOBS)$(C_RESET)$(C_DIM) parallel jobs$(C_RESET))
	cmake --build $(BUILD_DIR) -j$(JOBS) | $(COLORIZE)

install: build
	$(call STEP,Installing plugins)
ifeq ($(UNAME_S),Darwin)
	$(call INFO,AU → $(AU_DIR))
	mkdir -p $(AU_DIR)
	cp -R $(AU) $(AU_DIR)/
	$(call INFO,VST3 → $(VST3_DIR))
	mkdir -p $(VST3_DIR)
	cp -R $(VST3) $(VST3_DIR)/
	$(call STEP,Rescanning Audio Units)
	killall -9 AudioComponentRegistrar 2>/dev/null; true
else
	$(call INFO,VST3 → $(VST3_DIR))
	mkdir -p $(VST3_DIR)
	cp -R $(VST3) $(VST3_DIR)/
endif
	@printf '\n  $(C_GREEN)$(C_BOLD)✓ Done.$(C_RESET) $(C_GREEN)Monoslicer$(C_RESET)$(C_DIM) installed as $(FORMATS)$(C_RESET)\n\n'

clean:
	$(call STEP,Cleaning)
	rm -rf $(BUILD_DIR) $(TEST_BUILD_DIR)
	$(call INFO,$(C_DIM)removed $(BUILD_DIR)/ and $(TEST_BUILD_DIR)/$(C_RESET))
	@printf '  $(C_GREEN)$(C_BOLD)✓ Clean.$(C_RESET)\n'

# Tests live in their own build dir so `make` stays fast.
test:
	$(call STEP,Building and running tests)
	$(call INFO,$(C_DIM)separate build dir → $(TEST_BUILD_DIR)$(C_RESET))
	cmake -B $(TEST_BUILD_DIR) -S . $(CMAKE_ARGS) -DMONOSLICER_BUILD_TESTS=ON > /dev/null
	cmake --build $(TEST_BUILD_DIR) -j$(JOBS) --target MonoslicerDnDTest > /dev/null
	$(TEST_BUILD_DIR)/MonoslicerDnDTest_artefacts/$(BUILD_TYPE)/MonoslicerDnDTest
