HOME_TARGET ?= $(HOME)
SYSTEM_DIRS := etc usr var opt boot
PACKAGES := $(patsubst %/,%,$(wildcard */))

.PHONY: check-stow pull-updates unlink link

check-stow:
	@command -v stow >/dev/null 2>&1 && { \
		echo "✅ stow already installed"; \
		exit 0; \
	}; \
	OS="$$(uname -s)"; \
	@echo "📦 stow not found. Detected OS: $$OS"; \
	case "$$OS" in \
		Linux) \
			if [ -f /etc/arch-release ]; then \
				echo "-> Installing via pacman"; \
				sudo pacman -S --needed stow; \
			elif [ -f /etc/debian_version ]; then \
				echo "-> Installing via apt"; \
				sudo apt update && sudo apt install -y stow; \
			else \
				echo "❌ Unsupported Linux distro"; \
				exit 1; \
			fi \
			;; \
		Darwin) \
			@echo "-> Installing via Homebrew"; \
			@command -v brew >/dev/null 2>&1 || { \
				echo "❌ Homebrew not installed"; \
				exit 1; \
			}; \
			@brew install stow \
			;; \
		*) \
			@echo "❌ Unsupported OS: $$OS"; \
			exit 1; \
			;; \
	esac

pull-updates:
	@echo "Pulling all recent updates"
	@git pull origin main
	@git submodule update --recursive --remote

unlink:
	@echo "Unlinking dotfiles to machine"
	@for pkg in $(PACKAGES); do \
		echo ">>> Unstowing package: $$pkg"; \
		for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \
			[ -d "$$subdir" ] || continue; \
			sub="$${subdir##*/}"; \
			is_sys=0; \
			for sys in $(SYSTEM_DIRS); do \
				[ "$$sub" = "$$sys" ] && is_sys=1 && break; \
			done; \
			if [ "$$is_sys" -eq 1 ]; then \
				echo "	[SYSTEM] Unstowing $$pkg/$$sub from $$sub"; \
				sudo stow -D -d "$$pkg" -t "/$$sub" "$$sub"; \
			else \
				echo "	[USER] Unstowing $$pkg/$$sub from $(HOME_TARGET)/$$sub"; \
				stow -D -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \
			fi; \
		done; \
	done

link: check-stow
	@echo "Linking dotfiles to machine"
	@for pkg in $(PACKAGES); do \
		echo ">>> Processing package: $$pkg"; \
		for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \
			[ -d "$$subdir" ] || continue; \
			sub="$${subdir##*/}"; \
			is_sys=0; \
			for sys in $(SYSTEM_DIRS); do \
				[ "$$sub" == "$$sys" ] && is_sys=1 && break; \
			done; \
			if [ "$$is_sys" -eq 1 ]; then \
				echo "	[System] Stowing $$pkg/$$sub to $$sub"; \
				sudo stow -d "$$pkg" -t "/$$sub" "$$sub"; \
			else \
				echo "	[USER] Stowing $$pkg/$$sub to $(HOME_TARGET)/$$sub"; \
				stow -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \
			fi; \
		done; \
	done

# # Define variables
# HOME_TARGET ?= $(HOME)
# # Space-separated list of directories that should go to the system root
# SYSTEM_DIRS := etc usr var opt boot
# 
# # Find all top-level directories in your dotfiles repo (e.g., 'systemd', 'nvim')
# PACKAGES := $(patsubst %/,%,$(wildcard */))
# 
# .PHONY: all stow unstow
# 
# all: stow
# 
# stow:
# 	@for pkg in $(PACKAGES); do \
# 		echo ">>> Processing package: $$pkg"; \
# 		for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \
# 			[ -d "$$subdir" ] || continue; \
# 			sub="$${subdir##*/}"; \
# 			is_sys=0; \
# 			for sys in $(SYSTEM_DIRS); do \
# 				[ "$$sub" = "$$sys" ] && is_sys=1 && break; \
# 			done; \
# 			if [ "$$is_sys" -eq 1 ]; then \
# 				echo "    [System] Stowing $$pkg/$$sub to /$$sub"; \
# 				sudo mkdir -p "/$$sub"; \
# 				sudo stow -d "$$pkg" -t "/$$sub" "$$sub"; \
# 			else \
# 				echo "    [User]   Stowing $$pkg/$$sub to $(HOME_TARGET)/$$sub"; \
# 				mkdir -p "$(HOME_TARGET)/$$sub"; \
# 				stow -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \
# 			fi; \
# 		done; \
# 	done
# 
# unstow:
# 	@for pkg in $(PACKAGES); do \
# 		echo ">>> Unstowing package: $$pkg"; \
# 		for subdir in "$$pkg"/* "$$pkg"/.[!.]*; do \
# 			[ -d "$$subdir" ] || continue; \
# 			sub="$${subdir##*/}"; \
# 			is_sys=0; \
# 			for sys in $(SYSTEM_DIRS); do \
# 				[ "$$sub" = "$$sys" ] && is_sys=1 && break; \
# 			done; \
# 			if [ "$$is_sys" -eq 1 ]; then \
# 				echo "    [System] Unstowing $$pkg/$$sub from /$$sub"; \
# 				sudo stow -D -d "$$pkg" -t "/$$sub" "$$sub"; \
# 			else \
# 				echo "    [User]   Unstowing $$pkg/$$sub from $(HOME_TARGET)/$$sub"; \
# 				stow -D -d "$$pkg" -t "$(HOME_TARGET)/$$sub" "$$sub"; \
# 			fi; \
# 		done; \
# 	done
