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

if [ "$#" -lt 1 ]; then
  echo "Usage: $0 <INSTALL_ID>" >&2
  exit 1
fi

INSTALL_ID="$1"
if ! printf '%s' "${INSTALL_ID}" | grep -Eq '^[A-Za-z0-9-]+$'; then
  echo "[vozex-backup] Invalid install id: ${INSTALL_ID}" >&2
  exit 1
fi

INSTALLATION_ROOT="${VOZEX_INSTALLATION_ROOT:-/www/wwwroot/vozex.cloud/installations}"
STACK_DIR="${INSTALLATION_ROOT}/${INSTALL_ID}"
BACKUP_ROOT="${VOZEX_BACKUP_ROOT:-${STACK_DIR}/backups}"
TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
BACKUP_DIR="${BACKUP_ROOT}/${TIMESTAMP}"
DB_DUMP_PATH="${BACKUP_DIR}/db.sql.gz"
STORAGE_ARCHIVE_PATH="${BACKUP_DIR}/storage.tar.gz"
COMPOSE_FILE="${STACK_DIR}/customer-compose.yml"
ENV_FILE="${STACK_DIR}/.env"
STORAGE_VOLUME="${INSTALL_ID}_backend_storage"

log() {
  printf '%s %s\n' "[vozex-backup]" "$*"
}

require_file() {
  if [ ! -f "$1" ]; then
    log "Required file missing: $1"
    exit 1
  fi
}

compose() {
  if docker compose version >/dev/null 2>&1; then
    docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" "$@"
  else
    docker-compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" "$@"
  fi
}

require_file "${COMPOSE_FILE}"
require_file "${ENV_FILE}"
if [ ! -d "${STACK_DIR}" ]; then
  log "Installation directory missing: ${STACK_DIR}"
  exit 1
fi
mkdir -p "${BACKUP_DIR}"

log "Creating MySQL dump for ${INSTALL_ID}..."
compose exec -T db sh -lc 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE"' | gzip -c > "${DB_DUMP_PATH}"

log "Archiving Laravel storage volume ${STORAGE_VOLUME}..."
docker run --rm \
  -v "${STORAGE_VOLUME}:/source:ro" \
  -v "${BACKUP_DIR}:/backup" \
  alpine:3.20 \
  sh -lc 'cd /source && tar -czf /backup/storage.tar.gz .'

find "${BACKUP_ROOT}" -mindepth 1 -maxdepth 1 -type d -mtime +"${VOZEX_BACKUP_RETENTION_DAYS:-7}" -exec rm -rf {} +

log "Backup completed: ${BACKUP_DIR}"
