.PHONY: help env clean lint phpstan fmt unit_lint docker_unit_lint_82 down_unit_lint_82 docker_unit_lint_84 down_unit_lint_84
.PHONY: ci_unit_lint_82 ci_unit_lint_clean_82 ci_unit_lint_84 ci_unit_lint_clean_84

help:
	@fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | \
	awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

env:  ## Install dependencies
	composer install

clean:  ## Clean environment
	rm -rf vendor build composer.lock

lint:  ## Run linters locally
	composer lint

phpstan:  ## Run phpstan locally
	composer phpstan

fmt:  ## Run formatters locally
	composer format

unit_lint:  ## Run unit-lint locally
	rm -rf build
	composer lint-and-test

docker_format:  ## Run formatter in Docker
	docker compose up \
		--build \
		--exit-code-from format \
		--abort-on-container-exit \
		--remove-orphans \
		format

docker_unit_lint_82:  ## Run lint + static analysis on PHP 8.2 in Docker
	docker compose up \
		--build \
		--exit-code-from unit-lint-php82 \
		--abort-on-container-exit \
		--remove-orphans \
		unit-lint-php82

down_unit_lint_82:  ## Teardown Docker PHP 8.2 lint containers
	docker compose down unit-lint-php82 --remove-orphans

ci_unit_lint_82: ci_unit_lint_clean_82  ## Run lint+stan+tests on PHP 8.2 in CI/CD
	mkdir -p build/php82
	chmod a+w build/php82
	make docker_unit_lint_82

ci_unit_lint_clean_82: down_unit_lint_82  ## Cleanup PHP 8.2 CI artifacts
	rm -rf build/php82

docker_unit_lint_84:  ## Run lint + static analysis on PHP 8.4 in Docker
	docker compose up \
		--build \
		--exit-code-from unit-lint-php84 \
		--abort-on-container-exit \
		--remove-orphans \
		unit-lint-php84

down_unit_lint_84:  ## Teardown Docker PHP 8.4 lint containers
	docker compose down unit-lint-php84 --remove-orphans

ci_unit_lint_84: ci_unit_lint_clean_84  ## Run lint+stan+tests on PHP 8.4 in CI/CD
	mkdir -p build/php84
	chmod a+w build/php84
	make docker_unit_lint_84

ci_unit_lint_clean_84: down_unit_lint_84  ## Cleanup PHP 8.4 CI artifacts
	rm -rf build/php84

ci_unit_lint_clean: ## Cleanup CI artifacts/containers
	docker compose down --remove-orphans || true
	rm -rf build
