BINARY        := streamdeck-go
HELPER        := streamdeck-helper
INIT          := streamdeck-init
PREFIX        ?= $(HOME)/.local
CONFIG_DIR    := $(HOME)/.config/streamdeck-go
GROUP         := streamdeck

# ── OS detection ──────────────────────────────────────────────────────────────
OS := $(shell uname -s)

ifeq ($(OS),Darwin)
  BIN_DIR        := $(HOME)/go/bin
  ETC_DIR        := /usr/local/etc/streamdeck-go
  LAUNCHAGENTS   := $(HOME)/Library/LaunchAgents
  LAUNCHDAEMONS  := /Library/LaunchDaemons
  AGENT_PLIST    := $(LAUNCHAGENTS)/com.woodarddigital.streamdeck-go.plist
  DAEMON_PLIST   := $(LAUNCHDAEMONS)/com.woodarddigital.streamdeck-go-helper.plist
else
  BIN_DIR        := $(PREFIX)/bin
  SYS_BIN        := /usr/local/bin
  ETC_DIR        := /etc/streamdeck-go
  SYSTEMD_USER   := $(HOME)/.config/systemd/user
  SYSTEMD_SYS    := /etc/systemd/system
  UDEV_RULE      := /etc/udev/rules.d/99-streamdeck.rules
endif

.PHONY: build build-helper build-init install install-helper install-watchdog uninstall uninstall-helper uninstall-watchdog udev

# ── Build ─────────────────────────────────────────────────────────────────────

build:
	go build -o $(BINARY) ./cmd/streamdeck/

build-helper:
	go build -o $(HELPER) ./cmd/streamdeck-helper/

build-init:
	go build -o $(INIT) ./cmd/streamdeck-init/

# ── Install ───────────────────────────────────────────────────────────────────

# Interactive install — prompts for dotfiles directory, installs binary + service.
install:
	@bash install.sh

# Install the privileged helper (requires sudo).
ifeq ($(OS),Darwin)
# On macOS there is no root daemon — privileged commands run via osascript (admin
# auth dialog). install-helper just drops the whitelist into the user config dir.
install-helper:
	mkdir -p $(CONFIG_DIR)
	@if [ ! -f $(CONFIG_DIR)/privileged.yaml ]; then \
		install -m 644 config/privileged.example.yaml $(CONFIG_DIR)/privileged.yaml; \
		echo "Whitelist written to $(CONFIG_DIR)/privileged.yaml"; \
	else \
		echo "Whitelist already exists — not overwriting"; \
	fi
	@echo ""
	@echo "Edit $(CONFIG_DIR)/privileged.yaml to add priv: commands."
	@echo "No sudo or daemon required — macOS will prompt for admin auth on use."
else
install-helper: build-helper
	# Create group and add current user (Linux).
	@if ! getent group $(GROUP) > /dev/null; then \
		sudo groupadd $(GROUP); \
		echo "Created group '$(GROUP)'"; \
	fi
	sudo usermod -aG $(GROUP) $(USER)
	# Install helper binary (owned root, not world-executable).
	sudo install -Dm750 $(HELPER) $(SYS_BIN)/$(HELPER)
	sudo chown root:$(GROUP) $(SYS_BIN)/$(HELPER)
	# Install whitelist config.
	sudo mkdir -p $(ETC_DIR)
	@if [ ! -f $(ETC_DIR)/privileged.yaml ]; then \
		sudo install -Dm640 config/privileged.example.yaml $(ETC_DIR)/privileged.yaml; \
		sudo chown root:$(GROUP) $(ETC_DIR)/privileged.yaml; \
		echo "Whitelist written to $(ETC_DIR)/privileged.yaml"; \
	else \
		echo "Whitelist already exists — not overwriting"; \
	fi
	# Install and enable system service.
	sudo install -Dm644 systemd/streamdeck-go-helper.service $(SYSTEMD_SYS)/streamdeck-go-helper.service
	sudo systemctl daemon-reload
	sudo systemctl enable --now streamdeck-go-helper.service
	@echo ""
	@echo "Helper installed. Edit $(ETC_DIR)/privileged.yaml (as root) to add commands."
	@echo "NOTE: log out and back in for group membership to take effect,"
	@echo "      or run: newgrp $(GROUP)"
endif

# Install the watchdog timer that detects USB unplug/replug and restarts the
# service when the daemon's in-process reconnect misses an event. Linux only.
ifeq ($(OS),Darwin)
WATCHDOG_PLIST     := $(LAUNCHAGENTS)/com.woodarddigital.streamdeck-go-watchdog.plist
WATCHDOG_LOG       := $(HOME)/Library/Logs/streamdeck-go-watchdog.log
install-watchdog:
	mkdir -p $(BIN_DIR) $(LAUNCHAGENTS) $(HOME)/Library/Logs
	install -m 755 systemd/streamdeck-go-watchdog.sh $(BIN_DIR)/streamdeck-go-watchdog
	# Substitute the binary and log paths into the plist.
	sed -e 's|STREAMDECK_WATCHDOG_PATH|$(BIN_DIR)/streamdeck-go-watchdog|' \
	    -e 's|STREAMDECK_WATCHDOG_LOG_PATH|$(WATCHDOG_LOG)|g' \
	    launchd/com.woodarddigital.streamdeck-go-watchdog.plist > $(WATCHDOG_PLIST)
	# Reload: bootout (ignore if not loaded) then bootstrap.
	launchctl bootout gui/$$(id -u)/com.woodarddigital.streamdeck-go-watchdog 2>/dev/null || true
	launchctl bootstrap gui/$$(id -u) $(WATCHDOG_PLIST)
	@echo ""
	@echo "Watchdog installed. Fires every 30s."
	@echo "  Logs: $(WATCHDOG_LOG)"
else
install-watchdog:
	install -Dm755 systemd/streamdeck-go-watchdog.sh $(BIN_DIR)/streamdeck-go-watchdog
	install -Dm644 systemd/streamdeck-go-watchdog.service $(SYSTEMD_USER)/streamdeck-go-watchdog.service
	install -Dm644 systemd/streamdeck-go-watchdog.timer $(SYSTEMD_USER)/streamdeck-go-watchdog.timer
	systemctl --user daemon-reload
	systemctl --user enable --now streamdeck-go-watchdog.timer
	@echo ""
	@echo "Watchdog timer installed and started."
	@echo "  Status:  systemctl --user status streamdeck-go-watchdog.timer"
	@echo "  Logs:    journalctl --user -u streamdeck-go-watchdog.service"
endif

# udev: Linux-only device permission rule.
udev:
ifeq ($(OS),Darwin)
	@echo "udev is Linux-only — not needed on macOS (IOKit grants HID access directly)."
else
	@if [ ! -f $(UDEV_RULE) ]; then \
		echo 'KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", MODE="0666"' \
			| sudo tee $(UDEV_RULE); \
		sudo udevadm control --reload; \
		sudo udevadm trigger; \
		echo "udev rule installed."; \
	else \
		echo "udev rule already exists."; \
	fi
endif

# ── Uninstall ─────────────────────────────────────────────────────────────────

ifeq ($(OS),Darwin)
uninstall:
	launchctl unload $(AGENT_PLIST) 2>/dev/null || true
	rm -f $(AGENT_PLIST)
	rm -f $(BIN_DIR)/$(BINARY)
	@echo "Uninstalled. Config at $(CONFIG_DIR) preserved."

uninstall-helper:
	@echo "No helper daemon on macOS — nothing to uninstall."
	@echo "Whitelist at $(CONFIG_DIR)/privileged.yaml preserved."

uninstall-watchdog:
	launchctl bootout gui/$$(id -u)/com.woodarddigital.streamdeck-go-watchdog 2>/dev/null || true
	rm -f $(WATCHDOG_PLIST)
	rm -f $(BIN_DIR)/streamdeck-go-watchdog
	@echo "Watchdog uninstalled."
else
uninstall:
	systemctl --user disable --now streamdeck-go.service || true
	rm -f $(BIN_DIR)/$(BINARY)
	rm -f $(SYSTEMD_USER)/streamdeck-go.service
	systemctl --user daemon-reload
	@echo "Uninstalled. Config at $(CONFIG_DIR) preserved."

uninstall-watchdog:
	systemctl --user disable --now streamdeck-go-watchdog.timer || true
	rm -f $(BIN_DIR)/streamdeck-go-watchdog
	rm -f $(SYSTEMD_USER)/streamdeck-go-watchdog.service
	rm -f $(SYSTEMD_USER)/streamdeck-go-watchdog.timer
	systemctl --user daemon-reload
	@echo "Watchdog uninstalled."

uninstall-helper:
	sudo systemctl disable --now streamdeck-go-helper.service || true
	sudo rm -f $(SYS_BIN)/$(HELPER)
	sudo rm -f $(SYSTEMD_SYS)/streamdeck-go-helper.service
	sudo systemctl daemon-reload
	@echo "Helper uninstalled. Whitelist at $(ETC_DIR)/privileged.yaml preserved."
endif
