#!/usr/bin/env bash
# Faunamix MySQL yedeği alır; çıktı varsayılan olarak .local/backups/mysql altına gzip'li SQL dosyasıdır.
# Kullanım: ./scripts/backup-database.sh
# İsteğe bağlı: FAUNAMIX_ENV_FILE=api/.env.prod ./scripts/backup-database.sh
set -euo pipefail

_SCRIPT_SOURCE="${BASH_SOURCE[0]:-$0}"
if [[ "$_SCRIPT_SOURCE" != /* ]]; then
  _SCRIPT_SOURCE="$PWD/${_SCRIPT_SOURCE#./}"
fi
ROOT="$(cd "$(dirname "$_SCRIPT_SOURCE")/.." && pwd)"
ENV_FILE="${FAUNAMIX_ENV_FILE:-$ROOT/api/.env}"

load_env() {
  if [[ -f "$ENV_FILE" ]]; then
    set -a
    # shellcheck disable=SC1090
    source "$ENV_FILE"
    set +a
  fi
}

apply_aliases() {
  DB_HOST="${DB_HOST:-${MYSQL_HOST:-127.0.0.1}}"
  DB_PORT="${DB_PORT:-${MYSQL_PORT:-3306}}"
  DB_NAME="${DB_NAME:-${MYSQL_DATABASE:-faunamix}}"
  DB_USER="${DB_USER:-${MYSQL_USER:-root}}"
  if [[ -z "${DB_PASS:-}" ]]; then
    DB_PASS="${MYSQL_PASSWORD:-${MYSQL_ROOT_PASSWORD:-}}"
  fi
}

pick_dump_bin() {
  if command -v mysqldump >/dev/null 2>&1; then
    echo "mysqldump"
    return
  fi
  if command -v mariadb-dump >/dev/null 2>&1; then
    echo "mariadb-dump"
    return
  fi
  echo "Eksik: mysqldump veya mariadb-dump bulunamadi." >&2
  exit 1
}

write_checksum() {
  local file="$1"
  local checksum_file="$2"
  if command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$file" > "$checksum_file"
    return
  fi
  if command -v sha256sum >/dev/null 2>&1; then
    sha256sum "$file" > "$checksum_file"
    return
  fi
  echo "[uyari] shasum/sha256sum yok; checksum dosyasi uretilmedi." >&2
}

load_env
apply_aliases

: "${DB_HOST:?DB_HOST veya MYSQL_HOST gerekli}"
: "${DB_PORT:?DB_PORT veya MYSQL_PORT gerekli}"
: "${DB_NAME:?DB_NAME veya MYSQL_DATABASE gerekli}"
: "${DB_USER:?DB_USER veya MYSQL_USER gerekli}"

BACKUP_DIR="${FAUNAMIX_DB_BACKUP_DIR:-$ROOT/.local/backups/mysql}"
RETENTION_DAYS="${FAUNAMIX_DB_BACKUP_RETENTION_DAYS:-14}"
if ! [[ "$RETENTION_DAYS" =~ ^[0-9]+$ ]] || (( RETENTION_DAYS < 1 )); then
  echo "Gecersiz FAUNAMIX_DB_BACKUP_RETENTION_DAYS: $RETENTION_DAYS" >&2
  exit 1
fi

mkdir -p "$BACKUP_DIR"

TIMESTAMP="$(date -u +%Y%m%dT%H%M%SZ)"
PREFIX="${DB_NAME}-${TIMESTAMP}"
OUT_FILE="$BACKUP_DIR/${PREFIX}.sql.gz"
META_FILE="$BACKUP_DIR/${PREFIX}.meta.json"
CHECKSUM_FILE="$BACKUP_DIR/${PREFIX}.sha256"
DUMP_BIN="$(pick_dump_bin)"

MYSQL_ARGS=( --host="$DB_HOST" --port="$DB_PORT" --protocol=TCP --user="$DB_USER" --default-character-set=utf8mb4 )
if [[ "$DB_HOST" == *".railway.internal"* ]] && [[ "${FAUNAMIX_MYSQL_SSL:-}" != "1" ]]; then
  MYSQL_ARGS+=( --skip-ssl )
elif [[ "$DB_HOST" == *".rlwy.net"* ]] || [[ "${FAUNAMIX_MYSQL_SSL:-}" == "1" ]]; then
  MYSQL_ARGS+=( --ssl )
fi

if [[ "$DUMP_BIN" == "mysqldump" ]]; then
  MYSQL_ARGS+=( --set-gtid-purged=OFF )
fi

if [[ -n "${DB_PASS:-}" ]]; then
  MYSQL_PWD="$DB_PASS" "$DUMP_BIN" \
    "${MYSQL_ARGS[@]}" \
    --single-transaction \
    --quick \
    --skip-lock-tables \
    --hex-blob \
    --routines \
    --triggers \
    --events \
    "$DB_NAME" | gzip -c > "$OUT_FILE"
else
  "$DUMP_BIN" \
    "${MYSQL_ARGS[@]}" \
    --single-transaction \
    --quick \
    --skip-lock-tables \
    --hex-blob \
    --routines \
    --triggers \
    --events \
    "$DB_NAME" | gzip -c > "$OUT_FILE"
fi

if [[ ! -s "$OUT_FILE" ]]; then
  echo "Backup olusturulamadi veya bos dosya uretildi: $OUT_FILE" >&2
  exit 1
fi

write_checksum "$OUT_FILE" "$CHECKSUM_FILE"

cat > "$META_FILE" <<EOF
{
  "created_at_utc": "$TIMESTAMP",
  "database": "$DB_NAME",
  "host": "$DB_HOST",
  "port": "$DB_PORT",
  "compressed_sql": "$(basename "$OUT_FILE")",
  "checksum_file": "$(basename "$CHECKSUM_FILE")",
  "retention_days": $RETENTION_DAYS
}
EOF

find "$BACKUP_DIR" -type f \( -name "${DB_NAME}-*.sql.gz" -o -name "${DB_NAME}-*.meta.json" -o -name "${DB_NAME}-*.sha256" \) -mtime "+$RETENTION_DAYS" -delete

echo "Backup tamamlandi:"
echo "  file: $OUT_FILE"
echo "  meta: $META_FILE"
if [[ -f "$CHECKSUM_FILE" ]]; then
  echo "  sha256: $CHECKSUM_FILE"
fi
