# Release youniwemi/digital-invoice to Packagist.
#
#   make release                 # bump patch of latest tag (v0.3.2 -> v0.3.3)
#   make release VERSION=v0.4.0  # explicit version
#   make release CONFIRM=yes     # skip the confirmation prompt
#
# Packagist picks up new tags through the GitHub hook. If PACKAGIST_USERNAME
# and PACKAGIST_TOKEN are set, the package update is also triggered via API.

PACKAGE  := youniwemi/digital-invoice
BRANCH   := master
LATEST   := $(shell git describe --tags --abbrev=0 2>/dev/null)
VERSION  ?= $(shell echo "$(LATEST)" | awk -F. -v OFS=. '{$$NF += 1; print}')

# FNFE French CTC rules (XSLT 2.0) and Saxon-HE to run them, used by test/FrenchRulesTest.php
FNFE_DIR  := test/fnfe
FNFE_URL  := https://raw.githubusercontent.com/fnfempe/France_RFE/main/FNFE_RFE_INVOICE
SAXON_URL := https://repo1.maven.org/maven2/net/sf/saxon/Saxon-HE/10.9/Saxon-HE-10.9.jar

.PHONY: help test check release packagist fnfe

help:
	@echo "make test                    Validate composer.json and run the test suite"
	@echo "make fnfe                    Download Saxon and the FNFE French rules for test/FrenchRulesTest.php"
	@echo "make release [VERSION=vX.Y.Z] Test, tag and push (latest: $(LATEST), next: $(VERSION))"

test:
	composer validate
	composer run-script test

fnfe:
	@mkdir -p $(FNFE_DIR)
	curl -sfL $(SAXON_URL) -o $(FNFE_DIR)/saxon-he.jar
	curl -sfL $(FNFE_URL)/CII/EN16931/2xslt/BR-FR-Flux2-Schematron-CII.xslt -o $(FNFE_DIR)/BR-FR-CII.xslt
	curl -sfL $(FNFE_URL)/UBL/EN16931/2xslt/BR-FR-Flux2-Schematron-UBL.xslt -o $(FNFE_DIR)/BR-FR-UBL.xslt
	curl -sfL $(FNFE_URL)/UBL/EN16931/2xslt/EN16931-UBL-validation.xslt -o $(FNFE_DIR)/EN16931-UBL.xslt
	curl -sfL $(FNFE_URL)/CII/EN16931/2xslt/EN16931-CII-validation.xslt -o $(FNFE_DIR)/EN16931-CII.xslt
	@# Factur-X profile rules, the stylesheets load their code list from the same folder
	@for p in BASICWL:BASIC-WL EN16931:EN16931 EXTENDED:EXTENDED; do \
		d=$${p%%:*}; n=$${p##*:}; \
		curl -sfL $(FNFE_URL)/Factur-X/$$d/2xslt/FACTUR-X_$$n.xslt -o $(FNFE_DIR)/FACTUR-X_$$n.xslt || exit 1; \
		curl -sfL $(FNFE_URL)/Factur-X/$$d/2xslt/FACTUR-X_$${n}_codedb.xml -o $(FNFE_DIR)/FACTUR-X_$${n}_codedb.xml || exit 1; \
	done

check:
	@test "$$(git rev-parse --abbrev-ref HEAD)" = "$(BRANCH)" || { echo "Not on $(BRANCH)"; exit 1; }
	@test -z "$$(git status --porcelain)" || { echo "Working tree not clean"; git status --short; exit 1; }
	@echo "$(VERSION)" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$$' || { echo "Invalid VERSION '$(VERSION)'"; exit 1; }
	@! git rev-parse -q --verify "refs/tags/$(VERSION)" >/dev/null || { echo "Tag $(VERSION) already exists"; exit 1; }
	git fetch origin $(BRANCH)
	@test -z "$$(git log HEAD..origin/$(BRANCH) --oneline)" || { echo "origin/$(BRANCH) has commits you don't have"; exit 1; }

release: check test
	@[ "$(CONFIRM)" = yes ] || { read -p "Release $(VERSION) (previous $(LATEST))? [y/N] " ok && [ "$$ok" = y ]; }
	git tag -a $(VERSION) -m "Release $(VERSION)"
	git push origin $(BRANCH)
	git push origin $(VERSION)
	@$(MAKE) --no-print-directory packagist

packagist:
	@if [ -n "$$PACKAGIST_USERNAME" ] && [ -n "$$PACKAGIST_TOKEN" ]; then \
		curl -sf -X POST -H 'Content-Type: application/json' \
			"https://packagist.org/api/update-package?username=$$PACKAGIST_USERNAME&apiToken=$$PACKAGIST_TOKEN" \
			-d '{"repository":{"url":"https://github.com/$(PACKAGE)"}}' && echo; \
	else \
		echo "Pushed. Packagist updates via the GitHub hook (set PACKAGIST_USERNAME/PACKAGIST_TOKEN to force)."; \
	fi
	@echo "https://packagist.org/packages/$(PACKAGE)"
