#!/usr/bin/env bash
# _run-hook.sh — Wrapper resiliente para ejecutar hooks SWL.
#
# Resuelve la ruta a `node` en entornos donde el PATH no lo incluye
# (típico: git-bash/MinGW en Windows cuando Claude Code lo lanza). Esto
# evita el error "/usr/bin/bash: line 1: node: command not found" que
# aparecía cuando settings.json tenía `node -e "..."` sin prefix.
#
# Uso desde .claude/settings.json:
#   "command": "bash ./hooks/_run-hook.sh <nombre-del-hook>.js"
#
# También se puede pasar la ruta absoluta (modo global):
#   "command": "bash /ruta/absoluta/hooks/_run-hook.sh /ruta/abs/hook.js"
#
# Nunca falla el hook por error de resolución: si no encuentra node, sale
# con código 0 silencioso (hooks SWL son non-blocking por diseño).

set +e

HOOK_SPEC="${1:-}"
[ -z "$HOOK_SPEC" ] && exit 0

# 1. node en PATH (caso ideal: Linux, macOS, Windows con PATH ok)
NODE_BIN="$(command -v node 2>/dev/null)"

# 2. Fallback a ubicaciones típicas en Windows
if [ -z "$NODE_BIN" ]; then
  for candidate in \
    "/c/Program Files/nodejs/node.exe" \
    "/c/Program Files (x86)/nodejs/node.exe" \
    "$HOME/AppData/Roaming/npm/node.exe" \
    "/usr/local/bin/node" \
    "/opt/homebrew/bin/node"; do
    if [ -x "$candidate" ]; then
      NODE_BIN="$candidate"
      break
    fi
  done
fi

# 3. Sin node → salir silenciosamente (hooks son non-blocking)
[ -z "$NODE_BIN" ] && exit 0

# Detectar si HOOK_SPEC es ruta absoluta o nombre relativo
if [ -f "$HOOK_SPEC" ]; then
  # Ruta absoluta o relativa válida
  HOOK_PATH="$HOOK_SPEC"
else
  # Asumir nombre relativo desde ./hooks/
  HOOK_PATH="./hooks/$HOOK_SPEC"
fi

# Ejecutar el hook con wrapper resiliente MODULE_NOT_FOUND
"$NODE_BIN" -e "try{require('$HOOK_PATH')}catch(e){if(e.code!=='MODULE_NOT_FOUND')throw e}"

# Siempre exit 0 (non-blocking)
exit 0
