.DEFAULT_GOAL := help

# --- Outillage -------------------------------------------------------------
# Le SDK et adb sont rarement dans le PATH : on les retrouve sans les figer.
ANDROID_SDK ?= $(HOME)/Android/Sdk
ADB         ?= $(shell command -v adb 2>/dev/null || echo $(ANDROID_SDK)/platform-tools/adb)
GRADLE      := ./gradlew

VERSION := $(shell tr -d '[:space:]' < VERSION)

APPLICATION_ID := fr.tuxgyver.cachette
LAUNCH_ACTIVITY := $(APPLICATION_ID)/.MainActivity
DEBUG_APK   := app/build/outputs/apk/debug/app-debug.apk
# Le nom de l'APK de release dépend de la signature (app-release.apk contre
# app-release-unsigned.apk) : on liste le répertoire au lieu de deviner.
RELEASE_DIR := app/build/outputs/apk/release
SIGNED_APK  := $(RELEASE_DIR)/app-release.apk
OUTPUT_APK  := Noxely-$(VERSION).apk

# --- Publication -----------------------------------------------------------
# Déléguée au script de BorisSkill, qui sait déjà tout faire : résolution du
# jeton ($GITEA_TOKEN, .gitea-token, ~/.config/gitea/token, ~/.git-credentials),
# déduction de l'hôte, du propriétaire et du dépôt depuis le remote 'origin',
# création et poussée du tag, extraction des notes depuis le CHANGELOG.
GITEA_RELEASE ?= $(HOME)/.claude/skills/BorisSkill/scripts/gitea_release.sh

##@ 🔨 Construction

.PHONY: build
build: ## Construit l'APK de debug
	$(GRADLE) :app:assembleDebug
	@echo "→ $(DEBUG_APK)"

.PHONY: release
release: ## Construit l'APK de release (signé si keystore.properties existe)
	@test -f keystore.properties || echo "⚠️  keystore.properties absent : l'APK produit sera non signé"
	$(GRADLE) :app:assembleRelease
	@if [ -f $(SIGNED_APK) ]; then \
		cp $(SIGNED_APK) $(OUTPUT_APK); \
		echo "→ $(OUTPUT_APK)"; \
	else \
		ls -1 $(RELEASE_DIR)/*.apk 2>/dev/null | sed 's/^/→ /'; \
		echo "   (non signé : non publiable, voir keystore.properties)"; \
	fi

.PHONY: apk
apk: ## Affiche le chemin et la taille des APK construits
	@ls -lh $(DEBUG_APK) 2>/dev/null || echo "APK de debug : pas encore construit (make build)"
	@ls -lh $(RELEASE_DIR)/*.apk 2>/dev/null || echo "APK de release : pas encore construit (make release)"

.PHONY: clean
clean: ## Supprime les artefacts de build
	$(GRADLE) clean

##@ 🚀 Déploiement

.PHONY: install
install: ## Installe l'APK de debug sur l'appareil connecté
	$(GRADLE) :app:installDebug

.PHONY: run
run: install ## Installe puis lance l'application
	$(ADB) shell am start -n $(LAUNCH_ACTIVITY)

.PHONY: uninstall
uninstall: ## Désinstalle l'application de l'appareil connecté
	$(ADB) uninstall $(APPLICATION_ID)

##@ 🧪 Qualité

.PHONY: lint
lint: ## Analyse Android Lint (rapport dans app/build/reports/lint-results-debug.html)
	$(GRADLE) :app:lintDebug

##@ 🐞 Diagnostic

.PHONY: devices
devices: ## Liste les appareils et émulateurs connectés
	$(ADB) devices -l

.PHONY: logcat
logcat: ## Suit les journaux de l'application (Ctrl+C pour arrêter)
	$(ADB) logcat --pid=$$($(ADB) shell pidof $(APPLICATION_ID))

.PHONY: crash
crash: ## Affiche la dernière trace de plantage éventuelle
	@$(ADB) logcat -d -v brief | grep -A 30 -E "FATAL EXCEPTION" | tail -40 || echo "Aucun plantage enregistré"

##@ 📤 Publication

.PHONY: publish
publish: _check-apk _check-release-script ## Publie l'APK signé en release Gitea (tag + notes + asset)
	bash $(GITEA_RELEASE) --version $(VERSION) --asset $(OUTPUT_APK)

.PHONY: publish-dry
publish-dry: _check-apk _check-release-script ## Simule la publication sans rien envoyer
	bash $(GITEA_RELEASE) --version $(VERSION) --asset $(OUTPUT_APK) --dry-run

.PHONY: deploy
deploy: release publish ## Construit l'APK signé puis le publie

.PHONY: _check-release-script
_check-release-script:
	@test -f $(GITEA_RELEASE) || \
	  { echo "❌ Script de publication introuvable : $(GITEA_RELEASE)"; \
	    echo "   Surchargez le chemin : make publish GITEA_RELEASE=/chemin/gitea_release.sh"; exit 1; }

.PHONY: _check-apk
_check-apk:
	@test -f $(OUTPUT_APK) || \
	  { echo "❌ $(OUTPUT_APK) introuvable — lancez d'abord 'make release' (signature requise)."; exit 1; }
	@test $(OUTPUT_APK) -nt VERSION || \
	  { echo "❌ $(OUTPUT_APK) est plus ancien que VERSION — relancez 'make release'."; exit 1; }

##@ ℹ️  Aide

.PHONY: help
help: ## Affiche cette aide
	@awk 'BEGIN {FS = ":.*?## "} \
		/^[a-zA-Z0-9_.-]+:.*?##/ { printf "  \033[36m%-20s\033[0m %s\n", $$1, $$2 } \
		/^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) }' $(MAKEFILE_LIST)
	@echo ""
