#!/usr/bin/env bash
# One-shot, host-aware dotfile linker for Linux & macOS.
#
#   home_root/*    ->  ~/<name>           (e.g. ~/.zshrc)       via `stow home_root`
#   home_config/*  ->  ~/.config/<name>   (e.g. ~/.config/nvim) via `stow home_config`
#
# Ensures GNU stow is present first (Homebrew on macOS; apt/dnf/pacman on Linux),
# so a fresh box needs nothing pre-installed. Re-running is safe — stow is
# idempotent and refuses to clobber unrelated real files.
#
# Windows / PowerShell: run ./link-dotfiles.ps1 instead (stow has no native
# Windows port; the .ps1 mirrors this with junctions + symlinks).
set -euo pipefail

repo="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$repo"

# `--apps`: install all host CLI tools first, then link. Without it, this only
# links (fast + idempotent). App install is delegated to the host-aware
# lk-installers/install-apps.
if [ "${1:-}" = "--apps" ]; then
  echo "Installing apps first (--apps)…"
  "$repo/lk-installers/install-apps"
fi

ensure_stow() {
  command -v stow >/dev/null 2>&1 && return

  echo "GNU stow not found — installing it…"
  case "$(uname -s)" in
    Darwin)
      if ! command -v brew >/dev/null 2>&1; then
        echo "error: Homebrew is required on macOS. Run ./lk-installers/install-apps (or ./link-dotfiles --apps) first." >&2
        exit 1
      fi
      brew install stow
      ;;
    Linux)
      if   command -v apt    >/dev/null 2>&1; then sudo apt update && sudo apt install -y stow
      elif command -v dnf    >/dev/null 2>&1; then sudo dnf install -y stow
      elif command -v pacman >/dev/null 2>&1; then sudo pacman -S --noconfirm stow
      else
        echo "error: no supported package manager (apt/dnf/pacman). Install GNU stow manually." >&2
        exit 1
      fi
      ;;
    *)
      echo "error: unsupported OS '$(uname -s)'. On Windows run ./link-dotfiles.ps1 instead." >&2
      exit 1
      ;;
  esac
}

ensure_stow

echo "Linking home_root  -> ~"
stow -v home_root
echo "Linking home_config -> ~/.config"
stow -v --target="$HOME/.config" home_config

echo "Done."
