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

# Restaura un paquete generado por backup-kanban.sh en la instalacion Docker.
# Antes de importar crea automaticamente un backup del estado actual.
# Uso: bash scripts/restore-kanban.sh kanban-backup-AAAAMMDD-HHMMSS.tar.gz

if [[ $# -ne 1 ]]; then
  echo "Uso: bash scripts/restore-kanban.sh ARCHIVO_BACKUP.tar.gz" >&2
  exit 2
fi

archive="$1"
if [[ ! -f "$archive" ]]; then
  echo "No existe el archivo: $archive" >&2
  exit 2
fi

if ! docker compose ps --status running -q db 2>/dev/null | grep -q .; then
  echo "El servicio MySQL no esta activo. Ejecute: docker compose up -d" >&2
  exit 1
fi

if ! docker compose ps -a -q app 2>/dev/null | grep -q .; then
  echo "El contenedor de la aplicacion no existe. Ejecute: docker compose up -d" >&2
  exit 1
fi

# Evita extraer rutas absolutas o recorridos fuera del directorio temporal.
while IFS= read -r entry; do
  case "$entry" in
    /*|../*|*/../*|*/..) echo "Ruta no segura en el backup: $entry" >&2; exit 1 ;;
  esac
done < <(tar -tzf "$archive")

tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/kanban-restore.XXXXXX")"
cleanup() {
  case "$tmpdir" in
    "${TMPDIR:-/tmp}"/kanban-restore.*) rm -rf -- "$tmpdir" ;;
  esac
}
trap cleanup EXIT

tar -xzf "$archive" -C "$tmpdir"
if [[ ! -s "$tmpdir/database.sql" ]]; then
  echo "El paquete no contiene una copia valida de database.sql" >&2
  exit 1
fi

mkdir -p migration-backups
safety_backup="migration-backups/pre-import-$(date +%Y%m%d-%H%M%S).tar.gz"
echo "Creando backup de seguridad del Docker actual..."
bash scripts/backup-kanban.sh "$safety_backup"

app_was_running=false
if docker compose ps --status running -q app 2>/dev/null | grep -q .; then
  app_was_running=true
  docker compose stop app
fi

restart_app_on_error() {
  if [[ "$app_was_running" == true ]]; then
    docker compose start app >/dev/null 2>&1 || true
  fi
}
trap 'restart_app_on_error; cleanup' ERR

echo "Importando la base de datos..."
docker compose exec -T db sh -c \
  'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < "$tmpdir/database.sql"

if [[ -d "$tmpdir/uploads" ]]; then
  echo "Importando archivos cargados..."
  docker compose cp "$tmpdir/uploads/." app:/app/app/static/uploads/ >/dev/null
  docker compose exec -u root -T app chown -R kanban:kanban /app/app/static/uploads
fi

docker compose start app >/dev/null
app_was_running=false
trap cleanup EXIT

echo "Restauracion terminada. Backup previo conservado en: $safety_backup"
docker compose ps
