#!/usr/bin/env bash
# Bootstrap dotfiles tooling on headless agent boxes (Factory, Devin, etc.)
# Usage:
#   curl -fsSL https://raw.githubusercontent.com/edmundmiller/dotfiles/main/bin/bootstrap | bash
#   # or from repo root:
#   ./bin/bootstrap
set -euo pipefail

# --- Config ---
DOTFILES_REPO="https://github.com/edmundmiller/dotfiles.git"
DOTFILES_DIR="${DOTFILES_DIR:-$HOME/.config/dotfiles}"

# --- Colors ---
info()  { printf '\033[1;34m[bootstrap]\033[0m %s\n' "$*"; }
warn()  { printf '\033[1;33m[bootstrap]\033[0m %s\n' "$*"; }
error() { printf '\033[1;31m[bootstrap]\033[0m %s\n' "$*" >&2; }

# --- Install Nix (Determinate Systems) ---
install_nix() {
  if command -v nix &>/dev/null; then
    info "nix already installed: $(nix --version)"
    return
  fi

  info "installing nix (Determinate Systems installer)..."
  curl -fsSL https://install.determinate.systems/nix | sh -s -- install --no-confirm

  # Source nix profile for current shell
  if [ -f /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh ]; then
    # shellcheck disable=SC1091
    . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
  fi

  info "nix installed: $(nix --version)"
}

# --- Clone dotfiles ---
clone_dotfiles() {
  if [ -d "$DOTFILES_DIR" ]; then
    info "dotfiles already at $DOTFILES_DIR"
    return
  fi

  info "cloning dotfiles → $DOTFILES_DIR"
  git clone "$DOTFILES_REPO" "$DOTFILES_DIR"
}

# --- Install packages from flake devShell ---
install_tools() {
  info "installing agent tooling from flake..."
  nix profile install "$DOTFILES_DIR#agent-env" --accept-flake-config
  info "tools installed to nix profile"
}

# --- Symlink agent configs ---
link_configs() {
  info "linking agent configs..."

  # AGENTS.md / rules
  mkdir -p "$HOME/.config/dotfiles"
  if [ "$DOTFILES_DIR" != "$HOME/.config/dotfiles" ]; then
    ln -sfn "$DOTFILES_DIR" "$HOME/.config/dotfiles"
  fi

  # Git config (minimal — just name/email/defaults)
  if [ ! -f "$HOME/.gitconfig" ] && [ -n "${GIT_USER_NAME:-}" ]; then
    git config --global user.name "$GIT_USER_NAME"
    git config --global user.email "$GIT_USER_EMAIL"
  fi

  # Agent skills (shared cross-agent skills)
  mkdir -p "$HOME/.pi/agent/skills"
  if [ -d "$DOTFILES_DIR/config/agents/skills" ]; then
    for skill_dir in "$DOTFILES_DIR"/config/agents/skills/*/; do
      skill_name=$(basename "$skill_dir")
      ln -sfn "$skill_dir" "$HOME/.pi/agent/skills/$skill_name"
    done
    info "linked $(ls -d "$DOTFILES_DIR"/config/agents/skills/*/ 2>/dev/null | wc -l | tr -d ' ') shared skills"
  fi

  # AGENTS.md for repos the agent works in
  if [ -f "$DOTFILES_DIR/config/agents/rules/01-tone-and-style.md" ]; then
    mkdir -p "$HOME/.pi/agent"
    cat "$DOTFILES_DIR"/config/agents/rules/[0-9]*.md > "$HOME/.pi/agent/AGENTS.md" 2>/dev/null || true
    info "generated AGENTS.md from rules"
  fi
}

# --- Main ---
main() {
  info "bootstrapping headless agent environment..."

  install_nix
  clone_dotfiles
  install_tools
  link_configs

  info "done. tools available in current shell."
  info "run 'nix develop $DOTFILES_DIR#agent' for a full dev shell."
}

main "$@"
