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

BASE="${1:-/home/iotcuboc/pyme}"
WEBROOT="${2:-/home/iotcuboc/mypyme360.com}"
DOMINIO="${3:-https://mypyme360.com}"
MARCA="$(date +%Y%m%d_%H%M%S)"
AUDITORIA="$BASE/auditorias/public_$MARCA"
PUBLICO="$BASE/public"

fallar() { echo "ERROR: $*" >&2; exit 1; }
aviso() { echo "AVISO: $*" >&2; }
ok() { printf 'OK    %s\n' "$*"; }

[[ -d "$BASE" ]] || fallar "No existe el proyecto: $BASE"
[[ -d "$PUBLICO" ]] || fallar "No existe el directorio público: $PUBLICO"
[[ -d "$WEBROOT" ]] || fallar "No existe el document root: $WEBROOT"
[[ -f "$BASE/config/db.php" ]] || aviso "No se encontró config/db.php; revise si BASE es correcto."

for comando in find sort grep sed awk tar sha256sum comm wc date; do
  command -v "$comando" >/dev/null 2>&1 || fallar "Falta el comando requerido: $comando"
done

mkdir -p "$AUDITORIA"
printf '%s\n' "$BASE" > "$AUDITORIA/proyecto.txt"
printf '%s\n' "$WEBROOT" > "$AUDITORIA/document_root_configurado.txt"
printf '%s\n' "$DOMINIO" > "$AUDITORIA/dominio.txt"

if command -v readlink >/dev/null 2>&1; then
  readlink -f "$WEBROOT/public_app" > "$AUDITORIA/public_app_resuelto.txt" 2>/dev/null || true
fi

find "$PUBLICO" -maxdepth 1 -type f -printf '%f\n' | sort > "$AUDITORIA/archivos_publicos.txt"
find "$PUBLICO" -maxdepth 1 -type f -name '*.php' -printf '%f\n' | sort > "$AUDITORIA/paginas_php.txt"
TOTAL_PHP="$(wc -l < "$AUDITORIA/paginas_php.txt" | tr -d ' ')"
ok "Inventario creado: $TOTAL_PHP páginas PHP"

tar -czf "$AUDITORIA/public_antes_de_saneamiento.tar.gz" -C "$BASE" public
sha256sum "$AUDITORIA/public_antes_de_saneamiento.tar.gz" > "$AUDITORIA/public_antes_de_saneamiento.sha256"
tar -tzf "$AUDITORIA/public_antes_de_saneamiento.tar.gz" >/dev/null
ok "Respaldo comprimido creado y verificado"

[[ ! -f "$WEBROOT/.htaccess" ]] || cp -p "$WEBROOT/.htaccess" "$AUDITORIA/htaccess_document_root.txt"
[[ ! -f "$PUBLICO/.htaccess" ]] || cp -p "$PUBLICO/.htaccess" "$AUDITORIA/htaccess_public.txt"

grep -RhoE --include='*.php' --include='*.js' --include='*.html' '[A-Za-z0-9_-]+\.php' \
  "$BASE/app" "$PUBLICO" "$BASE/config" 2>/dev/null | sort -u > "$AUDITORIA/paginas_referenciadas.txt" || true

ARCHIVOS_MENU=()
for candidato in "$BASE/app/includes/menu_v3.php" "$PUBLICO/dashboard_v3.php" "$PUBLICO/mas_v3.php"; do
  [[ ! -f "$candidato" ]] || ARCHIVOS_MENU+=("$candidato")
done
if (( ${#ARCHIVOS_MENU[@]} > 0 )); then
  grep -hoE '[A-Za-z0-9_-]+\.php' "${ARCHIVOS_MENU[@]}" 2>/dev/null | sort -u > "$AUDITORIA/paginas_menu.txt" || true
else
  : > "$AUDITORIA/paginas_menu.txt"
fi

comm -23 "$AUDITORIA/paginas_php.txt" "$AUDITORIA/paginas_referenciadas.txt" > "$AUDITORIA/paginas_sin_referencias.txt"

find "$PUBLICO" -maxdepth 1 -type f \
  \( -name '*_v1.php' -o -name '*_v2.php' -o -name '*.bak.php' -o -name '*_old.php' -o -name '*_copia.php' -o -name '*backup*.php' \) \
  -printf '%f\n' | sort > "$AUDITORIA/candidatas_antiguas.txt"

sed -E 's/_v[0-9]+\.php$/.php/' "$AUDITORIA/paginas_php.txt" | sort | uniq -d > "$AUDITORIA/familias_con_versiones.txt"
find "$PUBLICO" -maxdepth 1 -type f -iname '*presupuest*.php' -printf '%f\n' | sort > "$AUDITORIA/paginas_presupuestos.txt"

: > "$AUDITORIA/referencias_por_pagina.tsv"
while IFS= read -r pagina; do
  referencias="$( (grep -RIl --include='*.php' --include='*.js' --include='*.html' -F "$pagina" "$BASE/app" "$PUBLICO" "$BASE/config" 2>/dev/null || true) | wc -l | tr -d ' ')"
  en_menu='NO'
  grep -Fxq "$pagina" "$AUDITORIA/paginas_menu.txt" && en_menu='SI'
  printf '%s\t%s\t%s\n' "$pagina" "$referencias" "$en_menu" >> "$AUDITORIA/referencias_por_pagina.tsv"
done < "$AUDITORIA/paginas_php.txt"

: > "$AUDITORIA/sintaxis_php.tsv"
ERRORES_PHP=0
if command -v php >/dev/null 2>&1; then
  while IFS= read -r pagina; do
    if salida="$(php -l "$PUBLICO/$pagina" 2>&1)"; then
      printf '%s\tOK\n' "$pagina" >> "$AUDITORIA/sintaxis_php.tsv"
    else
      printf '%s\tERROR\t%s\n' "$pagina" "$(printf '%s' "$salida" | tr '\n' ' ')" >> "$AUDITORIA/sintaxis_php.tsv"
      ERRORES_PHP=$((ERRORES_PHP + 1))
    fi
  done < "$AUDITORIA/paginas_php.txt"
  ok "Sintaxis PHP revisada: $ERRORES_PHP error(es)"
else
  aviso "PHP CLI no disponible; no se ejecutó php -l."
  printf 'PHP CLI no disponible\n' > "$AUDITORIA/sintaxis_php.tsv"
fi

: > "$AUDITORIA/http_candidatas.tsv"
if command -v curl >/dev/null 2>&1; then
  while IFS= read -r pagina; do
    codigo="$(curl -k -sS -o /dev/null -w '%{http_code}' --max-time 15 "$DOMINIO/$pagina" 2>/dev/null || true)"
    [[ -n "$codigo" ]] || codigo='000'
    printf '%s\t%s\n' "$pagina" "$codigo" >> "$AUDITORIA/http_candidatas.tsv"
  done < "$AUDITORIA/candidatas_antiguas.txt"
else
  aviso "curl no disponible; se omitieron las pruebas HTTP."
fi

: > "$AUDITORIA/clasificacion_preliminar.tsv"
while IFS=$'\t' read -r pagina referencias menu; do
  clase='REVISAR'
  motivo='Página pública con referencias; confirmar función.'
  if [[ "$menu" == 'SI' ]]; then
    clase='MANTENER'; motivo='Aparece enlazada desde el menú o dashboard.'
  elif grep -Fxq "$pagina" "$AUDITORIA/candidatas_antiguas.txt"; then
    clase='CANDIDATA_LEGACY'; motivo='Nombre de versión antigua; revisar referencias antes de mover.'
  elif [[ "$referencias" == '0' ]]; then
    clase='SIN_REFERENCIAS'; motivo='No se encontraron referencias internas; puede ser endpoint o enlace externo.'
  fi
  printf '%s\t%s\t%s\t%s\n' "$pagina" "$clase" "$referencias" "$motivo" >> "$AUDITORIA/clasificacion_preliminar.tsv"
done < "$AUDITORIA/referencias_por_pagina.tsv"

{
  echo 'AUDITORÍA DE ARCHIVOS PÚBLICOS MYPYME360'
  echo "Fecha: $(date -Is)"
  echo "Proyecto: $BASE"
  echo "Directorio público: $PUBLICO"
  echo "Dominio: $DOMINIO"
  echo
  echo "Páginas PHP: $TOTAL_PHP"
  echo "Páginas del menú: $(wc -l < "$AUDITORIA/paginas_menu.txt" | tr -d ' ')"
  echo "Candidatas antiguas: $(wc -l < "$AUDITORIA/candidatas_antiguas.txt" | tr -d ' ')"
  echo "Sin referencias internas: $(wc -l < "$AUDITORIA/paginas_sin_referencias.txt" | tr -d ' ')"
  echo "Errores de sintaxis PHP: $ERRORES_PHP"
  echo
  echo '=== PÁGINAS DEL MENÚ ==='
  cat "$AUDITORIA/paginas_menu.txt"
  echo
  echo '=== CANDIDATAS ANTIGUAS ==='
  cat "$AUDITORIA/candidatas_antiguas.txt"
  echo
  echo '=== PÁGINAS DE PRESUPUESTOS ==='
  cat "$AUDITORIA/paginas_presupuestos.txt"
  echo
  echo '=== SIN REFERENCIAS INTERNAS ==='
  cat "$AUDITORIA/paginas_sin_referencias.txt"
  echo
  echo '=== FAMILIAS CON VARIAS VERSIONES ==='
  cat "$AUDITORIA/familias_con_versiones.txt"
  echo
  echo 'No se movió, bloqueó ni eliminó ningún archivo.'
} > "$AUDITORIA/resumen.txt"

cp -p "$AUDITORIA/resumen.txt" "$BASE/auditorias/ULTIMA_AUDITORIA_PUBLICA.txt"

echo
echo 'AUDITORÍA COMPLETADA SIN MODIFICAR EL SITIO'
echo "Informe: $AUDITORIA/resumen.txt"
echo "Clasificación: $AUDITORIA/clasificacion_preliminar.tsv"
echo "Respaldo: $AUDITORIA/public_antes_de_saneamiento.tar.gz"
echo
cat "$AUDITORIA/resumen.txt"
