# AnyBot — build and install from source.   make help   lists everything.
#
#   git clone https://code.30cm.net/daniel.w/AnyBot.git && cd AnyBot
#   make deps       everything the build needs (system packages, Rust) — once
#   make install    build and install: ~/Applications/AnyBot.app on a Mac, ~/.local/bin on Linux
#   make run        open it without installing
#
# The one-step version of all of this is ./install.sh (README.md).

# Rust installed by rustup lives in ~/.cargo/bin, which a fresh shell may not have on PATH yet.
export PATH := $(HOME)/.cargo/bin:$(PATH)
CARGO   ?= cargo
UNAME   := $(shell uname -s)
# `git describe` prints nothing outside a repo; sed passes the empty string through with
# status 0, so "|| echo dev" never fired and VERSION came out blank ("AnyBot ", dist files
# named ".tar.gz"). grep . fails on empty input, which makes the fallback work.
VERSION ?= $(shell git describe --tags --always 2>/dev/null | sed 's/^v//' | grep . || echo dev)
TARGET  := $(or $(CARGO_TARGET_DIR),target)
APPDIR  ?= $(HOME)/Applications
BIN     := $(TARGET)/release/anybot
RELAY   := $(if $(CARGO_TARGET_DIR),$(CARGO_TARGET_DIR),relay/target)/release/anybot-relay

.PHONY: all build app relay run serve setup relay-run test deps doctor install uninstall hands server dist clean help check-rust lint-sh

all: build

help:
	@echo "AnyBot $(VERSION)"
	@echo ""
	@echo "  make              建置 AnyBot 和帳號伺服器（正式版）"
	@echo "  make run          直接打開 AnyBot（不安裝）"
	@echo "  make install      安裝：Mac → $(APPDIR)/AnyBot.app；Linux → ~/.local/bin/anybot 和選單"
	@echo "  make uninstall    移除安裝的程式（你的 Bot 和聊天不會刪）"
	@echo "  make deps         裝好建置需要的東西：系統套件和 Rust（Linux 會問 sudo 密碼）"
	@echo "  make doctor       檢查這台缺什麼"
	@echo "  make test         跑測試"
	@echo "  make lint-sh        檢查 shell 腳本（語法、中文標點黏變數）"
	@echo ""
	@echo "  make serve        不開視窗執行（伺服器、一直開著的電腦）"
	@echo "  make setup        把這台接到你的 AnyBot（終端機裡的引導畫面）"
	@echo "  make hands        Linux：裝好虛擬螢幕等，再接成大腦的手腳"
	@echo "  make relay-run    在這台跑帳號伺服器（埠 8080，資料在 ./relay-data）"
	@echo "  make server       在伺服器上架好帳號伺服器 + 大腦 + HTTPS（Docker）"
	@echo ""
	@echo "  make dist         打包發行檔到 dist/（Mac：.app 的 zip；Linux：三個 tar.gz）"
	@echo "  make clean        清掉建置結果"

build: app relay

check-rust:
	@command -v $(CARGO) >/dev/null 2>&1 || { echo; echo "  ✗ 找不到 Rust（cargo）。先執行：make deps"; echo; exit 1; }
	@set -- $$(rustc --version | sed -n 's/^rustc \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1 \2/p'); { [ "$${1:-0}" -gt 1 ] || { [ "$${1:-0}" -eq 1 ] && [ "$${2:-0}" -ge 95 ]; }; } || { echo; echo "  ✗ Rust 太舊（$$(rustc --version)），要 1.95 以上。執行：rustup update stable（或 make deps）"; echo; exit 1; }

app: check-rust
	$(CARGO) build --release --bin anybot

relay: check-rust
	cd relay && $(CARGO) build --release

run: app
	$(BIN)

serve: app
	$(BIN) --serve

setup: app
	$(BIN) setup

relay-run: relay
	$(RELAY) --port 8080 --data relay-data

test: check-rust
	$(CARGO) test --bin anybot
	cd relay && $(CARGO) test

lint-sh:
	@sh deploy/ci/lint-sh.sh

deps:
	sh ./install.sh deps

doctor:
	@echo "AnyBot $(VERSION) · $(UNAME) $$(uname -m)"
	@command -v git >/dev/null && echo "  ✓ git" || echo "  ✗ git：make deps"
	@command -v cc >/dev/null && echo "  ✓ C 編譯器" || echo "  ✗ C 編譯器：make deps"
	@command -v $(CARGO) >/dev/null && echo "  ✓ $$(rustc --version)" || echo "  ✗ Rust：make deps"
ifeq ($(UNAME),Linux)
	@pkg-config --exists alsa 2>/dev/null && echo "  ✓ ALSA（libasound2-dev）" || echo "  ✗ ALSA 開發套件：make deps"
	@command -v docker >/dev/null && echo "  ✓ $$(docker --version)" || echo "  · 沒有 Docker（只有伺服器和 Bot 自己的電腦需要；make server 會自動裝）"
endif
ifeq ($(UNAME),Darwin)
	@xcode-select -p >/dev/null 2>&1 && echo "  ✓ Xcode Command Line Tools" || echo "  ✗ Xcode Command Line Tools：make deps"
endif
	@test -x $(BIN) && echo "  ✓ 已建置 $(BIN)" || echo "  · 還沒建置：make"
	@command -v docker >/dev/null 2>&1 && { docker volume inspect anybot-box-home >/dev/null 2>&1 && echo "  ✓ Bot 的電腦的資料碟 anybot-box-home（檔案和登入都在裡面）" || echo "  · 沒有 anybot-box-home 資料碟（Bot 的電腦還沒建立過，或被清除過——有快照會在下次建立時自動還原）"; } || true
	@d="$${HOME}/Library/Application Support/AnyBot/box/snapshots"; [ -d "$$d" ] || d="$${HOME}/.local/share/AnyBot/box/snapshots"; [ -d "$$d" ] && echo "  ✓ 快照 $$(ls "$$d" 2>/dev/null | grep -c '^snapshot-') 份（留最近 7 天＋之前每週一份；重設前也會先存）" || echo "  · 還沒有快照（Bot 的電腦每天自動存，重設前也會先存）"

install: app
ifeq ($(UNAME),Darwin)
	KEEP_APP=1 sh deploy/mac/bundle.sh $(VERSION)
	mkdir -p "$(APPDIR)"
	rm -rf "$(APPDIR)/AnyBot.app"
	mv dist/AnyBot.app "$(APPDIR)/AnyBot.app"
	mkdir -p "$(HOME)/.local/bin"
	ln -sfn "$(APPDIR)/AnyBot.app/Contents/MacOS/AnyBot" "$(HOME)/.local/bin/anybot"
	@echo "已安裝 $(APPDIR)/AnyBot.app（第一次打開：按右鍵 › 打開）"
else ifneq ($(findstring MINGW,$(UNAME)),)
	powershell.exe -NoProfile -ExecutionPolicy Bypass -File install.ps1 app
else ifeq ($(OS),Windows_NT)
	powershell.exe -NoProfile -ExecutionPolicy Bypass -File install.ps1 app
else
	sh deploy/linux/install.sh
endif

uninstall:
ifeq ($(UNAME),Darwin)
	rm -rf "$(APPDIR)/AnyBot.app"
else
	rm -f "$(HOME)/.local/bin/anybot" "$(HOME)/.local/share/applications/anybot.desktop"
	rm -f "$(HOME)/.local/share/icons/hicolor/scalable/apps/anybot.svg" "$(HOME)/.local/share/icons/hicolor/256x256/apps/anybot.png" "$(HOME)/.local/share/icons/hicolor/128x128/apps/anybot.png"
endif
	@echo "已移除程式。你的 Bot、聊天和設定還在（要全部刪掉請看 docs/install.md）。"

hands: app
	sh deploy/linux/hands.sh --deps

server:
	sh ./install.sh server

dist: build
ifeq ($(UNAME),Darwin)
	sh deploy/mac/bundle.sh $(VERSION)
else
	sh deploy/ci/package-linux.sh $(VERSION)
endif

clean:
	$(CARGO) clean
	cd relay && $(CARGO) clean
	rm -rf dist
