.DEFAULT_GOAL := help

COMPOSE         := docker compose --env-file backend/.env
COMPOSE_PROD    := docker compose -f docker-compose.prod.yml --env-file backend/.env
COMPOSE_STAGING := docker compose -f docker-compose.staging.yml --env-file backend/.env

.PHONY: help
help:
	@echo ""
	@echo "Local (your laptop)"
	@echo "  make up          Start app (also enables the pre-push hook)"
	@echo "  make down        Stop app"
	@echo "  make logs        Show logs"
	@echo "  make ps          Show running containers"
	@echo "  make sh          Open backend shell"
	@echo "  make migrate     Run database migrations"
	@echo "  make seed        Fill demo data"
	@echo "  make artisan c=\"...\"   Run any artisan command"
	@echo "  make test        Run backend tests"
	@echo "  make ci-local    Run full local CI (same gates as GitHub Actions)"
	@echo "  make hooks       Enable pre-push hook without starting Docker"
	@echo "  make restart     Restart all local containers"
	@echo ""
	@echo "Staging (same VPS as prod; nginx 8014 / frontend 3012 / edge 8089)"
	@echo "  make staging-up / staging-down / staging-logs / staging-ps / staging-sh"
	@echo "  make staging-migrate / staging-restart / staging-build"
	@echo "  make staging-deploy SHA=<commit>  Deploy one git SHA (server only)"
	@echo ""
	@echo "Production (the server)"
	@echo "  make prod-up         Start app (rebuilds images)"
	@echo "  make prod-down       Stop app"
	@echo "  make prod-logs       Show logs"
	@echo "  make prod-ps         Show running containers"
	@echo "  make prod-sh         Open backend shell"
	@echo "  make prod-migrate    Run database migrations"
	@echo "  make prod-artisan c=\"...\"  Run any artisan command"
	@echo "  make prod-restart    Restart running containers"
	@echo "  make prod-build      Rebuild images only"
	@echo "  make prod-cache      Refresh Laravel config cache"
	@echo "  make prod-horizon    Show queue worker status"
	@echo "  make prod-deploy SHA=<commit>  Deploy one git SHA (server only; or GHA workflow_dispatch)"
	@echo ""

# ---- local ----

.PHONY: up
up: hooks
	$(COMPOSE) up -d --build

.PHONY: down
down:
	$(COMPOSE) down

.PHONY: logs
logs:
	$(COMPOSE) logs -f --tail=100

.PHONY: ps
ps:
	$(COMPOSE) ps

.PHONY: build
build:
	$(COMPOSE) build

.PHONY: sh
sh:
	$(COMPOSE) exec backend sh

.PHONY: migrate
migrate:
	$(COMPOSE) exec backend php artisan migrate

.PHONY: seed
seed:
	$(COMPOSE) exec backend php artisan db:seed

.PHONY: artisan
artisan:
	$(COMPOSE) exec backend php artisan $(c)

.PHONY: test
test:
	$(COMPOSE) exec backend php artisan test --parallel --processes=$${PARATEST_PROCESSES:-10}

.PHONY: ci-local
ci-local:
	./scripts/ci-local.sh

.PHONY: coding-standard
coding-standard:
	./scripts/check-coding-standard.sh

.PHONY: hooks
hooks:
	@bash scripts/install-git-hooks.sh

.PHONY: restart
restart:
	$(COMPOSE) restart

# ---- staging (same VPS, sibling folder) ----

.PHONY: staging-up
staging-up:
	BACKEND_BIND=$${BACKEND_BIND:-127.0.0.1} $(COMPOSE_STAGING) up -d --build

.PHONY: staging-down
staging-down:
	$(COMPOSE_STAGING) down

.PHONY: staging-logs
staging-logs:
	$(COMPOSE_STAGING) logs -f --tail=100

.PHONY: staging-ps
staging-ps:
	$(COMPOSE_STAGING) ps

.PHONY: staging-build
staging-build:
	@BACKEND_BIND=$${BACKEND_BIND:-127.0.0.1} $(COMPOSE_STAGING) build

.PHONY: staging-sh
staging-sh:
	$(COMPOSE_STAGING) exec backend sh

.PHONY: staging-migrate
staging-migrate:
	$(COMPOSE_STAGING) exec backend php artisan migrate --force

.PHONY: staging-artisan
staging-artisan:
	$(COMPOSE_STAGING) exec backend php artisan $(c)

.PHONY: staging-restart
staging-restart:
	$(COMPOSE_STAGING) restart

.PHONY: staging-deploy
staging-deploy:
	@test -n "$(SHA)" || (echo "Usage: make staging-deploy SHA=<40-char-commit>"; exit 1)
	DEPLOY_TARGET=staging ./scripts/deploy-staging.sh $(SHA)

# ---- production ----

.PHONY: prod-up
prod-up:
	@# Keep :8010 on loopback so punch/whitelist see real client IP via backend-edge :8088.
	BACKEND_BIND=$${BACKEND_BIND:-127.0.0.1} $(COMPOSE_PROD) up -d --build

.PHONY: prod-down
prod-down:
	$(COMPOSE_PROD) down

.PHONY: prod-logs
prod-logs:
	$(COMPOSE_PROD) logs -f --tail=100

.PHONY: prod-ps
prod-ps:
	$(COMPOSE_PROD) ps

.PHONY: prod-build
prod-build:
	@BACKEND_BIND=$${BACKEND_BIND:-127.0.0.1} $(COMPOSE_PROD) build

.PHONY: prod-sh
prod-sh:
	$(COMPOSE_PROD) exec backend sh

.PHONY: prod-migrate
prod-migrate:
	$(COMPOSE_PROD) exec backend php artisan migrate --force

.PHONY: prod-artisan
prod-artisan:
	$(COMPOSE_PROD) exec backend php artisan $(c)

.PHONY: prod-restart
prod-restart:
	$(COMPOSE_PROD) restart

.PHONY: prod-cache
prod-cache:
	$(COMPOSE_PROD) exec backend php artisan config:cache
	$(COMPOSE_PROD) exec backend php artisan view:cache
	$(COMPOSE_PROD) exec queue php artisan horizon:terminate

.PHONY: prod-horizon
prod-horizon:
	$(COMPOSE_PROD) exec queue php artisan horizon:status

.PHONY: prod-deploy
prod-deploy:
	@test -n "$(SHA)" || (echo "Usage: make prod-deploy SHA=<40-char-commit>"; exit 1)
	DEPLOY_TARGET=production ./scripts/deploy-production.sh $(SHA)
