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

# Genera un paquete portable con la base de datos y los archivos cargados.
# Uso: bash scripts/backup-kanban.sh [archivo-salida.tar.gz]
#
# Modo Docker (predeterminado cuando el servicio "db" esta activo):
#   bash scripts/backup-kanban.sh
#
# Modo MySQL externo/local:
#   BACKUP_MODE=local DB_HOST=127.0.0.1 DB_USER=root DB_PASSWORD=clave \
#     bash scripts/backup-kanban.sh

timestamp="$(date +%Y%m%d-%H%M%S)"
requested_output="${1:-kanban-backup-${timestamp}.tar.gz}"
output_dir="$(dirname -- "$requested_output")"
output_name="$(basename -- "$requested_output")"
mkdir -p -- "$output_dir"
output_dir="$(cd -- "$output_dir" && pwd)"
output_path="${output_dir}/${output_name}"

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

mkdir -p "$tmpdir/uploads"
mode="${BACKUP_MODE:-auto}"

if [[ "$mode" != "local" ]] && docker compose ps --status running -q db 2>/dev/null | grep -q .; then
  echo "Exportando MySQL desde Docker..."
  docker compose exec -T db sh -c \
    'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction --routines --triggers --events --hex-blob --add-drop-database --databases "${MYSQL_DATABASE:-kanban_app}"' \
    > "$tmpdir/database.sql"

  if docker compose ps -a -q app 2>/dev/null | grep -q .; then
    echo "Copiando archivos cargados desde Docker..."
    docker compose cp app:/app/app/static/uploads/. "$tmpdir/uploads/" >/dev/null
  fi
else
  echo "Exportando MySQL externo/local..."
  : "${DB_HOST:?Defina DB_HOST para usar BACKUP_MODE=local}"
  : "${DB_USER:?Defina DB_USER para usar BACKUP_MODE=local}"
  : "${DB_PASSWORD:?Defina DB_PASSWORD para usar BACKUP_MODE=local}"
  DB_PORT="${DB_PORT:-3306}"
  DB_NAME="${DB_NAME:-kanban_app}"
  UPLOADS_DIR="${UPLOADS_DIR:-app/static/uploads}"

  MYSQL_PWD="$DB_PASSWORD" mysqldump \
    --host="$DB_HOST" --port="$DB_PORT" --user="$DB_USER" \
    --single-transaction --routines --triggers --events --hex-blob \
    --add-drop-database --databases "$DB_NAME" > "$tmpdir/database.sql"

  if [[ -d "$UPLOADS_DIR" ]]; then
    echo "Copiando archivos cargados desde $UPLOADS_DIR..."
    cp -a "$UPLOADS_DIR"/. "$tmpdir/uploads/"
  fi
fi

cat > "$tmpdir/manifest.txt" <<EOF
Aplicacion: Kanban Projects
Fecha UTC: $(date -u +%Y-%m-%dT%H:%M:%SZ)
Contenido: database.sql y uploads/
EOF

tar -C "$tmpdir" -czf "$output_path" database.sql uploads manifest.txt
echo "Backup creado: $output_path"
sha256sum "$output_path"
