#!/usr/bin/env bash
set -euo pipefail

MOSAIC_HOME="${MOSAIC_HOME:-$HOME/.config/mosaic}"
APPLY=0

usage() {
  cat <<USAGE
Usage: $(basename "$0") [--apply]

Migrate runtime-local skill directories (e.g. ~/.claude/skills/<name>) to Mosaic-managed
skills by replacing local directories with symlinks to ~/.config/mosaic/skills-local.

Default mode is dry-run.
USAGE
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --apply)
      APPLY=1
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "Unknown argument: $1" >&2
      usage >&2
      exit 1
      ;;
  esac
done

skill_roots=(
  "$HOME/.claude/skills"
  "$HOME/.codex/skills"
  "$HOME/.config/opencode/skills"
  "$HOME/.pi/agent/skills"
)

if [[ ! -d "$MOSAIC_HOME/skills-local" ]]; then
  echo "[mosaic-local-skills] Missing local skills dir: $MOSAIC_HOME/skills-local" >&2
  exit 1
fi

count=0

while IFS= read -r -d '' local_skill; do
  name="$(basename "$local_skill")"
  src="$MOSAIC_HOME/skills-local/$name"
  [[ -d "$src" ]] || continue

  for root in "${skill_roots[@]}"; do
    [[ -d "$root" ]] || continue
    target="$root/$name"

    # Already linked correctly.
    if [[ -L "$target" ]]; then
      target_real="$(readlink -f "$target" 2>/dev/null || true)"
      src_real="$(readlink -f "$src" 2>/dev/null || true)"
      if [[ -n "$target_real" && -n "$src_real" && "$target_real" == "$src_real" ]]; then
        continue
      fi
    fi

    # Only migrate local directories containing SKILL.md
    if [[ -d "$target" && -f "$target/SKILL.md" && ! -L "$target" ]]; then
      count=$((count + 1))
      if [[ $APPLY -eq 1 ]]; then
        stamp="$(date +%Y%m%d%H%M%S)"
        mv "$target" "${target}.mosaic-bak-${stamp}"
        ln -s "$src" "$target"
        echo "[mosaic-local-skills] migrated: $target -> $src"
      else
        echo "[mosaic-local-skills] would migrate: $target -> $src"
      fi
    fi
  done
done < <(find "$MOSAIC_HOME/skills-local" -mindepth 1 -maxdepth 1 \( -type d -o -type l \) -print0)

if [[ $APPLY -eq 1 ]]; then
  echo "[mosaic-local-skills] complete: migrated=$count"
else
  echo "[mosaic-local-skills] dry-run: migratable=$count"
  echo "[mosaic-local-skills] re-run with --apply to migrate"
fi
