.PHONY: all clean norm test author author-install author-start author-stop author-stop-legacy author-restart author-status author-logs author-health author-diagnostics help

VENV := .venv
PY := $(VENV)/bin/python
PIP := $(VENV)/bin/pip
OUTPUT_DIR ?= $(if $(SITE_OUTPUT_DIR),$(SITE_OUTPUT_DIR),output)
PERM_DIR := /home/zaine/master-folder/projects/scripts/bash-scripts

AUTHOR_PORT := 8765
AUTHOR_URL := http://127.0.0.1:$(AUTHOR_PORT)
AUTHOR_PAGES_CHECK := /tmp/authoring-server-pages.json
AUTHOR_SERVICE := org-web-authoring.service
AUTHOR_UNIT_SRC := systemd/user/$(AUTHOR_SERVICE)
SYSTEMD_USER_DIR := $(HOME)/.config/systemd/user
AUTHOR_UNIT_DST := $(SYSTEMD_USER_DIR)/$(AUTHOR_SERVICE)
USER_ID := $(shell id -u)
SYSTEMD_RUNTIME_DIR ?= /run/user/$(USER_ID)
SYSTEMCTL_USER := env XDG_RUNTIME_DIR=$(SYSTEMD_RUNTIME_DIR) systemctl --user
JOURNALCTL_USER := env XDG_RUNTIME_DIR=$(SYSTEMD_RUNTIME_DIR) journalctl --user

all: set-perms clean-output build search author-restart clean-venv 

build:
	@echo "Building project..."
	emacs -Q --script build-site.el

set-perms:
	@echo "Setting permissions for output directory..."
	cd $(PERM_DIR) && sudo ./master-perms.sh

search: $(VENV)
	@echo "Generating search index"
	$(PY) search-index-json.py

test: $(VENV)
	$(PY) -m unittest discover -s tests -p 'test_authoring_server.py' -v

$(VENV):
	@echo "Generating virtual environment"
	python3 -m venv $(VENV)
	$(PIP) install -r requirements.txt

clean-output:
	@echo "Cleaning output directory..."
	rm -rf "$(OUTPUT_DIR)"

clean-venv:
	@echo "Cleaning virtual environment..."
	rm -rf $(VENV)

norm:
	@echo "sorting out the backups..."
	find . -path ./backups -prune -o -type f -name '*~' -exec mv {} backups/ \;

author: author-start

author-install: $(VENV)
	@echo "Installing $(AUTHOR_SERVICE) for the current user..."
	@mkdir -p "$(SYSTEMD_USER_DIR)"
	install -m 0644 "$(AUTHOR_UNIT_SRC)" "$(AUTHOR_UNIT_DST)"
	$(SYSTEMCTL_USER) daemon-reload
	$(SYSTEMCTL_USER) enable "$(AUTHOR_SERVICE)"

author-start: author-install author-stop-legacy
	@echo "Starting authoring UI with systemd..."
	$(SYSTEMCTL_USER) start "$(AUTHOR_SERVICE)"
	@$(MAKE) --no-print-directory author-health

author-stop:
	@echo "Stopping authoring UI with systemd..."
	$(SYSTEMCTL_USER) stop "$(AUTHOR_SERVICE)" || true
	@$(MAKE) --no-print-directory author-stop-legacy

author-stop-legacy:
	@echo "Stopping any legacy process on authoring port $(AUTHOR_PORT)..."
	@fuser -k $(AUTHOR_PORT)/tcp >/dev/null 2>&1 || true

author-restart: author-install author-stop-legacy
	@echo "Restarting authoring UI with systemd..."
	$(SYSTEMCTL_USER) restart "$(AUTHOR_SERVICE)"
	@$(MAKE) --no-print-directory author-health

author-health:
	@echo "Waiting for authoring UI and page list to respond..."
	@for i in 1 2 3 4 5 6 7 8 9 10; do \
		if ! $(SYSTEMCTL_USER) is-active --quiet "$(AUTHOR_SERVICE)"; then \
			echo "Authoring UI service is not active. Service status:"; \
			$(SYSTEMCTL_USER) status --no-pager "$(AUTHOR_SERVICE)" || true; \
			echo "Recent logs:"; \
			$(JOURNALCTL_USER) -u "$(AUTHOR_SERVICE)" -n 80 --no-pager || true; \
			exit 1; \
		fi; \
		if curl -fsS "$(AUTHOR_URL)/api/pages" -o "$(AUTHOR_PAGES_CHECK)" && $(PY) -c 'import json,sys; data=json.load(sys.stdin); sys.exit(0 if isinstance(data, list) and data else 1)' < "$(AUTHOR_PAGES_CHECK)"; then \
			echo "Authoring UI is running on $(AUTHOR_URL)/"; \
			exit 0; \
		fi; \
		sleep 1; \
	done; \
	echo "Authoring UI failed to respond. Service status:"; \
	$(SYSTEMCTL_USER) status --no-pager "$(AUTHOR_SERVICE)" || true; \
	echo "Recent logs:"; \
	$(JOURNALCTL_USER) -u "$(AUTHOR_SERVICE)" -n 80 --no-pager || true; \
	exit 1

author-status:
	@$(SYSTEMCTL_USER) status --no-pager "$(AUTHOR_SERVICE)" || true
	@curl -fsS "$(AUTHOR_URL)/api/pages" -o "$(AUTHOR_PAGES_CHECK)" && $(PY) -c 'import json,sys; print(f"Pages: {len(json.load(sys.stdin))}")' < "$(AUTHOR_PAGES_CHECK)" || true

author-diagnostics:
	@curl -fsS "$(AUTHOR_URL)/api/diagnostics" || true

author-logs:
	$(JOURNALCTL_USER) -u "$(AUTHOR_SERVICE)" -n 100 --no-pager

help:
	@echo "Available targets:"
	@echo "  make                 - Full rebuild"
	@echo "  make build           - Rebuild the output directory"
	@echo "  make set-perms       - Set permissions for output directory"
	@echo "  make clean-output    - Remove output directory"
	@echo "  make clean-venv      - Remove venv directory"
	@echo "  make norm            - Move backup files"
	@echo "  make test            - Run authoring server tests"
	@echo "  make author          - Install and start the authoring UI service"
	@echo "  make author-install  - Install and enable the authoring UI service"
	@echo "  make author-stop     - Stop the authoring UI service"
	@echo "  make author-restart  - Restart the authoring UI service"
	@echo "  make author-status   - Show authoring UI service status and page count"
	@echo "  make author-diagnostics - Show authoring UI runtime diagnostics"
	@echo "  make author-logs     - Show recent authoring UI service logs"
	@echo "  make search          - Create the search index"
	@echo "  make help            - Show this help message"
