# we want bash behaviour in all shell invocations
SHELL := bash
# Run each target in a separate shell
.ONESHELL:
 # Fail on error inside any functions or subshells
.SHELLFLAGS := -eu -o pipefail -c
 # Remove partially created files on error
.DELETE_ON_ERROR:
 # Warn when an undefined variable is referenced
MAKEFLAGS += --warn-undefined-variables
# Disable built-in rules
MAKEFLAGS += --no-builtin-rules
# A catalog of requirements files
REQUIREMENTS?=requirements

help: # Show this help
	@echo "Usage: make [target]"
	@echo ""
	@echo "Targets:"
	@echo "  help               Show this help"
	@echo "  requirements-base  Compile base requirements"
	@echo "  requirements-test  Compile test requirements"
	@echo "  requirements-dev   Compile dev requirements"
	@echo "  requirements       Compile all requirements"
	@echo "  install            Install the app locally"
	@echo "  install-front      Install frontend"
	@echo "  install-test       Install the app locally with test dependencies"
	@echo "  install-dev        Install the app locally with dev dependencies"
	@echo "  install-test-dev   Install the app locally with test and dev dependencies"
	@echo "  init-test-dev      Install the app locally with test and dev dependencies. Also install pre-commit hooks."
	@echo "  reinit-test-dev    Reinstall pre-commit hooks"
	@echo "  lint               Run linters"
	@echo "  test               Run tests"
	@echo "  migrate            Run migrations"
	@echo "  revision           Create a new migration"
	@echo "  front              Run frontend"
	@echo "  scrape-repos       Scrape repos"
	@echo "  parse-dependencies Scrape dependencies"
	@echo "  index-repos        Index repos"
	@echo "  index-dependencies Index dependencies"

requirements-base: # Compile base requirements
	python -m piptools compile \
	--output-file=requirements/base.txt \
	-v \
	pyproject.toml

requirements-test: requirements-base # Compile test requirements
	python -m piptools compile \
	--extra=test \
	--output-file=requirements/test.txt \
	-v \
	pyproject.toml

requirements-dev: requirements-base # Compile dev requirements
	python -m piptools compile \
	--extra=dev \
	--output-file=requirements/dev.txt \
	-v \
	pyproject.toml

requirements: requirements-base requirements-test requirements-dev  # Compile all requirements
.PHONY: requirements

install:  # Install the app locally
	python -m pip install -r $(REQUIREMENTS)/base.txt .
.PHONY: install

install-test: # Install the app locally with test dependencies
	python -m pip install \
		-r $(REQUIREMENTS)/base.txt \
		-r $(REQUIREMENTS)/test.txt \
		--editable .
.PHONY: install-test

install-dev: # Install the app locally with dev dependencies
	python -m pip install \
		-r $(REQUIREMENTS)/base.txt \
		-r $(REQUIREMENTS)/dev.txt \
		--editable .
.PHONY: install-dev

install-test-dev: # Install the app locally with test and dev dependencies
	python -m pip install \
		-r $(REQUIREMENTS)/base.txt \
		-r $(REQUIREMENTS)/test.txt \
		-r $(REQUIREMENTS)/dev.txt \
		--editable .
.PHONY: install-test-dev

install-front: # Install frontend
	cd frontend && pnpm install
.PHONY: install-front

init-test-dev: install-test-dev # Install the app locally with test and dev dependencies. Also install pre-commit hooks.
	pre-commit install
.PHONY: init-test-dev

reinit-test-dev: init-test-dev # Reinstall pre-commit hooks
	pre-commit install --install-hooks --overwrite
.PHONY: reinit-test-dev

lint: # Run linters
	pre-commit run --all-files
.PHONY: lint

test: # Run tests
	python -m pytest -vv -s --cov=app --cov-report=xml --cov-branch app
.PHONY: test

migrate: # Run migrations
	python -m alembic upgrade heads
.PHONY: migrate

revision: # Create a new migration
	python -m alembic revision --autogenerate -m "$(message)"
.PHONY: revision

front: install-front # Run frontend
	cd frontend && pnpm dev
.PHONY: front

scrape-repos: # Scrape repos
	python -m app.scrape scrape-repos
.PHONY: scrape-repos

parse-dependencies: # Scrape dependencies
	python -m app.scrape parse-dependencies
.PHONY: parse-dependencies

index-repos: # Index repos
	python -m app.index index-repos
.PHONY: index-repos

index-dependencies: # Index dependencies
	python -m app.index index-dependencies
.PHONY: index-dependencies

.DEFAULT_GOAL := init-test-dev # Set the default goal to init-dev-test