TEST_DIRS := ./swh/web/
TESTFLAGS += --hypothesis-profile=swh-web-fast
TESTFULL_FLAGS = --hypothesis-profile=swh-web
YARN ?= yarn
SETTINGS_CYPRESS ?= swh.web.settings.cypress
SETTINGS_DEV ?= swh.web.settings.development
SETTINGS_PROD = swh.web.settings.production

define run_django_migrations
	django-admin migrate --settings=$(1) -v0
endef

define create_django_fixtures
	cat swh/web/tests/create_test_admin.py | django-admin shell --settings=$(1)
	cat swh/web/tests/create_test_users.py | django-admin shell --settings=$(1)
	cat swh/web/tests/create_test_alter.py | django-admin shell --settings=$(1)
endef

define run_django_server
	python3 swh/web/manage.py runserver --nostatic --settings=$(1)
endef

yarn-install: package.json
	$(YARN) install --frozen-lockfile

build-webpack-dev: yarn-install ## Build frontend assets with webpack
	$(YARN) build-dev

build-webpack-test: yarn-install ## | same with coverage activated
	$(YARN) build-test

build-webpack-dev-no-verbose: yarn-install ## | same as above without any output
	$(YARN) build-dev >/dev/null

build-webpack-prod: yarn-install ## | build assets minified and with mappings for sentry
	$(YARN) build

run-migrations-dev: ## Run django db migration (dev: swh.web.settings.development)
	$(call run_django_migrations,$(SETTINGS_DEV))

run-migrations-prod: ## | same with prod settings (swh.web.settings.production)
	$(call run_django_migrations,$(SETTINGS_PROD))

run-migrations-cypress: ## | same with cypress settings (swh.web.cypress.tests)
	rm -f swh-web-test*.sqlite3*
	$(call run_django_migrations,$(SETTINGS_CYPRESS))

add-users-cypress: run-migrations-cypress ## Create default django users (cypress settings)
	$(call create_django_fixtures,$(SETTINGS_CYPRESS))

add-users-dev: run-migrations-dev ## | same, using dev settings
	$(call create_django_fixtures,$(SETTINGS_DEV))

add-users-prod: run-migrations-prod ## | same, using prod settings
	$(call create_django_fixtures,$(SETTINGS_PROD))

.PHONY: clear-memcached
clear-memcached: ## Clear locally running memcache (on localhost:1211)
	echo "flush_all" | nc -q 2 localhost 11211 2>/dev/null

run-django-webpack-devserver: add-users-dev yarn-install ## Start webpack and django servers using dev settings (frontend and backend parts of the webapp get automatically reloaded when source files are modified)
	bash -c "trap 'trap - SIGINT SIGTERM ERR EXIT && \
	# ensure all child processes will be killed by PGID when exiting \
	ps -o pgid= $$$$ | grep -o [0-9]* | xargs pkill -g' SIGINT SIGTERM ERR EXIT; \
	$(YARN) start-dev & sleep 10 && cd swh/web && \
	python3 manage.py runserver --nostatic --settings=$(SETTINGS_DEV) || exit 1"

run-django-webpack-dev: build-webpack-dev add-users-dev ## Build assets & start django from src using dev settings
	$(call run_django_server,$(SETTINGS_DEV))

run-django-webpack-prod: build-webpack-prod add-users-prod clear-memcached ## | same with prod settings
	$(call run_django_server,$(SETTINGS_PROD))

run-django-server-dev: add-users-dev ## Start django from src using dev settings
	$(call run_django_server,$(SETTINGS_DEV))

run-django-server-prod: add-users-prod clear-memcached ## | same with prod settings
	$(call run_django_server,$(SETTINGS_PROD))

run-gunicorn-server: add-users-prod clear-memcached ## Clear memcache and start django from gunicorn (prod settings)
	DJANGO_SETTINGS_MODULE=$(SETTINGS_PROD) \
	gunicorn --bind 127.0.0.1:5004 \
	--threads 2 \
	--workers 2 'django.core.wsgi:get_wsgi_application()'

run-django-webpack-memory-storages: build-webpack-dev add-users-dev ## Start django from tests settings (using in-memory storages)
	$(call run_django_server,$(SETTINGS_CYPRESS))

run-mirror-demo: build-webpack-dev add-users-dev ## Start django from tests config using a mirror setup
	SWH_CONFIG_FILENAME=$$PWD/mirror_demo/config.yml $(call run_django_server,$(SETTINGS_DEV))

test-full: ## Run all python tests
	$(TEST) $(TESTFULL_FLAGS) $(TEST_DIRS)

test-frontend-cmd: build-webpack-test add-users-cypress
	bash -c "trap 'trap - SIGINT SIGTERM ERR EXIT && \
	jobs -p | xargs -r kill' SIGINT SIGTERM ERR EXIT; \
	$(call run_django_server,$(SETTINGS_CYPRESS)) & \
	sleep 10 && $(YARN) run cypress run --config numTestsKeptInMemory=0 && \
	$(YARN) nyc-report"

test-frontend: export CYPRESS_SKIP_SLOW_TESTS=1
test-frontend: test-frontend-cmd ## Run cypress non-slow tests (no GUI)

test-frontend-full: export CYPRESS_SKIP_SLOW_TESTS=0
test-frontend-full: test-frontend-cmd ## | same, including slow tests

test-frontend-ui-cmd: add-users-cypress yarn-install
	# ensure all child processes will be killed when hitting Ctrl-C in terminal
	# or manually closing the Cypress UI window, killing by PGID seems the only
	# reliable way to do it in that case
	bash -c "trap 'trap - SIGINT SIGTERM ERR EXIT && \
	ps -o pgid= $$$$ | grep -o [0-9]* | xargs pkill -g' SIGINT SIGTERM ERR EXIT; \
	$(YARN) start-dev & \
	$(call run_django_server,$(SETTINGS_CYPRESS)) & \
	sleep 10 && $(YARN) run cypress open"

test-frontend-ui: export CYPRESS_SKIP_SLOW_TESTS=1
test-frontend-ui: test-frontend-ui-cmd ## Run cypress non-slow tests in a browser (GUI)

test-frontend-full-ui: export CYPRESS_SKIP_SLOW_TESTS=0
test-frontend-full-ui: test-frontend-ui-cmd ## | same, including slow tests


.PHONY: help
help:
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sed -e s/Makefile.local:// | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

.DEFAULT_GOAL := help
