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

tracked_skills_dir="${1:?usage: setup_codex_skills TRACKED_SKILLS_DIR [RUNTIME_SKILLS_DIR] [CODEX_SKILLS_LINK]}"
runtime_skills_dir="${2:-${XDG_DATA_HOME:-$HOME/.local/share}/codex/skills}"
codex_skills_link="${3:-$HOME/.codex/skills}"

mkdir -p "$runtime_skills_dir"
mkdir -p "$(dirname "$codex_skills_link")"

# Preserve generated Codex skill bundles while moving them out of the git worktree.
for generated_name in .system codex-primary-runtime; do
  generated_src="$tracked_skills_dir/$generated_name"
  generated_dest="$runtime_skills_dir/$generated_name"
  if [[ -e "$generated_src" && ! -e "$generated_dest" ]]; then
    mv "$generated_src" "$generated_dest"
  fi
done

if [[ -L "$codex_skills_link" ]]; then
  current_target="$(readlink "$codex_skills_link")"
  if [[ "$current_target" != "$runtime_skills_dir" ]]; then
    rm -f "$codex_skills_link"
  fi
elif [[ -e "$codex_skills_link" ]]; then
  echo "Skipping $codex_skills_link because it exists and is not a symlink" >&2
  codex_skills_link=""
fi

if [[ -n "$codex_skills_link" && ! -e "$codex_skills_link" ]]; then
  ln -s "$runtime_skills_dir" "$codex_skills_link"
fi

for skill_src in "$tracked_skills_dir"/*; do
  [[ -e "$skill_src" || -L "$skill_src" ]] || continue

  skill_name="$(basename "$skill_src")"
  case "$skill_name" in
    .system|codex-primary-runtime)
      continue
      ;;
  esac

  skill_dest="$runtime_skills_dir/$skill_name"
  if [[ -L "$skill_dest" ]]; then
    current_target="$(readlink "$skill_dest")"
    if [[ "$current_target" == "$skill_src" ]]; then
      continue
    fi
    rm -f "$skill_dest"
  elif [[ -e "$skill_dest" ]]; then
    echo "Skipping skill $skill_name because $skill_dest already exists and is not a symlink" >&2
    continue
  fi

  ln -s "$skill_src" "$skill_dest"
done
