APP=slz_api_service
PACKAGE=$(subst _,-,$(APP))
STAGE?=dev

VENV_NAME ?= venv
VENV_ACTIVATE=. $(VENV_NAME)/bin/activate
PYTHON = $(VENV_NAME)/bin/python3

# Set AWS ECR address if your tools is going to be executed in a cloud
REGISTRY ?= 475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/$(PACKAGE)
REVISION ?= $(shell git rev-parse --short=8 HEAD)
VERSION ?= $(shell git rev-parse --abbrev-ref HEAD)

# build sphinx docs
INSTALL_PACKAGE = $(PYTHON) setup.py install
AUTOGEN_DOC_STUBS = sphinx-apidoc -o docs $(APP) -f
BUILD_HTML_DOCS = cd docs && make html && cd .. || cd ..
OPEN_HTML_DOCS = open ./docs/_build/html/readme.html

# run freezeup to update requirements.txt
FREEZEUP = ./devutils dev.freezeup

.PHONY:docs
docs: devenv
	$(VENV_ACTIVATE) && $(INSTALL_PACKAGE) && $(AUTOGEN_DOC_STUBS) && $(BUILD_HTML_DOCS) && $(OPEN_HTML_DOCS)

.PHONY:frozen
frozen:
	$(FREEZEUP)

.PHONY:sort
sort: devenv
	$(VENV_ACTIVATE) && isort ./{$(APP),tests} --recursive

venv: $(VENV_NAME)/bin/activate
$(VENV_NAME)/bin/activate: setup.py
	test -d $(VENV_NAME) || python3.7 -m venv $(VENV_NAME)
	cp pip.conf venv/
	$(PYTHON) -m pip install -U pip
	$(PYTHON) -m pip install -r requirements.txt
	$(PYTHON) -m pip install -e .
	touch $(VENV_NAME)/bin/activate

.PHONY:devenv
devenv: venv
	$(PYTHON) -m pip install -r requirements/dev.pip

.PHONY:test
test: devenv
	$(VENV_ACTIVATE) && pytest

.PHONY:lint
lint: devenv
	$(VENV_ACTIVATE) && pylint $(APP)

.PHONY: clean
clean:
	@rm -rf build/
	@rm -rf dist/
	@rm -rf *.egg-info
	@rm -rf *.pyc
	@rm -f $(PACKAGE)-*.tar.gz
	@rm -rf .*_cache

.PHONY: docker/login
docker/login:
	$$(aws ecr get-login --no-include-email --region us-east-1)

.PHONY: docker/build
docker/build: docker/login
	docker build \
		--build-arg APP=$(APP) \
		--build-arg PACKAGE=$(PACKAGE) \
		-t $(REGISTRY):$(VERSION) \
		-t $(REGISTRY):$(REVISION) .

.PHONY: docker/build-test
docker/build-test: docker/login
	docker build \
		--file Dockerfile.test \
		--build-arg REGISTRY=$(REGISTRY) \
		--build-arg REVISION=$(REVISION) \
		--build-arg APP=$(APP) \
		--build-arg PACKAGE=$(PACKAGE) \
		-t $(REGISTRY):$(VERSION)-test \
		-t $(REGISTRY):$(REVISION)-test .

.PHONY: docker/run-test
docker/run-test: docker/build-test
	docker run -v ~/.aws:/app/.aws:ro $(REGISTRY):$(REVISION)-test

.PHONY: docker/push
docker/push: docker/login
	docker push $(REGISTRY):$(VERSION)
	docker push $(REGISTRY):$(REVISION)

requirements/reinstall: $(VENV_NAME)/bin/activate
	pip freeze --exclude-editable | xargs pip uninstall -y
	$(PYTHON) -m pip install -U pip
	$(PYTHON) -m pip install -e .
