# Makefile for PRE — Personal Reasoning Engine
#
# Targets:
#   make              — build PRE CLI binary
#   make pre          — build PRE CLI only
#   make telegram     — build Telegram bot bridge
#   make menubar      — build PRE.app menu bar helper
#   make desktop      — build PRE Desktop.app native wrapper
#   make clean        — remove build artifacts
#   make install      — symlink pre-launch + install apps

CC = clang
CXX = clang++
CFLAGS = -O3 -march=native -flto -Wall -Wextra -fobjc-arc -DACCELERATE_NEW_LAPACK
CXXFLAGS = -O3 -march=native -flto -Wall -Wextra -std=c++17
LDFLAGS = -flto -lpthread -lcompression

PRE_TARGET = pre
PRE_SRC = pre.m

TG_TARGET = pre-telegram
TG_SRC = telegram.m

MENUBAR_APP = PRE.app
MENUBAR_SRC = pre-menubar.swift
MENUBAR_BIN = $(MENUBAR_APP)/Contents/MacOS/pre-menubar

DESKTOP_APP = PRE Desktop.app
DESKTOP_SRC = pre-desktop.swift
DESKTOP_BIN = $(DESKTOP_APP)/Contents/MacOS/pre-desktop

# llama.cpp integration (via Homebrew or manual install)
LLAMACPP_PREFIX ?= $(shell brew --prefix llama.cpp 2>/dev/null)
GGML_PREFIX ?= $(shell brew --prefix ggml 2>/dev/null)

# Check if llama.cpp is available
ifneq ($(wildcard $(LLAMACPP_PREFIX)/include/llama.h),)
  HAS_LLAMACPP = 1
  LLAMACPP_CFLAGS = -DPRE_HAS_LLAMACPP -I$(LLAMACPP_PREFIX)/include -I$(GGML_PREFIX)/include
  LLAMACPP_LDFLAGS = -L$(LLAMACPP_PREFIX)/lib -L$(GGML_PREFIX)/lib -lllama -lggml -lggml-base -lstdc++ -framework Metal -framework MetalPerformanceShaders -framework Accelerate
  INFERENCE_OBJ = inference.o
else
  HAS_LLAMACPP = 0
  LLAMACPP_CFLAGS =
  LLAMACPP_LDFLAGS =
  INFERENCE_OBJ =
endif

.PHONY: all clean install telegram menubar desktop

all: $(PRE_TARGET)

# Build inference.cpp as C++ object (only when llama.cpp available)
inference.o: inference.cpp inference.h
ifeq ($(HAS_LLAMACPP),1)
	$(CXX) $(CXXFLAGS) $(LLAMACPP_CFLAGS) -c inference.cpp -o inference.o
endif

$(PRE_TARGET): $(PRE_SRC) linenoise.c linenoise.h $(INFERENCE_OBJ)
ifeq ($(HAS_LLAMACPP),1)
	$(CC) $(CFLAGS) $(LLAMACPP_CFLAGS) -framework Foundation -framework AppKit -framework WebKit $(PRE_SRC) linenoise.c $(INFERENCE_OBJ) $(LLAMACPP_LDFLAGS) $(LDFLAGS) -o $(PRE_TARGET)
	@echo "Built with native llama.cpp inference"
else
	$(CC) $(CFLAGS) -framework Foundation -framework AppKit -framework WebKit $(PRE_SRC) linenoise.c $(LDFLAGS) -o $(PRE_TARGET)
	@echo "Built without llama.cpp (Ollama-only mode)"
endif

$(TG_TARGET): $(TG_SRC)
	$(CC) $(CFLAGS) -framework Foundation $(TG_SRC) -o $(TG_TARGET)

telegram: $(TG_TARGET)

$(MENUBAR_BIN): $(MENUBAR_SRC)
	@mkdir -p $(MENUBAR_APP)/Contents/MacOS $(MENUBAR_APP)/Contents/Resources
	swiftc -O -o $(MENUBAR_BIN) $(MENUBAR_SRC) -framework Cocoa

menubar: $(MENUBAR_BIN)

"$(DESKTOP_BIN)": $(DESKTOP_SRC)
	@mkdir -p "$(DESKTOP_APP)/Contents/MacOS" "$(DESKTOP_APP)/Contents/Resources"
	swiftc -O -o "$(DESKTOP_BIN)" $(DESKTOP_SRC) -framework Cocoa -framework WebKit
	@if [ ! -f "$(DESKTOP_APP)/Contents/Resources/AppIcon.icns" ]; then \
		echo "  Note: No icon file. Run ./gen-icon.sh to generate."; \
	fi

desktop: "$(DESKTOP_BIN)"

clean:
	rm -f $(PRE_TARGET) $(TG_TARGET) $(MENUBAR_BIN) "$(DESKTOP_BIN)" inference.o

install: $(PRE_TARGET) $(MENUBAR_BIN) "$(DESKTOP_BIN)"
	@mkdir -p $(HOME)/.local/bin
	@chmod +x pre-launch
	ln -sf $(CURDIR)/pre-launch $(HOME)/.local/bin/pre-launch
	@mkdir -p $(HOME)/Applications
	@rm -rf $(HOME)/Applications/PRE.app
	cp -R $(CURDIR)/PRE.app $(HOME)/Applications/PRE.app
	@rm -rf "$(HOME)/Applications/PRE Desktop.app"
	cp -R "$(CURDIR)/PRE Desktop.app" "$(HOME)/Applications/PRE Desktop.app"
	@echo ""
	@echo "Installed: pre-launch -> $(CURDIR)/pre-launch"
	@echo "Installed: PRE.app -> ~/Applications/PRE.app"
	@echo "Installed: PRE Desktop.app -> ~/Applications/PRE Desktop.app"
	@echo "Make sure ~/.local/bin is in your PATH:"
	@echo '  export PATH="$$HOME/.local/bin:$$PATH"'
