# typedload
# Copyright (C) 2018-2026 Salvo "LtWorf" Tomaselli
#
# typedload is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# author Salvo "LtWorf" Tomaselli <tiposchi@tiscali.it>


MINIMUM_PYTHON_VERSION=3.10

all: pypi

.PHONY: test
test:
	python3 -m tests

.PHONY: full_tests
full_tests: test mypy
	@echo "====== 3.10 ======"
	`matrix_tests/prepare_venv 3.10 | tail -1` -m tests
	@echo "====== 3.11 ======"
	`matrix_tests/prepare_venv 3.11 | tail -1` -m tests
	@echo "====== 3.12 ======"
	`matrix_tests/prepare_venv 3.12 | tail -1` -m tests
	@echo "====== 3.13 ======"
	`matrix_tests/prepare_venv 3.13 | tail -1` -m tests
	@echo "====== 3.14 ======"
	`matrix_tests/prepare_venv 3.14 | tail -1` -m tests
	@echo "====== 3.15 ======"
	`matrix_tests/prepare_venv 3.15 | tail -1` -m tests

.PHONY: mypy
mypy:
	mypy --python-version=$(MINIMUM_PYTHON_VERSION) --config-file mypy.conf typedload
	mypy --python-version=$(MINIMUM_PYTHON_VERSION) example.py
	mypy --python-version=$(MINIMUM_PYTHON_VERSION) tests/mypy_*.py

pyproject.toml: docs/CHANGELOG.md
	./gensetup.py --$@

setup.py: docs/CHANGELOG.md README.md
	./gensetup.py --$@
	chmod u+x setup.py

pypi: pyproject.toml setup.py typedload
	mkdir -p dist pypi
	./setup.py sdist
	./setup.py bdist_wheel
	mv dist/typedload-`head -1 CHANGELOG`.tar.gz pypi
	mv dist/*whl pypi
	rmdir dist
	gpg --detach-sign -a pypi/typedload-`head -1 CHANGELOG`.tar.gz
	gpg --detach-sign -a pypi/typedload-`head -1 CHANGELOG`-py3-none-any.whl

# Debian needs setup and pyproject to be kept since they are in the
# dist file. However I want to clean them or they will become outdated
# and not regenerated
.PHONY: debian_clean
debian_clean:
	$(RM) -r pypi
	$(RM) -r build
	$(RM) -r .mypy_cache
	$(RM) -r typedload.egg-info/
	$(RM) -r .pybuild
	$(RM) MANIFEST
	$(RM) -r `find . -name __pycache__`
	$(RM) typedload_`head -1 CHANGELOG`.orig.tar.gz
	$(RM) typedload_`head -1 CHANGELOG`.orig.tar.gz.asc
	$(RM) -r deb-pkg
	$(RM) -r html
	$(RM) -r perftest.output
	$(RM) docs/*_docgen.md

.PHONY: clean
clean: debian_clean
	$(RM) setup.py
	$(RM) pyproject.toml


.PHONY: dist
dist: clean setup.py pyproject.toml
	cd ..; tar -czvvf typedload.tar.gz \
		typedload/setup.py \
		typedload/Makefile \
		typedload/tests \
		typedload/docs \
		typedload/docgen \
		typedload/mkdocs.yml \
		typedload/LICENSE \
		typedload/CONTRIBUTING.md \
		typedload/CHANGELOG \
		typedload/README.md \
		typedload/example.py \
		typedload/mypy.conf \
		typedload/pyproject.toml \
		typedload/matrix_tests/obtain_python_version \
		typedload/matrix_tests/prepare_venv \
		typedload/typedload
	mv ../typedload.tar.gz typedload_`./setup.py --version`.orig.tar.gz
	gpg --detach-sign -a *.orig.tar.gz

.PHONY: upload
upload: pypi
	twine upload --username __token__ --password `cat .token` pypi/*

deb-pkg: dist
	mv typedload_`./setup.py --version`.orig.tar.gz* /tmp
	cd /tmp; tar -xf typedload_*.orig.tar.gz
	cp -r debian /tmp/typedload/
	cd /tmp/typedload/; dpkg-buildpackage --changes-option=-S
	mkdir deb-pkg
	mv /tmp/typedload_* /tmp/python3-typedload*.deb deb-pkg
	$(RM) -r /tmp/typedload
	lintian --pedantic -E --color auto -i -I deb-pkg/*.changes deb-pkg/*.deb

docs/typedload_docgen.md: typedload/__init__.py
	./docgen $@

docs/typedload.dataloader_docgen.md: typedload/dataloader.py
	./docgen $@

docs/typedload.datadumper_docgen.md: typedload/datadumper.py
	./docgen $@

docs/typedload.exceptions_docgen.md: typedload/exceptions.py
	./docgen $@

docs/typedload.typechecks_docgen.md: typedload/typechecks.py
	./docgen $@

docs/typedload.moretypes_docgen.md: typedload/moretypes.py
	./docgen $@

docs/typedload.name_manglers_docgen.md: typedload/name_manglers.py
	./docgen $@

html: \
		docs/*.svg \
		docs/CHANGELOG.md \
		docs/CODE_OF_CONDUCT.md \
		docs/comparisons.md \
		docs/CONTRIBUTING.md \
		docs/deferred_evaluation.md \
		docs/docs \
		docs/docs/gpl3logo.png \
		docs/errors.md \
		docs/examples.md \
		docs/gpl3logo.png \
		docs/performance.md \
		docs/README.md \
		docs/SECURITY.md \
		docs/supported_types.md \
		docs/typedload.datadumper_docgen.md \
		docs/typedload.dataloader_docgen.md \
		docs/typedload_docgen.md \
		docs/typedload.exceptions_docgen.md \
		docs/typedload.typechecks_docgen.md \
		docs/typedload.moretypes_docgen.md \
		docs/typedload.name_manglers_docgen.md \
		mkdocs.yml
	mkdocs build
	# Download cloudflare crap
	mkdir -p html/cdn
	cd html/cdn; wget --continue `cat ../*html | grep cloudflare | grep min.css | sort | uniq | cut -d\" -f4`
	cd html/cdn; wget --continue `cat ../*html | grep cloudflare | grep min.js | sort | uniq | cut -d\" -f2`
	# Fix html pages
	for page in html/*.html; do \
		sed -i 's,https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css,cdn/github.min.css,g' $${page}; \
		sed -i 's,https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js,cdn/highlight.min.js,g' $${page}; \
		echo "<!-- Trackers stripped from mkdocs theme by me -_-' -->" >> $${page}; \
	done
	if (cat html/*.html | grep cdnjs.cloudflare.com); then echo trackers found; false; fi

.PHONY: publish_html
publish_html: html
	git checkout pages
	rm -rf cdn css docs img js search
	mv html/* .
	git add cdn css docs img js search
	git add `git status  --porcelain | grep '^ M' | cut -d\  -f3`
	git commit -m "Deployed manually to workaround MkDocs"
	git push
	git checkout -

perftest.output/perf.p:
	@echo export MOREVERSIONS=1 to compare more versions
	perftest/performance.py

.PHONY: gnuplot
gnuplot: perftest.output/perf.p
	cd "perftest.output"; gnuplot -persist -c perf.p
