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

BASE="${1:-/var/www/smartplus-docker}"
SOURCE_ENV="${2:-/var/www/html/smart/.env}"
DUMP="$BASE/smart-databases.sql.gz"
SOURCE_CNF="$(mktemp /run/smartplus-source.XXXXXX.cnf)"
TARGET_CNF="$(mktemp /run/smartplus-target.XXXXXX.cnf)"
trap 'rm -f "$SOURCE_CNF" "$TARGET_CNF"' EXIT
chmod 600 "$SOURCE_CNF" "$TARGET_CNF"

env_value() {
    grep -E "^$1=" "$SOURCE_ENV" | cut -d= -f2- | tr -d '\r'
}

cat > "$SOURCE_CNF" <<EOF
[client]
host=$(env_value DB_HOST)
port=$(env_value DB_PORT)
user=$(env_value DB_USERNAME)
password=$(env_value DB_PASSWORD)
EOF

target_root_password="$(grep '^MARIADB_ROOT_PASSWORD=' "$BASE/.env.db" | cut -d= -f2-)"
cat > "$TARGET_CNF" <<EOF
[client]
host=127.0.0.1
port=3306
user=root
password=$target_root_password
EOF

mapfile -t DATABASES < <(mysql --defaults-extra-file="$SOURCE_CNF" -NBe \
  "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='smart' OR SCHEMA_NAME LIKE 'smart\\_%' ORDER BY SCHEMA_NAME")
test "${#DATABASES[@]}" -gt 0

printf '%s\n' "${DATABASES[@]}" > "$BASE/smart-databases.list"
chmod 600 "$BASE/smart-databases.list"

mysqldump --defaults-extra-file="$SOURCE_CNF" \
  --single-transaction --routines --events --triggers --hex-blob \
  --databases "${DATABASES[@]}" | gzip -c > "$DUMP"
chmod 600 "$DUMP"

until docker exec mariadb_smartplus mariadb-admin -uroot -p"$target_root_password" --silent ping; do
    sleep 2
done

gzip -dc "$DUMP" | docker exec -i mariadb_smartplus mariadb -uroot -p"$target_root_password"
docker exec mariadb_smartplus mariadb -uroot -p"$target_root_password" -e \
  "GRANT ALL PRIVILEGES ON *.* TO 'smartplus'@'%'; FLUSH PRIVILEGES;"

echo "Restored ${#DATABASES[@]} databases into mariadb_smartplus"
