BACKUP_BASE      ?= /srv/backup
BACKUP_KEEP_DAYS ?= 7

DATABASE_BACKUP_BASE    ?= $(BACKUP_BASE)/database
REPOSITORY_BACKUP_BASE  ?= $(BACKUP_BASE)/repositories

REDMINE_STACK    ?= /srv/stacks/redmine
WIKI_STACK       ?= /srv/stacks/wiki
CATALOG_STACK    ?= /srv/stacks/teletype-games

GITEA_SERVER     ?= https://git.teletype.hu
GITEA_API        ?= $(GITEA_SERVER)/api/v1/repos/search?limit=10000&private=true

RSYNC_USER   ?= tasi
RSYNC_HOST   ?= rastasi.ddns.net
RSYNC_PORT   ?= 8722
RSYNC_PATH   ?= /volume1/Archives/vps
RSYNC_PATH_BIN   ?= /usr/bin/rsync

db_redmine:
	echo "==> Dump Redmine database"
	cd $(REDMINE_STACK) && docker compose exec database sh /db_backup/mariadb_backup.sh

db_wiki:
	echo "==> Dump Wiki database"
	cd $(WIKI_STACK) && docker compose exec wiki_db sh /db_backup/pg_backup.sh

db_catalog:
	echo "==> Dump Catalog database"
	cd $(CATALOG_STACK) && docker compose exec mysql sh /db_backup/mysql_backup.sh

db_cleanup:
	echo "==> Cleanup database dumps older than $(BACKUP_KEEP_DAYS) days"
	@prefixes=$$(find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "*.sql" \
		| xargs -I{} basename {} \
		| sed 's/-[0-9].*$$//' \
		| sort -u); \
	for prefix in $$prefixes; do \
		total=$$(find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "$$prefix-*.sql" | wc -l); \
		old=$$(find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "$$prefix-*.sql" -mtime +$(BACKUP_KEEP_DAYS) | wc -l); \
		keep=$$((total - old)); \
		if [ "$$keep" -ge 1 ]; then \
			echo "===> Cleaning $$prefix dumps ($$old old, $$keep remaining)"; \
			find $(DATABASE_BACKUP_BASE) -maxdepth 1 -type f -name "$$prefix-*.sql" -mtime +$(BACKUP_KEEP_DAYS) -delete; \
		else \
			echo "===> Skipping $$prefix (would leave no backups)"; \
		fi; \
	done

repos:
	echo "==> Get GIT repositories"
	@mkdir -p "$(REPOSITORY_BACKUP_BASE)"; \
	curl -s -H "Authorization: token $(GITEA_TOKEN)" "$(GITEA_API)" \
	| jq -r '.data[] | "\(.clone_url) \(.full_name)"' \
	| while read repo fullname; do \
		repo=$$(echo $$repo | sed 's|^http://|https://|'); \
		name=$$(basename $$fullname); \
		dir="$(REPOSITORY_BACKUP_BASE)/$$name"; \
		echo "===> Get $$repo name=$$name"; \
		if [ -d "$$dir/.git" ]; then \
			git -C "$$dir" fetch --all --prune; \
			git -C "$$dir" pull; \
		else \
			git clone "$$repo" "$$dir"; \
		fi; \
	done

sync:
	echo "==> Sync backups to $(RSYNC_USER)@$(RSYNC_HOST):$(RSYNC_PATH)"
	rsync -avz --delete -e "ssh -p $(RSYNC_PORT)" --rsync-path=$(RSYNC_PATH_BIN) $(DATABASE_BACKUP_BASE) $(RSYNC_USER)@$(RSYNC_HOST):$(RSYNC_PATH)/
	rsync -avz --delete -e "ssh -p $(RSYNC_PORT)" --rsync-path=$(RSYNC_PATH_BIN) $(REPOSITORY_BACKUP_BASE) $(RSYNC_USER)@$(RSYNC_HOST):$(RSYNC_PATH)/

backup: db_redmine db_wiki db_catalog repos db_cleanup sync