#!/usr/bin/env bash

set -Eeuo pipefail

umask 077

export PATH="/usr/local/mysql/bin:/usr/local/mariadb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:${PATH:-}"

BACKUP_DIR="${BACKUP_DIR:-/workspace/dbback}"
MYSQL_DEFAULTS_FILE="${MYSQL_DEFAULTS_FILE:-/root/.my.cnf}"
MYSQL_HOST="${MYSQL_HOST:-127.0.0.1}"
MYSQL_PORT="${MYSQL_PORT:-3306}"
MYSQL_USER="${MYSQL_USER:-root}"
RETENTION_DAYS="${RETENTION_DAYS:-30}"

DATABASES=(
  "aizhct_bzjk"
  "zhct_bzjk"
)

log() {
  printf '[%s] %s\n' "$(date '+%F %T')" "$*"
}

die() {
  log "ERROR: $*"
  exit 1
}

require_command() {
  command -v "$1" >/dev/null 2>&1 || die "missing command: $1"
}

dump_database() {
  local database="$1"
  local timestamp="$2"
  local outfile="${BACKUP_DIR}/${database}_${timestamp}.sql.gz"
  local tmpfile="${outfile}.tmp"
  local -a dump_cmd

  dump_cmd=(mysqldump)

  if [ -f "${MYSQL_DEFAULTS_FILE}" ]; then
    dump_cmd+=("--defaults-extra-file=${MYSQL_DEFAULTS_FILE}")
  elif [ -z "${MYSQL_PWD:-}" ]; then
    die "missing ${MYSQL_DEFAULTS_FILE}; create it or export MYSQL_PWD before running"
  fi

  dump_cmd+=(
    "--host=${MYSQL_HOST}"
    "--port=${MYSQL_PORT}"
    "--user=${MYSQL_USER}"
    "--default-character-set=utf8"
    "--single-transaction"
    "--quick"
    "--skip-lock-tables"
    "--routines"
    "--events"
    "--triggers"
    "--hex-blob"
    "--databases"
    "${database}"
  )

  log "backup started: ${database}"
  rm -f "${tmpfile}"
  if ! "${dump_cmd[@]}" | gzip -c > "${tmpfile}"; then
    rm -f "${tmpfile}"
    die "backup failed: ${database}"
  fi
  mv "${tmpfile}" "${outfile}"
  log "backup finished: ${outfile}"
}

cleanup_old_backups() {
  log "cleanup started: keep ${RETENTION_DAYS} days"
  find "${BACKUP_DIR}" -maxdepth 1 -type f \
    \( -name 'aizhct_bzjk_*.sql.gz' -o -name 'zhct_bzjk_*.sql.gz' \) \
    -mtime "+${RETENTION_DAYS}" -print -delete
  log "cleanup finished"
}

main() {
  local timestamp

  require_command mysqldump
  require_command gzip
  require_command find

  mkdir -p "${BACKUP_DIR}"

  timestamp="$(date '+%Y%m%d_%H%M%S')"

  for database in "${DATABASES[@]}"; do
    dump_database "${database}" "${timestamp}"
  done

  cleanup_old_backups
  log "all backups completed"
}

main "$@"
