#!/usr/bin/env bash
# Mediops — проверка последнего дампа MySQL (.sql.gz)
# Гайд: https://mediops.ru/guides/bekapy-bazy-proverka.html
set -euo pipefail

BACKUP_DIR="${BACKUP_DIR:-/var/backups/mysql}"
DB_NAME="${DB_NAME:-bitrix}"
MIN_BYTES="${MIN_BYTES:-1024}"
CHECK_DUMP_COMPLETED="${CHECK_DUMP_COMPLETED:-1}"
LOG="${BACKUP_DIR}/verify.log"

mkdir -p "$BACKUP_DIR"
touch "$LOG"

LATEST="$(find "$BACKUP_DIR" -maxdepth 1 -type f -name "${DB_NAME}_*.sql.gz" -printf '%T@ %p\n' 2>/dev/null | sort -nr | head -1 | cut -d' ' -f2-)"
# macOS/BSD find без -printf — fallback
if [[ -z "${LATEST:-}" ]]; then
  LATEST="$(ls -1t "$BACKUP_DIR"/${DB_NAME}_*.sql.gz 2>/dev/null | head -1 || true)"
fi

{
  echo "[$(date -Is)] verify start dir=${BACKUP_DIR} db=${DB_NAME}"
  if [[ -z "${LATEST:-}" || ! -f "$LATEST" ]]; then
    echo "[$(date -Is)] ERROR: no dump found for ${DB_NAME}_*.sql.gz" >&2
    exit 1
  fi

  gzip -t "$LATEST"

  SIZE="$(stat -c%s "$LATEST" 2>/dev/null || stat -f%z "$LATEST")"
  if [[ "$SIZE" -lt "$MIN_BYTES" ]]; then
    echo "[$(date -Is)] ERROR: ${LATEST} too small (${SIZE} < ${MIN_BYTES})" >&2
    exit 1
  fi

  if [[ "$CHECK_DUMP_COMPLETED" == "1" ]]; then
    # ищем маркер в хвосте (mysqldump пишет "-- Dump completed")
    if ! gzip -dc "$LATEST" | tail -c 4096 | grep -q "Dump completed"; then
      echo "[$(date -Is)] WARN: marker «Dump completed» not found in ${LATEST}" >&2
      # не exit 1 по умолчанию — на старых дампах маркера может не быть; раскомментируйте для строгого режима:
      # exit 1
    fi
  fi

  AGE_SEC=$(( $(date +%s) - $(stat -c%Y "$LATEST" 2>/dev/null || stat -f%m "$LATEST") ))
  AGE_H=$(( AGE_SEC / 3600 ))
  echo "[$(date -Is)] ok file=$(basename "$LATEST") size=${SIZE} age_h=${AGE_H}"
  if [[ "$AGE_H" -gt 36 ]]; then
    echo "[$(date -Is)] WARN: latest dump older than 36h — cron мог молчать" >&2
  fi
} >>"$LOG" 2>&1
