#!/usr/bin/env bash
set -u

PAQUETE_DIR="$(cd "$(dirname "$0")" && pwd)"
PROYECTO_DIR="${1:-/home/iotcuboc/pyme}"
MARCA="$(date +%Y%m%d_%H%M%S)"
RESPALDO_DIR="${PROYECTO_DIR}/respaldos/formularios_plegables_${MARCA}"
MANIFEST="${PAQUETE_DIR}/MANIFEST.txt"

fallar() {
  echo "ERROR: $1" >&2
  exit 1
}

[ -d "$PROYECTO_DIR" ] || fallar "No existe el proyecto: $PROYECTO_DIR"
[ -f "$MANIFEST" ] || fallar "Falta MANIFEST.txt"

while IFS= read -r archivo; do
  [ -n "$archivo" ] || continue
  [ -f "${PAQUETE_DIR}/${archivo}" ] || fallar "Falta en el paquete: $archivo"
  [ -f "${PROYECTO_DIR}/${archivo}" ] || fallar "Falta en el proyecto: $archivo"
  case "$archivo" in
    *.php) php -l "${PAQUETE_DIR}/${archivo}" >/dev/null || fallar "PHP inválido en el paquete: $archivo" ;;
  esac
done < "$MANIFEST"

mkdir -p "$RESPALDO_DIR" || fallar "No se pudo crear el respaldo"
cp "$MANIFEST" "${RESPALDO_DIR}/MANIFEST.txt"

while IFS= read -r archivo; do
  [ -n "$archivo" ] || continue
  mkdir -p "${RESPALDO_DIR}/$(dirname "$archivo")"
  cp -p "${PROYECTO_DIR}/${archivo}" "${RESPALDO_DIR}/${archivo}" || fallar "No se pudo respaldar: $archivo"
done < "$MANIFEST"

restaurar() {
  echo "La validación falló. Restaurando archivos originales..." >&2
  while IFS= read -r archivo; do
    [ -n "$archivo" ] || continue
    cp -p "${RESPALDO_DIR}/${archivo}" "${PROYECTO_DIR}/${archivo}"
  done < "$MANIFEST"
}

while IFS= read -r archivo; do
  [ -n "$archivo" ] || continue
  cp -p "${PAQUETE_DIR}/${archivo}" "${PROYECTO_DIR}/${archivo}" || { restaurar; fallar "No se pudo instalar: $archivo"; }
done < "$MANIFEST"

while IFS= read -r archivo; do
  [ -n "$archivo" ] || continue
  case "$archivo" in
    *.php) php -l "${PROYECTO_DIR}/${archivo}" >/dev/null || { restaurar; fallar "PHP inválido después de instalar: $archivo"; } ;;
  esac
done < "$MANIFEST"

echo "Instalación completada."
echo "Respaldo: $RESPALDO_DIR"
echo "Para revertir: bash ${PAQUETE_DIR}/RESTAURAR.sh '$RESPALDO_DIR' '$PROYECTO_DIR'"
