#!/usr/bin/env bash
# ==============================================================
# tags-report.sh — Top 20 tags de tu vault de notas
#
# Extrae el frontmatter de todas las notas Markdown, recopila
# los tags, los cuenta y muestra un ranking ordenado por
# frecuencia de uso.
#
# Uso:  ./tags-report.sh [ruta-al-vault]
#       Si no se especifica ruta, usa el directorio actual.
#
# Dependencias:  fd, yq (Mike Farah), jq
#
# Ejemplo:  ./tags-report.sh ~/notas
# ==============================================================

VAULT="${1:-.}"

# ─── Cabecera ────────────────────────────────────────────────────
echo "=========================================="
echo "  Tags Report — $(date +'%d/%m/%Y')"
echo "  Vault: $VAULT"
echo "=========================================="
echo ""

# ─── Verificar herramientas ──────────────────────────────────────
for cmd in fd yq jq; do
    if ! command -v "$cmd" &>/dev/null; then
        echo "[ERROR] '$cmd' no está instalado."
        echo "  Instálalo con:"
        echo "  - fd:  sudo apt install fd-find"
        echo "  - yq:  sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq"
        echo "  - jq:  sudo apt install jq"
        exit 1
    fi
done

# ─── Pipeline principal ──────────────────────────────────────────
REPORT=$(fd -e md "$VAULT" -x yq --front-matter=extract -o=json '.tags // []' 2>/dev/null \
  | jq -s '
      add
      | group_by(.)
      | map({tag: .[0], count: length})
      | sort_by(-.count)
      | .[:20][]
      | "\(.count)  \(.tag)"
    ' -r
)
if [[ -n "$REPORT" ]]; then
    echo "$REPORT"
else
    echo "  ⚠️  salida vacía: revisa que yq emita JSON (-o=json) antes de jq"
fi

# ─── Resumen ─────────────────────────────────────────────────────
echo ""
TOTAL_NOTAS=$(find "$VAULT" -name '*.md' | wc -l)
echo "  Notas analizadas: $TOTAL_NOTAS"
echo ""

# ==============================================================
# Notas:
#
# 1. '// []' es el operador default de yq: si '.tags' no existe
#    o es null, devuelve un array vacío en lugar de null.
#
# 2. '2>/dev/null' descarta errores de archivos sin frontmatter
#    o que no son YAML válido.
#
# 3. '.[:20]' limita el resultado a los 20 tags más usados.
#
# 4. La flag '-r' de jq produce raw output (sin comillas en
#    los strings), ideal para formatear la salida.
# ==============================================================