#!/usr/bin/env bash

set -Eeuo pipefail
umask 077

DEFAULTS_FILE=${MYSQL56_BACKUP_DEFAULTS:-/etc/zhct/secrets/mysql56-backup.cnf}
BACKUP_ROOT=${MYSQL56_BACKUP_ROOT:-/data/backup/mysql56}
MYSQL=${MYSQL56_CLIENT:-/opt/mysql-client/5.6.51/bin/mysql}
MYSQLDUMP=${MYSQL56_DUMP:-/opt/mysql-client/5.6.51/bin/mysqldump}
DATABASES=(zhct_sanquan aizhct_sanquan)
STAMP=$(date +%Y%m%dT%H%M%S)
DRY_RUN=0
[[ "${1:-}" == '--dry-run' ]] && DRY_RUN=1

if [[ "$DRY_RUN" == 1 ]]; then
    printf 'would dump and validate databases: %s\n' "${DATABASES[*]}"
    exit 0
fi

[[ -r "$DEFAULTS_FILE" ]] || { echo 'backup defaults file missing' >&2; exit 1; }
[[ -x "$MYSQL" && -x "$MYSQLDUMP" ]] || { echo 'MySQL5.6 client tools missing' >&2; exit 1; }
install -d -m 0700 "$BACKUP_ROOT/$STAMP"

for database in "${DATABASES[@]}"; do
    output="$BACKUP_ROOT/$STAMP/$database.sql.gz"
    "$MYSQLDUMP" --defaults-extra-file="$DEFAULTS_FILE" --single-transaction --routines --triggers --events --hex-blob --set-gtid-purged=OFF "$database" | gzip -9 >"$output"
    [[ -s "$output" ]]
    gzip -t "$output"
    gzip -cd "$output" | grep -Eq '^-- MySQL dump|^CREATE TABLE|^INSERT INTO'
    source_tables=$($MYSQL --defaults-extra-file="$DEFAULTS_FILE" --batch --skip-column-names -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='${database}'")
    [[ "$source_tables" =~ ^[0-9]+$ ]]
    printf '%s\t%s\t%s\n' "$database" "$source_tables" "$(sha256sum "$output" | awk '{print $1}')" >>"$BACKUP_ROOT/$STAMP/manifest.tsv"
done

echo "PASS: backup $STAMP created and validated"
