.DEFAULT_GOAL := lint

package_dir := litegram
tests_dir := tests
scripts_dir := scripts
examples_dir := examples
code_dir := $(package_dir) $(tests_dir) $(scripts_dir) $(examples_dir)
reports_dir := reports

redis_connection := redis://localhost:6379
mongo_connection := mongodb://mongo:mongo@localhost:27017

# =================================================================================================
# Environment
# =================================================================================================

.PHONY: clean
clean:
	rm -rf `find . -name __pycache__`
	rm -f `find . -type f -name '*.py[co]' `
	rm -f `find . -type f -name '*~' `
	rm -f `find . -type f -name '.*~' `
	rm -rf `find . -name .pytest_cache`
	rm -rf *.egg-info
	rm -f report.html
	rm -f .coverage
	rm -rf {build,dist,site,.cache,.ty_cache,.ruff_cache,reports}

.PHONY: install
install: clean
	uv sync --all-extras --group dev --group test
	uv run pre-commit install

# =================================================================================================
# Code quality
# =================================================================================================

.PHONY: lint
lint:
	uv run ruff format --check --diff $(code_dir)
	uv run ruff check --show-fixes --preview $(package_dir) $(examples_dir)
	uv run ty check $(package_dir)

.PHONY: reformat
reformat:
	uv run ruff format $(code_dir)
	uv run ruff check --fix $(code_dir)

# =================================================================================================
# Tests
# =================================================================================================
.PHONY: test-run-services
test-run-services:
	docker compose -f tests/docker-compose.yml -p litegram3-dev up -d

.PHONY: compile-locales
compile-locales:
	uv run pybabel compile -d tests/data/locales -f

.PHONY: test
test: compile-locales test-run-services
	uv run pytest --cov=litegram --cov-config .coveragerc tests/ --redis $(redis_connection) --mongo $(mongo_connection)

.PHONY: test-coverage
test-coverage: compile-locales test-run-services
	mkdir -p $(reports_dir)/tests/
	uv run pytest --cov=litegram --cov-config .coveragerc --html=$(reports_dir)/tests/index.html tests/ --redis $(redis_connection) --mongo $(mongo_connection)
	uv run coverage html -d $(reports_dir)/coverage

.PHONY: test-coverage-view
test-coverage-view:
	uv run coverage html -d $(reports_dir)/coverage
	uv run python -c "import webbrowser; webbrowser.open('file://$(shell pwd)/reports/coverage/index.html')"

# =================================================================================================
# Docs
# =================================================================================================

locales := ru
locale_targets := $(addprefix docs-serve-, $(locales))
locales_pot := _build/gettext
docs_dir := docs

docs-gettext:
	uv run --extra docs bash -c 'cd $(docs_dir) && make gettext'
	uv run --extra docs bash -c 'cd $(docs_dir) && sphinx-intl update -p $(locales_pot) $(addprefix -l , $(locales))'
.PHONY: docs-gettext

docs-html:
	uv run --extra docs bash -c 'cd $(docs_dir) && make html'
.PHONY: docs-html

docs-clean:
	cd $(docs_dir) && make clean
.PHONY: docs-clean

docs-serve:
	uv run --extra docs sphinx-autobuild --watch litegram/ --watch CHANGES.rst --watch README.rst docs/ docs/_build/ $(OPTS)
.PHONY: docs-serve

$(locale_targets): docs-serve-%:
	$(MAKE) docs-serve OPTS="-D language=$(subst docs-serve-,,$@)"
.PHONY: $(locale_targets)

# =================================================================================================
# Project
# =================================================================================================

.PHONY: build
build: clean
	uv build

.PHONY: bump
bump:
	uv run python scripts/bump_version.py $(args)
	uv run python scripts/bump_versions.py

update-api:
	uv run --extra cli butcher parse
	uv run --extra cli butcher refresh
	uv run --extra cli butcher apply all
	@$(MAKE) bump

.PHONY: towncrier-build
towncrier-build:
	uv run --extra docs towncrier build --yes

.PHONY: towncrier-draft
towncrier-draft:
	uv run --extra docs towncrier build --draft

.PHONY: towncrier-draft-github
towncrier-draft-github:
	mkdir -p dist
	uv run --extra docs towncrier build --draft | pandoc - -o dist/release.md

.PHONY: prepare-release
prepare-release: bump towncrier-build

.PHONY: release
release:
	git add .
	git commit -m "Release $(shell uv run python -c 'from litegram import __version__; print(__version__)')"
	git tag v$(shell uv run python -c 'from litegram import __version__; print(__version__)')
