# ENV

ifeq (,$(shell which uv))
	ifeq (,$(shell python3 -m uv --help||python3 -m pip install --user uv)) # detect uv install
		UV ?= false
	endif
	UV ?= python3 -m uv
endif

UV ?= uv
RUFF ?= $(UV) run --active ruff
TY ?= $(UV) run --active ty

ifeq (,$(shell which bun))
	NPM ?= npm
endif

NPM ?= bun

ifeq (,$(shell which podman))
	DOCKER ?= docker
endif

DOCKER ?= podman
DOCKER_TAG ?= tout-doux
PORT ?= 5000

APP_EXEC ?= $(DOCKER) compose exec app
APP_RUN ?= $(DOCKER) compose run --rm app
TORTOISE ?= $(APP_RUN) uv run tortoise

POSTGRES_EXEC ?= $(DOCKER) compose exec postgres
PSQL_EXEC_BIN ?= $(POSTGRES_EXEC) psql --username="tout-doux" --dbname="tout-doux"

OPEN ?= xdg-open

# DOCS

.PHONY: help
help: ## show this message
	@echo "Usage: $(MAKE) [target1] [target2] ..."
	@echo ""
	@echo "Commands/Targets:"
	@cat $(MAKEFILE_LIST) | grep -E '(^[a-zA-Z0-9_%-]+:.*?##.*$$)|(^##)' | awk 'BEGIN {FS = ":.*?## "}{printf "\033[32m%-20s\033[0m %s\n", $$1, $$2}' | sed -e 's/\[32m##/[33m/'
	@echo ""
	@echo "Environment:"
	@cat $(MAKEFILE_LIST) | grep -E '^[a-zA-Z0-9_-]+\s*\??=.*$$' | grep -Eo '^[a-zA-Z0-9_-]+' | xargs -I {} $(MAKE) -s print-{} 2> /dev/null

.PHONY: print-%
print-%:
	@echo -e '\033[32m$*\033[0m = $($*)'

# FILES

.venv: uv.lock
	$(MAKE) -s uv-sync

node_modules: bun.lock
	$(MAKE) -s npm-install

# ACTIONS

.PHONY: install
install: uv-sync npm-install ## install project

.PHONY: update
update: uv-upgrade npm-update ## update project dependencies

.PHONY: build
build: npm-run-build ## build static site in "dist"

.PHONY: format
format: ruff-fix ruff-format npm-run-lint-fix ## format project

.PHONY: lint
lint: ruff ruff-format-check ty npm-run-lint npm-run-type-check ## lint project

.PHONY: start
start: docker-compose-up

.PHONY: stop
stop: docker-compose-down

.PHONY: logs
logs: docker-compose-logs

.PHONY: migrations
migrations: tortoise-makemigrations

# TOOLS

.PHONY: uv-sync
uv-sync: ## uv sync
	$(UV) sync --active

.PHONY: uv-update
uv-upgrade: ## uv sync upgrade
	$(UV) sync --active --upgrade

.PHONY: ruff
ruff: .venv ## ruff check
	$(RUFF) check

.PHONY: ruff-fix
ruff-fix: .venv ## ruff check (and fix)
	$(RUFF) check --fix --unsafe-fixes

.PHONY: ruff-format
ruff-format: .venv ## ruff format
	$(RUFF) format

.PHONY: ruff-format-check
ruff-format-check: .venv ## ruff format (check only)
	$(RUFF) format --check

.PHONY: ty
ty: .venv ## ty check
	$(TY) check

.PHONY: npm-install
npm-install: ## npm install
	$(NPM) install

.PHONY: npm-update
npm-update: ## npm update
	$(NPM) update

.PHONY: npm-run-%
npm-run-%: node_modules ## npm run (script)
	$(NPM) run $*

.PHONY: docker-compose-up
docker-compose-up: ## docker compose up
	$(DOCKER) compose up -d

.PHONY: docker-compose-up-%
docker-compose-up-%: ## docker compose up (container)
	$(DOCKER) compose up -d $*

.PHONY: docker-compose-down
docker-compose-down: ## docker compose down
	$(DOCKER) compose down --remove-orphans

.PHONY: docker-compose-down-%
docker-compose-down-%: ## docker compose down (container)
	$(DOCKER) compose down --remove-orphans $*

.PHONY: docker-compose-logs
docker-compose-logs: ## docker compose logs
	$(DOCKER) compose logs -f || true

.PHONY: docker-build
docker-build: ## docker build
	$(DOCKER) build . -t $(DOCKER_TAG)

.PHONY: docker-run
docker-run: ## docker run
	$(DOCKER) run -p $(PORT):5000 -v db.sqlite:/app/db.sqlite $(DOCKER_TAG)

.PHONY: tortoise-%
tortoise-%: .venv ## tortoise (command)
	$(TORTOISE) --config-file tortoise-dev.json $*

.PHONY: psql
psql: ## psql
	$(PSQL_EXEC_BIN)

.PHONY: release-%
release-%: .venv ## release major/minor/patch
	$(UV) version --bump=$*
	$(NPM) pm version $* --no-git-tag-version || true
	git add pyproject.toml uv.lock package.json
	git commit -m "chore: $$(uv version --short)"
	git tag "release/$$(uv version --short)" -m "$$(uv version)"
