.PHONY: help

help:
	@echo "Fan component list: fan-ui, fan-feedback, fan-send."
	@grep -E -e '^[a-zA-Z0-9%_-]+:.*?## .*$$' -e '^###' $(MAKEFILE_LIST) \
		| awk '\
			BEGIN {FS = ":.*?## "} \
			/:.*?##/ {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2} \
			/###/ {printf "\033[35m%-30s\033[0m\n", $$0} \
			'

### Build images

docker: docker-down docker-clean docker-pull-base docker-build docker-tag ## Down, clean and build all containers

docker-build: docker-build-send ## Build all fan images excluding dev
	docker-compose build --no-cache --force-rm

docker-build-pybase: ## Build pybase image (reused by all other images)
	docker-compose -f docker-compose-base.yml build --pull --no-cache --force-rm fan-pybase
	docker image tag fan-pybase registry.yandex.net/mail/fan/fan-pybase:latest

docker-build-release-base: docker-pull-base
	docker-compose -f docker-compose.yml build --no-cache --force-rm release-base

docker-build-send:
	ya make -j10 --checkout fan_send/
	rm -rf build
	mkdir -p build/usr/sbin
	mkdir -p fan_send/deploy
	cp ./fan_send/fan_send build/usr/sbin/
	cp -r ./fan_send/etc/ build/
	cp -r ../rtec/docker-common/deploy/* build/
	docker build --pull --network=host --build-arg installdir="build" --build-arg deploydir="fan_send/deploy" -t fan_send:local -f ./fan_send/Dockerfile .
	rm -rf build/

docker-build-%: docker-build-release-base ## Build image fan-%
	docker-compose build --no-cache --force-rm fan-$*


### Code check and format

dockertestrun := docker-compose run --rm -e PYTHONPATH="/app:/app/fan_ui" --workdir=/ test-pybase
cmd_flake8 := flake8 /app/fan/ /app/fan_ui /app/fan_feedback
cmd_check_imports := isort --recursive --check-only --diff /app/fan/ /app/fan_ui /app/fan_feedback
cmd_sort_imports := isort --recursive /app/fan/ /app/fan_ui /app/fan_feedback
cmd_check_style := $(cmd_flake8); $(cmd_check_imports)

check-style: ## Check code style in pybase container
	$(dockertestrun) bash -c "$(cmd_check_style)"

sort-imports: ## Sort imports in pybase container
	$(dockertestrun) bash -c "$(cmd_sort_imports)"

cc: ## Run code check (importsm style) in pybase container
	$(dockertestrun) bash -c "$(cmd_check_imports); $(cmd_check_style)"

autopep8: ## Run autopep8 in pybase container
	$(dockertestrun) bash -c "autopep8 --verbose --in-place --recursive app"

### Tests

tcmd: test-prepare-temp-dirs build_test_container build_test_db ## Run interactive shell in pybase container
	docker-compose run --rm test-pybase $(cmd)

test: test-prepare-temp-dirs test-ui test-feedback ## Run all python tests

test_cov: test-prepare-temp-dirs test_cov-ui test_cov-feedback ## Run all python tests and measure python code coverage

test_cov-%: ## Run tests for the component fan-% and measure code coverage
	make test-$* extra="--cov=. --cov-report=html:/cov/$*_html --cov-config=fan_$*/.coveragerc"

test-%: pyclean test-prepare-temp-dirs build_test_container build_test_db ## Run tests for the component fan-%
	docker-compose run --rm test-pybase bash -c '/test-$* '"$(extra)"''

build_test_db:
	docker-compose build test_db

build_test_container:
	docker-compose build pybase test-pybase

test-prepare-temp-dirs:
	mkdir -p .cov .log
	chmod g+s .cov .log
	find fan_* pylib/fan -type d | xargs chmod g+s


### Dev environment

dockerdevrun := docker-compose -f docker-compose-dev.yml run --rm $(de) dev
cmd_migrate := /app/fan_ui/manage.py migrate $(extra)

migrate: devbuild ## Apply migrations to local DB
	$(dockerdevrun) $(cmd_migrate)

# shortcut to create superuser root:root, Yandex.Mail account and associate them together
cmd_create_superuser := /app/fan_ui/manage.py createsuperuser --username=root --email=root@sender.host

devfaststart: devbuild ## Apply DB migrations, create Dev project and superuser django account
	$(dockerdevrun) bash -c "$(cmd_migrate); $(cmd_create_superuser)"

makemigrations: devbuild ## Generate migrations
	$(dockerdevrun) app/fan_ui/manage.py makemigrations

devbuild: docker-pull-base ## Build dev containers
	docker-compose -f docker-compose-dev.yml build $(extra)

devup: get-tvm-secret docker-pull-base docker-build-send ## Run fan-ui dev container and all its dependencies
	@TVM_SECRET="$(TVM_SECRET)" docker-compose -f docker-compose-dev.yml up dev

fan_send_up: docker-build-send
	docker-compose -f docker-compose-dev.yml up fan_send

devbash: devbuild
	$(dockerdevrun) bash

devshell: devbuild
	$(dockerdevrun) python3 /app/fan_ui/manage.py shell

devstop:
	docker-compose -f docker-compose-dev.yml stop

devdown: ## Stop and remove all dev containers
	docker-compose -f docker-compose-dev.yml down -v --remove-orphans

devmanage: devbuild
	$(dockerdevrun) app/fan_ui/manage.py $(cmd)

get-tvm-secret: ## Get TVM secret from ya vault
	$(eval TVM_SECRET_VERSION = $(shell ya vault get version --json sec-01exf11qf06bn07djvtpf5h9vp | jq '.version' | sed 's/"//g'))
	test -n "$(TVM_SECRET_VERSION)" || (echo 'TVM secret not found' && false)
	$(eval TVM_SECRET = $(shell ya vault get version --json "$(TVM_SECRET_VERSION)" | jq '.value.client_secret' | sed 's/"//g'))

docker-dev-ip:
	docker inspect `docker-compose -f docker-compose-dev.yml ps -q dev`|jq .[0].NetworkSettings.Networks.bridge.IPAddress

### Release

docker-tag: docker-tag-ui docker-tag-feedback ## Mark all images with tag, requires VERSION

docker-tag-%: ## Mark concrete image with tag, requires VERSION
	docker tag fan-$*:local registry.yandex.net/mail/fan/fan-$*:$(VERSION)

docker-push: docker-push-ui docker-push-feedback ## Push images to the registry

docker-push-pybase: ## Push base image to the registry
	docker push registry.yandex.net/mail/fan/fan-pybase:latest

docker-push-%: ## Push concrete image to the registry, requires VERSION
	docker push registry.yandex.net/mail/fan/fan-$*:$(VERSION)

### Cleanup

pyclean: ## Remove all temporary files
	sudo rm -rf $(find ./pylib/ ./fan_* -name '__pycache__' -o -name '.cache')
	sudo rm -f $(find ./pylib/ ./fan_* -name '*.pyc' -o -name '*.py~')

docker-down: ## Stop and remove running containers (docker-compose down --remove-orphans)
	docker-compose down -v --remove-orphans

docker-clean: ## Remove all known docker containers (docker rmi)
	docker images "fan-pybase"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f
	docker images "fan-test"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f
	docker images "fan-ui"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f
	docker images "fan-feedback"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f
	docker images "fan-send"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f
	docker images "registry.yandex.net/mail/fan/fan-ui"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f
	docker images "registry.yandex.net/mail/fan/fan-feedback"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f
	docker images "registry.yandex.net/mail/fan/fan-send"  --format "{{.Repository}}:{{.Tag}}"| xargs -r docker rmi -f

docker-pull-base:
	docker-compose pull pybase

docker-prune: docker-clean docker-down
	docker system prune -a

clean: devdown pyclean
	sudo chown --quiet -R `whoami` .pg_data/ .log/ .cov/ || true
	rm -rf .pg_data/ .log/ .cov/ build/
