PROJECT_NAME = eloquent
POSTGRES_PORT = 5415

default: $(PROJECT_NAME).crt postgres.crt

DOCKER_USER = dash
DOCKER_PATH = /var/lib/$(PROJECT_NAME)/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DOCKER_PYTHONPATH = /var/lib/$(PROJECT_NAME)

dist:
	docker-compose exec --user $(DOCKER_USER) app ./manage.py makemigrations --check
	docker-compose exec -T --user $(DOCKER_USER) app tools/make-dist $(VERSION) | tar xCvv /tmp

manage-%:
	docker-compose exec --user $(DOCKER_USER) app ./manage.py $*

migrate:
	docker-compose exec --user $(DOCKER_USER) app ./manage.py migrate

rebuild-migrations:
	docker-compose exec --user $(DOCKER_USER) app find . -path "./elo/migrations/*.py" -not -name "__init__.py" -delete
	docker-compose exec --user $(DOCKER_USER) app find . -path "./elo/migrations/*.pyc"  -delete
	$(MAKE) migrate
	$(MAKE) manage-makemigrations
	$(MAKE) migrate

superuser:
	docker-compose exec --user $(DOCKER_USER) app ./manage.py createsuperuser --email admin@localhost --username admin --noinput

frontend-tests:
	docker-compose exec --user $(DOCKER_USER) app npx wdio wdio.conf.js

backend-tests:
	docker-compose exec --user $(DOCKER_USER) app ./manage.py test

root:
	docker-compose exec app bash

bash:
	docker-compose exec --user $(DOCKER_USER) app env 'PATH=$(DOCKER_PATH)' 'PYTHONPATH=$(DOCKER_PYTHONPATH)' bash

docker: clean
	docker-compose down
	docker-compose build --pull
	docker system prune -f
	docker-compose up -d
	docker-compose exec app env chown $(PROJECT_NAME).$(PROJECT_NAME) $(DOCKER_PYTHONPATH)/media/mp3

psql: postgres.crt $(PROJECT_NAME).crt $(PROJECT_NAME).key
	exec psql 'user=$(PROJECT_NAME) host=localhost port=$(POSTGRES_PORT) sslmode=verify-full sslcert=$(PROJECT_NAME).crt sslkey=$(PROJECT_NAME).key sslrootcert=postgres.crt'

initdb:
	docker-compose exec --user postgres app createuser -d $(PROJECT_NAME)
	docker-compose exec --user postgres app createdb -O $(PROJECT_NAME) $(PROJECT_NAME)

dropdb:
	docker-compose exec --user postgres app dropdb --if-exists $(PROJECT_NAME)
	docker-compose exec --user postgres app dropdb --if-exists test_$(PROJECT_NAME)
	docker-compose exec --user postgres app dropuser --if-exists $(PROJECT_NAME)

testdb:
	$(MAKE) dropdb
	$(MAKE) initdb
	$(MAKE) migrate
	#docker-compose exec --user $(DOCKER_USER) app ./manage.py loaddata fixtures
	docker-compose exec --user $(DOCKER_USER) app ./manage.py loaddata config/language.json
	docker-compose exec --user $(DOCKER_USER) app ./manage.py loaddata config/dialect.json
	docker-compose exec --user $(DOCKER_USER) app ./manage.py loaddata config/domain.json
	docker-compose exec --user $(DOCKER_USER) app ./manage.py loaddata config/word.json

demodb: testdb
	#docker-compose exec --user $(DOCKER_USER) app ./manage.py loaddata extra-fixtures

postgres.crt:
	docker-compose exec -T app cat /etc/postgresql/13/main/server.crt >$@.tmp
	test -s $@.tmp && mv $@.tmp $@

$(PROJECT_NAME).crt: $(PROJECT_NAME).csr
	docker-compose exec -T app openssl x509 -req -days 9999 -CA /etc/postgresql/13/main/ca.crt -CAkey /etc/postgresql/13/main/ca.key -CAcreateserial <$< >$@.tmp
	test -s $@.tmp && mv $@.tmp $@

$(PROJECT_NAME).csr: $(PROJECT_NAME).key
	openssl req -new -utf8 -subj /CN=$(PROJECT_NAME) -key $< -verify -out $@

$(PROJECT_NAME).key:
	umask 027 && openssl genrsa -out $@ 2048

factory-reset:
	$(MAKE) docker
	$(MAKE) demodb

tail:
	docker-compose exec app tail -F /var/log/apache2/error.log /var/log/apache2/access.log

clean:
	rm -f postgres.crt $(PROJECT_NAME).crt $(PROJECT_NAME).csr $(PROJECT_NAME).key

.PHONY: default dist dev prod watch manage-% migrate frontend-tests docker psql initdb dropdb testdb demodb clean rebuild-migrations tail
