# ============================================================
#  Makefile – LittleFS test ESP32-S3
#  Usage :
#    make BOARD=esp32s3_zero          # build
#    make flash BOARD=esp32s3_zero    # build + flash firmware
#    make flashfs BOARD=esp32s3_zero  # upload la partition LittleFS
#    make monitor BOARD=esp32s3_zero  # ouvre le moniteur série
#    make all BOARD=esp32s3_n16r8v    # build + flash firmware + flashfs
#    make clean                        # nettoyage
#
#  Boards disponibles :
#    esp32s3_zero      – Waveshare ESP32-S3-Zero (4 MB flash)
#    esp32s3_n16r8v    – Generic ESP32-S3 N16R8V (16 MB flash / 8 MB PSRAM OPI)
# ============================================================

# ── Valeur par défaut de la carte ──────────────────────────────
BOARD ?= esp32s3_zero

# ── Outil PlatformIO ───────────────────────────────────────────
PIO := pio

# ── Port série (optionnel, PIO le détecte automatiquement) ─────
# PORT ?= /dev/ttyUSB0

# ── Cibles valides ─────────────────────────────────────────────
VALID_BOARDS := esp32s3_zero esp32s3_n16r8v

.PHONY: all build flash flashfs monitor clean check-board help

# ─────────────────────────────────────────────────────────────
#  help  (cible par défaut si aucun argument)
# ─────────────────────────────────────────────────────────────
help:
	@echo ""
	@echo "  ┌─────────────────────────────────────────────────────────┐"
	@echo "  │         Makefile – LittleFS test ESP32-S3               │"
	@echo "  └─────────────────────────────────────────────────────────┘"
	@echo ""
	@echo "  Utilisation : make <cible> BOARD=<carte>"
	@echo ""
	@echo "  Cartes disponibles :"
	@echo "    esp32s3_zero     – Waveshare ESP32-S3-Zero  (4 MB flash)"
	@echo "    esp32s3_n16r8v   – ESP32-S3 N16R8V         (16 MB flash / 8 MB PSRAM OPI)"
	@echo ""
	@echo "  Cibles :"
	@echo "    build    – Compile le firmware (défaut)"
	@echo "    flash    – Compile et flashe le firmware"
	@echo "    flashfs  – Upload la partition LittleFS (répertoire data/)"
	@echo "    monitor  – Ouvre le moniteur série (Ctrl+C pour quitter)"
	@echo "    all      – build + flash + flashfs"
	@echo "    clean    – Supprime les artefacts de build"
	@echo "    help     – Affiche ce message"
	@echo ""
	@echo "  Exemples :"
	@echo "    make BOARD=esp32s3_zero"
	@echo "    make flash BOARD=esp32s3_n16r8v"
	@echo "    make all BOARD=esp32s3_zero"
	@echo ""

# ─────────────────────────────────────────────────────────────
#  Vérification de la valeur de BOARD
# ─────────────────────────────────────────────────────────────
check-board:
	@if ! echo "$(VALID_BOARDS)" | grep -qw "$(BOARD)"; then \
		echo ""; \
		echo "  ERREUR : carte inconnue '$(BOARD)'"; \
		echo "  Cartes valides : $(VALID_BOARDS)"; \
		echo ""; \
		exit 1; \
	fi
	@echo "  → Carte sélectionnée : $(BOARD)"

# ─────────────────────────────────────────────────────────────
#  build  – compilation uniquement
# ─────────────────────────────────────────────────────────────
build: check-board
	@echo ""
	@echo "  ── Compilation pour $(BOARD) ──────────────────────────────"
	$(PIO) run -e $(BOARD)


#
# partitions
#
partition: check-board
	@echo ""
	@echo "  ── flash de la partition pour $(BOARD) ───────"
	python3 -m esptool --chip esp32-s3 --port $(PORT) --baud 460800 write-flash 0x8000 .pio/build/$(BOARD)/partitions.bin


# ─────────────────────────────────────────────────────────────
#  flash  – compilation + upload du firmware
# ─────────────────────────────────────────────────────────────
flash: check-board
	@echo ""
	@echo "  ── Flash firmware → $(BOARD) ──────────────────────────────"
ifdef PORT
	$(PIO) run -e $(BOARD) -t upload --upload-port $(PORT)
else
	$(PIO) run -e $(BOARD) -t upload
endif

# ─────────────────────────────────────────────────────────────
#  flashfs  – upload la partition LittleFS (contenu de data/)
# ─────────────────────────────────────────────────────────────
flashfs: check-board
	@echo ""
	@echo "  ── Upload LittleFS partition → $(BOARD) ───────────────────"
ifdef PORT
	$(PIO) run -e $(BOARD) -t uploadfs --upload-port $(PORT)
else
	$(PIO) run -e $(BOARD) -t uploadfs
endif

# ─────────────────────────────────────────────────────────────
#  monitor  – moniteur série
# ─────────────────────────────────────────────────────────────
monitor: check-board
	@echo ""
	@echo "  ── Moniteur série ($(BOARD)) – Ctrl+C pour quitter ────────"
ifdef PORT
	$(PIO) device monitor -e $(BOARD) --port $(PORT)
else
	$(PIO) device monitor -e $(BOARD)
endif

# ─────────────────────────────────────────────────────────────
#  all  – build + flash + flashfs
# ─────────────────────────────────────────────────────────────
all: build flash flashfs
	@echo ""
	@echo "  ✔  all : build + flash + flashfs terminé pour $(BOARD)"

# ─────────────────────────────────────────────────────────────
#  clean  – suppression des artefacts
# ─────────────────────────────────────────────────────────────
clean:
	@echo ""
	@echo "  ── Nettoyage ───────────────────────────────────────────────"
	$(PIO) run -t clean || true
	rm -rf .pio
	@echo "  ✔  Nettoyage terminé"
