UV ?= uv
PROJECT_DIR ?= .

.PHONY: run check format install clean publish sync-version

VERSION_FILES = smfetch/app.py smfetch/static/index.html

run:
	$(UV) run smfetch

format:
	$(UV) run ruff format $(PROJECT_DIR)

check:
	$(UV) run ruff check --fix --select I,F,UP,B $(PROJECT_DIR)
	$(UV) run ty check $(PROJECT_DIR)

install: clean format check
	$(UV) sync

clean:
	find $(PROJECT_DIR) -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
	find $(PROJECT_DIR) -type f -name "*.py[co]" -delete 2>/dev/null || true
	rm -rf $(PROJECT_DIR)/.ruff_cache $(PROJECT_DIR)/.ty_cache $(PROJECT_DIR)/.mypy_cache $(PROJECT_DIR)/.pyright $(PROJECT_DIR)/.eggs 2>/dev/null || true
	rm -rf $(PROJECT_DIR)/dist $(PROJECT_DIR)/build $(PROJECT_DIR)/*.egg-info 2>/dev/null || true
	rm -rf $(PROJECT_DIR)/.pytest_cache $(PROJECT_DIR)/.coverage* $(PROJECT_DIR)/htmlcov 2>/dev/null || true

sync-version:
	@VERSION=$$($(UV) version --short); \
	echo "Syncing version $$VERSION across source files..."; \
	sed -i -E 's/(FastAPI\([^)]*version=")[^"]*(")/\1'"$$VERSION"'\2/' smfetch/app.py; \
	sed -i -E 's|(<div class="logo">smfetch<span> v)[^<]*(</span>)|\1'"$$VERSION"'\2|' smfetch/static/index.html

publish:
	@CURRENT_VERSION=$$($(UV) version --short); \
	echo "Current version: $$CURRENT_VERSION"; \
	read -p "Enter new version (or press Enter to keep current): " NEW_VERSION; \
	if [ -n "$$NEW_VERSION" ] && [ "$$NEW_VERSION" != "$$CURRENT_VERSION" ]; then \
		echo "Updating version to $$NEW_VERSION..."; \
		$(UV) version "$$NEW_VERSION"; \
	elif [ -n "$$NEW_VERSION" ] && [ "$$NEW_VERSION" = "$$CURRENT_VERSION" ]; then \
		echo "Version unchanged (same as current)."; \
	else \
		echo "Using current version: $$CURRENT_VERSION"; \
	fi; \
	FINAL_VERSION=$$($(UV) version --short); \
	$(MAKE) sync-version; \
	$(MAKE) install; \
	$(UV) build; \
	$(UV) publish; \
	if [ -n "$$(git status --porcelain -- pyproject.toml uv.lock $(VERSION_FILES))" ]; then \
		echo "Committing version changes..."; \
		git add pyproject.toml uv.lock $(VERSION_FILES); \
		git commit -m "Release $$FINAL_VERSION"; \
		echo "Pushing to remote..."; \
		git push origin HEAD; \
	else \
		echo "No version-related changes; skipping commit and push."; \
	fi
