APP_MODULE=app.main:app
HOST=0.0.0.0

-include .env

APP_PORT ?= 8000

PYTHON_RUN=uv run

CONTAINER_ENGINE:=$(shell if command -v podman >/dev/null 2>&1; then echo podman; elif command -v docker >/dev/null 2>&1; then echo docker; else echo ""; fi)
COMPOSE_CMD:=$(shell if command -v podman >/dev/null 2>&1; then if podman compose version >/dev/null 2>&1; then echo "podman compose"; elif command -v podman-compose >/dev/null 2>&1; then echo podman-compose; fi; elif command -v docker >/dev/null 2>&1; then echo "docker compose"; else echo ""; fi)

.DEFAULT_GOAL := help

.PHONY: help check-engine check-compose sync run dev prod compile clean \
	image-build image-run image-stop compose-up compose-down compose-logs compose-ps \
	valkey-up valkey-down

help:
	@echo "Targets:"
	@echo "  sync         Install/sync dependencies via uv"
	@echo "  run          Run API in dev mode (reload)"
	@echo "  dev          Alias for run"
	@echo "  prod         Run API with gunicorn via uv"
	@echo "  compile      Compile-check Python sources"
	@echo "  clean        Remove local virtual env and caches"
	@echo "  image-build  Build container image with Dockerfile"
	@echo "  image-run    Run container image (detached)"
	@echo "  image-stop   Stop and remove running container"
	@echo "  compose-up   Start compose stack (Podman or Docker)"
	@echo "  compose-down Stop compose stack"
	@echo "  compose-logs Follow compose logs"
	@echo "  compose-ps   Show compose services"
	@echo "  valkey-up    Start only Valkey service"
	@echo "  valkey-down  Stop and remove only Valkey service"
	@echo ""
	@echo "Detected container engine: $(if $(CONTAINER_ENGINE),$(CONTAINER_ENGINE),none)"
	@echo "Detected compose command: $(if $(COMPOSE_CMD),$(COMPOSE_CMD),none)"

check-engine:
	@if [ -z "$(CONTAINER_ENGINE)" ]; then \
		echo "No container engine found. Install podman or docker."; \
		exit 1; \
	fi

check-compose:
	@if [ -z "$(COMPOSE_CMD)" ]; then \
		echo "No compose command found. Install podman compose, podman-compose, or docker compose."; \
		exit 1; \
	fi

sync:
	$(PYTHON_RUN) python --version >/dev/null
	uv sync

run:
	$(PYTHON_RUN) uvicorn $(APP_MODULE) --host $(HOST) --port $(APP_PORT) --reload

dev: run

prod:
	$(PYTHON_RUN) gunicorn $(APP_MODULE) -k uvicorn.workers.UvicornWorker -w 4 -b $(HOST):$(APP_PORT) --access-logfile - --error-logfile -

compile:
	$(PYTHON_RUN) python -m compileall app

clean:
	rm -rf .venv
	find . -type d -name __pycache__ -prune -exec rm -rf {} +
	find . -type f -name "*.pyc" -delete

image-build: check-engine
	$(CONTAINER_ENGINE) build -t lta-datamall-bus-backend:latest .

image-run: check-engine
	$(CONTAINER_ENGINE) run -d --name lta-datamall-bus-backend --env-file .env -p $(APP_PORT):$(APP_PORT) lta-datamall-bus-backend:latest

image-stop: check-engine
	-$(CONTAINER_ENGINE) stop lta-datamall-bus-backend
	-$(CONTAINER_ENGINE) rm lta-datamall-bus-backend

compose-up: check-compose
	$(COMPOSE_CMD) up --build -d

compose-down: check-compose
	$(COMPOSE_CMD) down

compose-logs: check-compose
	$(COMPOSE_CMD) logs -f

compose-ps: check-compose
	$(COMPOSE_CMD) ps

valkey-up: check-compose
	$(COMPOSE_CMD) up -d valkey

valkey-down: check-compose
	$(COMPOSE_CMD) stop valkey
	$(COMPOSE_CMD) rm -f valkey
