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

# Normaliza patrones comunes de Twig que suelen generar avisos de Intelephense.
# Modo de uso:
#   scripts/fix_twig_intelephense.sh --file src/.../archivo.twig
#   scripts/fix_twig_intelephense.sh --all
# Opcional:
#   --no-backup   No crea copia .bak de cada archivo

ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
MAKE_BACKUP=1
MODE=""
TARGET_FILE=""

print_help() {
  cat <<'EOF'
Uso:
  scripts/fix_twig_intelephense.sh --file <ruta/twig>
  scripts/fix_twig_intelephense.sh --all

Opciones:
  --no-backup   No genera archivo .bak antes de modificar
  -h, --help    Muestra esta ayuda

Notas:
  - --file acepta ruta relativa al proyecto o absoluta.
  - --all recorre todos los .twig versionados por git.
  - El script aplica normalizaciones conservadoras y seguras.
EOF
}

if [[ $# -eq 0 ]]; then
  print_help
  exit 1
fi

while [[ $# -gt 0 ]]; do
  case "$1" in
    --file)
      MODE="file"
      TARGET_FILE="${2:-}"
      shift 2
      ;;
    --all)
      MODE="all"
      shift
      ;;
    --no-backup)
      MAKE_BACKUP=0
      shift
      ;;
    -h|--help)
      print_help
      exit 0
      ;;
    *)
      echo "Error: opción desconocida: $1" >&2
      print_help
      exit 1
      ;;
  esac
done

if [[ "$MODE" != "file" && "$MODE" != "all" ]]; then
  echo "Error: debes indicar --file o --all" >&2
  exit 1
fi

normalize_twig_file() {
  local file="$1"

  if [[ ! -f "$file" ]]; then
    echo "Omitido (no existe): $file"
    return 0
  fi

  if [[ "${file##*.}" != "twig" ]]; then
    echo "Omitido (no es twig): $file"
    return 0
  fi

  if [[ $MAKE_BACKUP -eq 1 ]]; then
    cp "$file" "$file.bak"
  fi

  # Reglas conservadoras para patrones recurrentes reportados por Intelephense.
  perl -0777 -i -pe '
    s/\{\{\s*include\(/{{ include(/g;
    s/\{\{\s*asset\(/{{ asset(/g;
    s/\{\{\s*path\(/{{ path(/g;
    s/\{\{\s*form_widget\(([^)]*)\)\s*\}\}/{{ form_widget($1) }}/g;
    s/\{\{\s*form_label\(([^)]*)\)\s*\}\}/{{ form_label($1) }}/g;
    s/\{\{\s*form_errors\(([^)]*)\)\s*\}\}/{{ form_errors($1) }}/g;
    s/\{\{\s*form_start\(([^)]*)\)\s*\}\}/{{ form_start($1) }}/g;
    s/\{\{\s*form_end\(([^)]*)\)\s*\}\}/{{ form_end($1) }}/g;
    s/\{\{\s*form_rest\(([^)]*)\)\s*\}\}/{{ form_rest($1) }}/g;
    s/\|\s+json_encode\s+\|\s+raw/|json_encode|raw/g;
    s/\{\%\s*block\s+([A-Za-z0-9_]+)\s+\%\}/{% block $1 %}/g;
    # Normaliza {{ ... }} sin acumular espacios en corridas repetidas.
    s/\{\{\s*(\S(?:.*?\S)?)\s*\}\}/{{ $1 }}/gs;
  ' "$file"

  # Ajustes de espaciado frecuentes en mapas de parámetros Twig.
  perl -i -pe "s/\{([A-Za-z_][A-Za-z0-9_]*)\s*:\s*/{\$1: /g; s/,\s*([A-Za-z_][A-Za-z0-9_]*)\s*:\s*/, \$1: /g" "$file"

  echo "OK: $file"
}

if [[ "$MODE" == "file" ]]; then
  if [[ -z "$TARGET_FILE" ]]; then
    echo "Error: --file requiere ruta" >&2
    exit 1
  fi

  if [[ "$TARGET_FILE" = /* ]]; then
    FILE_PATH="$TARGET_FILE"
  else
    FILE_PATH="$ROOT_DIR/$TARGET_FILE"
  fi

  normalize_twig_file "$FILE_PATH"
else
  while IFS= read -r twig_file; do
    normalize_twig_file "$ROOT_DIR/$twig_file"
  done < <(cd "$ROOT_DIR" && git ls-files '*.twig')
fi

echo "Finalizado."
