.DEFAULT_GOAL := help

NOW := $(shell date +'%Y%m%d-%H%M%S')
STORAGE_PATH_RIPLOG     := $(shell bin/getconf STORAGE_PATH_RIPLOG)
STORAGE_PATH_RIPLOGHTML := $(shell bin/getconf STORAGE_PATH_RIPLOGHTML)
STORAGE_PATH_TORRENT    := $(shell bin/getconf STORAGE_PATH_TORRENT)

.SILENT: help
.PHONY: help
help:
	echo '  help                 - output this message'
	echo '  css                  - compile the css from sass'
	echo '  check-php            - check that the modified PHP files are syntactically correct'
	echo '  composer-dev-update  - run local composer update'
	echo '  composer-live-update - run production composer install from composer.lock'
	echo '  coverage             - generate HTML coverage report from unit tests'
	echo '  config-css           - generate the configuration variables to build the CSS files'
	echo '  dump-all             - create tarballs of the following:'
	echo '  dump-riplog          - create a tarball of the rip logs'
	echo '  dump-riploghtml      - create a tarball of the HTMLified rip logs'
	echo '  dump-torrent         - create a tarball of the rip logs'
	echo '  git-submodules       - update the git submodules'
	echo '  lint-css             - lint (style check) the CSS'
	echo '  lint-js              - lint (style check) the Javascript'
	echo '  lint-php             - lint (style check) the PHP'
	echo '  lint-twig            - lint (style check) the Twig templates'
	echo '  lint-staged          - lint (style check) all staged changes'
	echo '  reformat-staged      - reformat all staged changes'
	echo '  mysql                - access the database via mysql'
	echo '  mysqldump            - dump mysql database from docker to misc/mysql-dump.sql'
	echo '  ocelot-reload-conf   - signal Ocelot to reload its configuration'
	echo '  ocelot-reload-db     - signal Ocelot to reload from database'
	echo '  psql                 - access the database via psql'
	echo '  pgdump               - dump postgresql database from docker to misc/postgresql-dump.sql'
	echo '  phpstan-analyse      - run phpstan over the code'
	echo '  phpstan-baseline     - generate a new phpstan baseline'
	echo '  test                 - run unit test suite'
	echo '  twig-flush           - purge the Twig cache'

.PHONY: check-php
check-php:
	git status | awk '/(modified|new file):.*\.php$$/ {print $$NF}' | xargs php -l

.PHONY: composer-dev-update
composer-dev-update:
	docker compose exec web composer update --optimize-autoloader

.PHONY: composer-live-update
composer-live-update:
	composer install --no-dev --optimize-autoloader --no-progress

.PHONY: coverage
coverage:
	 docker compose exec -e XDEBUG_MODE=coverage web vendor/bin/paratest -c misc/phpunit.xml --coverage-html coverage/

.PHONY: css
css:
	docker compose exec -T web bin/config-css /tmp/config-css.js
	docker compose exec -T web npm run build:scss

.PHONY: dump-all
dump-all: dump-riplog dump-riploghtml dump-torrent

.PHONY: dump-riplog
dump-riplog:
	tar -C "$(STORAGE_PATH_RIPLOG)/.." -jcf riplog.$(NOW).tar.bz2 "$$(basename $(STORAGE_PATH_RIPLOG))"

.PHONY: dump-riploghtml
dump-riploghtml:
	tar -C "$(STORAGE_PATH_RIPLOGHTML)/.." -jcf riploghtml.$(NOW).tar.bz2 "$$(basename $(STORAGE_PATH_RIPLOGHTML))"

.PHONY: dump-torrent
dump-torrent:
	tar -C "$(STORAGE_PATH_TORRENT)/.." -jcf torrent.$(NOW).tar.bz2 "$$(basename $(STORAGE_PATH_TORRENT))"

.PHONY: git-submodules
git-submodules:
	git pull --recurse-submodules

.PHONY: lint-css
lint-css:
	docker compose exec -T web node_modules/.bin/stylelint --config misc/stylelint.json --cache --cache-location cache/stylelint 'sass/**/*.scss'
	docker compose exec -T web node_modules/.bin/stylelint --config misc/stylelint.json --cache --cache-location cache/stylelint 'sass/**/*.scss' --custom-formatter ./node_modules/stylelint-checkstyle-formatter/index.js

.PHONY: lint-js
lint-js:
	npx eslint -c misc/eslint.config.mjs public/static

.PHONY: lint-php
lint-php:
	find . -path ./vendor -prune \
        -o -path ./cache -prune \
        -o -path ./node_modules -prune \
        -o -path ./misc/docker -prune \
        -o -type f -name '*.php' \
        -print0 \
        | xargs -0 php -l -n | grep -v '^No syntax errors detected in' || true
	vendor/bin/phpcs -p --parallel=4
	vendor/bin/phpstan analyse --memory-limit=1024M --configuration=misc/phpstan.neon

.PHONY: lint-twig
lint-twig:
	bin/twig-parse $(find templates -type f)

.PHONY: lint-staged
lint-staged:
	bin/lint-staged

.PHONY: reformat-staged
reformat-staged:
	bin/reformat-staged

.PHONY: mysql
mysql:
	docker compose exec mysql mysql --defaults-extra-file=/opt/mysql/client.cnf

# defaults file must be chmod 0400 and look something like:
#
# [mysqldump]
# user=gazelle
# password=password

.PHONY: mysqldump
mysqldump:
	docker compose exec -T mysql mysqldump --defaults-file=~/mysqldump.cnf gazelle --single-transaction > misc/mysql-dump.sql

.PHONY: ocelot-reload-conf
ocelot-reload-conf:
	pkill -HUP ocelot

.PHONY: ocelot-reload-db
ocelot-reload-db:
	pkill -USR1 ocelot

.PHONY: pgdump
pgdump:
	docker exec -e POSTGRES_PASSWORD=nyalapw $(shell docker ps|awk '/postgres:/ {print $$1}') pg_dumpall -U nyala > misc/postgresql-dump.sql

.PHONY: psql
psql:
	docker compose exec pg psql gz nyala

.PHONY: phpstan-analyse
phpstan-analyse:
	vendor/bin/phpstan analyse --memory-limit=1024M --configuration=misc/phpstan.neon

.PHONY: phpstan-baseline
phpstan-baseline:
	vendor/bin/phpstan analyse --memory-limit=1024M --configuration=misc/phpstan.neon -vv --generate-baseline misc/phpstan-baseline.neon

.PHONY: rector
rector:
	vendor/bin/rector process --config misc/rector.php

.PHONY: rector-dry-run
rector-dry-run:
	vendor/bin/rector process --dry-run --config misc/rector.php

.PHONY: test
test:
	docker compose exec -T web php -d xdebug.mode=coverage vendor/bin/paratest -c misc/phpunit.xml

.PHONY: twig-flush
twig-flush:
	find cache/twig -mindepth 1 -depth -delete
