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

MODO="${1:---simular}"
BASE="${2:-/home/iotcuboc/pyme}"
DOMINIO="${3:-https://mypyme360.com}"
PUBLICO="$BASE/public"
MARCA="$(date +%Y%m%d_%H%M%S)"
CUARENTENA="$BASE/legacy_public/cuarentena_v2_$MARCA"
TEMPORAL="$(mktemp -d)"

LEGACY=(
  agenda_v2.php
  ajuste_stock_v2.php
  categorias_v2.php
  clientes_old.php
  clientes_v2.php
  compra_corregir_v2.php
  compra_editar_v2.php
  compras_v2.php
  costos_v2.php
  dashboard_v2.php
  gastos_v2.php
  item_variantes_v2.php
  items_v2.php
  login_v2.php
  logout_v2.php
  marcas_v2.php
  mas_v2.php
  master_empresas_v2.php
  master_modulos_v2.php
  master_usuarios_v2.php
  movimientos_stock_v2.php
  pedidos_v2.php
  presupuesto_cliente_v2.php
  presupuesto_costos_v2.php
  presupuesto_editar_v1.php
  presupuesto_editar_v2.php
  presupuesto_pdf_v2.php
  presupuesto_presentacion_v2.php
  presupuesto_publico_v2.php
  presupuesto_responder_v2.php
  presupuestos_v2.php
  produccion_v2.php
  productos_v2.php
  recetas_v1.php
  recetas_v2.php
  servicios_ejecuciones_v2.php
  servicios_v2.php
  stock_v2.php
  unidades_v2.php
  venta_editar_v2.php
  ventas_v2.php
  'presupuesto_editar:v3.php'
)

VIGENTES=(
  login_v3.php dashboard_v3.php items_v3.php recetas_v3.php productos_v3.php
  compras_v3.php ventas_v3.php presupuestos_v3.php presupuesto_editar_v3.php
  presupuesto_publico_v3.php stock_v3.php movimientos_stock_v3.php
)

fallar(){ echo "ERROR: $*" >&2; exit 1; }
ok(){ printf 'OK    %s\n' "$*"; }
es_legacy(){ local buscado="$1" x; for x in "${LEGACY[@]}"; do [[ "$x" != "$buscado" ]] || return 0; done; return 1; }

[[ "$MODO" == '--simular' || "$MODO" == '--aplicar' ]] || fallar "Modo inválido. Use --simular o --aplicar."
[[ -d "$PUBLICO" ]] || fallar "No existe $PUBLICO"
for cmd in php tar sha256sum grep find curl mv cp mktemp basename dirname sort; do command -v "$cmd" >/dev/null 2>&1 || fallar "Falta el comando $cmd"; done

echo "Modo: $MODO"
echo "Proyecto: $BASE"
echo "Dominio: $DOMINIO"
echo "Archivos definidos: ${#LEGACY[@]}"

FALTANTES=0
for archivo in "${LEGACY[@]}"; do
  if [[ ! -f "$PUBLICO/$archivo" ]]; then
    echo "FALTA $archivo"
    FALTANTES=$((FALTANTES+1))
  fi
done
[[ "$FALTANTES" == 0 ]] || fallar "Faltan $FALTANTES archivos de la lista; no se hará nada."
ok "Los ${#LEGACY[@]} archivos existen"

for archivo in "${VIGENTES[@]}"; do
  [[ -f "$PUBLICO/$archivo" ]] || fallar "Falta la página vigente $archivo"
  php -l "$PUBLICO/$archivo" >/dev/null || fallar "Error PHP en página vigente $archivo"
done
ok "Páginas v3 esenciales presentes y con sintaxis válida"

REFERENCIAS_EXTERNAS=0
INFORME_REFERENCIAS="$(mktemp)"
for archivo in "${LEGACY[@]}"; do
  ARCHIVO_REFERENCIAS="$TEMPORAL/referencias_${archivo//[^A-Za-z0-9]/_}.txt"
  grep -RIlF --include='*.php' --include='*.js' --include='*.html' "$archivo" "$BASE/app" "$PUBLICO" "$BASE/config" 2>/dev/null > "$ARCHIVO_REFERENCIAS" || true
  while IFS= read -r referencia; do
    [[ -n "$referencia" ]] || continue
    relativo="${referencia#$BASE/}"
    nombre="$(basename "$referencia")"
    if [[ "$relativo" == 'app/includes/menu_v2.php' ]] || es_legacy "$nombre"; then
      continue
    fi
    printf '%s <- %s\n' "$archivo" "$relativo" >> "$INFORME_REFERENCIAS"
    REFERENCIAS_EXTERNAS=$((REFERENCIAS_EXTERNAS+1))
  done < "$ARCHIVO_REFERENCIAS"
done
if (( REFERENCIAS_EXTERNAS > 0 )); then
  cat "$INFORME_REFERENCIAS" >&2
  fallar "Se encontraron $REFERENCIAS_EXTERNAS referencias desde archivos no incluidos en la cuarentena."
fi
ok "No existen referencias desde páginas v3 hacia el bloque legacy"

ERRORES_LEGACY=0
for archivo in "${LEGACY[@]}"; do
  if ! php -l "$PUBLICO/$archivo" >/dev/null; then
    echo "PHP ERROR (legacy): $archivo"
    ERRORES_LEGACY=$((ERRORES_LEGACY+1))
  fi
done
ok "Revisión legacy completada: $ERRORES_LEGACY error(es) de sintaxis"

if [[ "$MODO" == '--simular' ]]; then
  echo
  echo 'SIMULACIÓN COMPLETADA: NO SE MODIFICÓ NINGÚN ARCHIVO'
  printf 'Movería: %s\n' "${LEGACY[@]}"
  echo
  echo 'Para aplicar, ejecute:'
  echo "bash $0 --aplicar $BASE $DOMINIO"
  exit 0
fi

mkdir -p "$CUARENTENA/public"
printf '%s\n' "${LEGACY[@]}" > "$CUARENTENA/MANIFEST.txt"
tar -czf "$CUARENTENA/legacy_antes_de_mover.tar.gz" -C "$PUBLICO" "${LEGACY[@]}"
sha256sum "$CUARENTENA/legacy_antes_de_mover.tar.gz" > "$CUARENTENA/legacy_antes_de_mover.sha256"
tar -tzf "$CUARENTENA/legacy_antes_de_mover.tar.gz" >/dev/null
ok "Respaldo específico creado y verificado"

MOVIDOS=0
restaurar_error(){
  local codigo=$?
  echo "ERROR durante la aplicación (código $codigo). Restaurando..." >&2
  local archivo
  for archivo in "${LEGACY[@]}"; do
    if [[ -f "$CUARENTENA/public/$archivo" && ! -e "$PUBLICO/$archivo" ]]; then
      mv "$CUARENTENA/public/$archivo" "$PUBLICO/$archivo" || true
    fi
  done
  echo "Restauración automática terminada." >&2
}
trap restaurar_error ERR

for archivo in "${LEGACY[@]}"; do
  mv "$PUBLICO/$archivo" "$CUARENTENA/public/$archivo"
  MOVIDOS=$((MOVIDOS+1))
done
[[ "$MOVIDOS" == "${#LEGACY[@]}" ]] || false
ok "$MOVIDOS archivos trasladados fuera de public"

ERRORES_RESTANTES=0
find "$PUBLICO" -maxdepth 1 -type f -name '*.php' | sort > "$TEMPORAL/php_restantes.txt"
while IFS= read -r pagina; do
  if ! php -l "$pagina" >/dev/null; then
    echo "PHP ERROR: ${pagina#$PUBLICO/}" >&2
    ERRORES_RESTANTES=$((ERRORES_RESTANTES+1))
  fi
done < "$TEMPORAL/php_restantes.txt"
[[ "$ERRORES_RESTANTES" == 0 ]] || false
ok "Todas las páginas PHP restantes tienen sintaxis válida"

HTTP_ERROR=0
for archivo in "${LEGACY[@]}"; do
  codigo="$(curl -k -sS -o /dev/null -w '%{http_code}' --max-time 15 "$DOMINIO/$archivo" 2>/dev/null || true)"
  if [[ "$codigo" != '403' && "$codigo" != '404' && "$codigo" != '410' ]]; then
    echo "HTTP INESPERADO $codigo: $archivo" >&2
    HTTP_ERROR=$((HTTP_ERROR+1))
  fi
done
[[ "$HTTP_ERROR" == 0 ]] || false
ok "Las rutas legacy ya no son accesibles (403/404/410)"

for pagina in login_v3.php dashboard_v3.php; do
  codigo="$(curl -k -sS -o /dev/null -w '%{http_code}' --max-time 15 "$DOMINIO/$pagina" 2>/dev/null || true)"
  [[ "$codigo" != '000' && "$codigo" != '404' && "$codigo" != '500' ]] || { echo "HTTP $codigo en $pagina" >&2; false; }
done
ok "Login y dashboard v3 responden sin 404/500"

trap - ERR
echo
echo 'CUARENTENA APLICADA CORRECTAMENTE'
echo "Ubicación: $CUARENTENA"
echo "Restaurar con: bash $(dirname "$0")/RESTAURAR.sh '$CUARENTENA' '$BASE'"
