#!/usr/bin/env sh

# To/Die/For =)
unset TO_DIE
die () {
    RED='\033[0;31m'
    NC='\033[0m' # No Color
    echo "${RED}$1${NC}"
    exit 1
}

########################################################################

backup () {
    # SET VARIABLES #

    BACKUPDIR="/backup"
    NOW="$(date '+%Y%m%d_%H%M%S')"

    HOST="${MYSQL_HOST:-host.docker.internal}"
    PORT="${MYSQL_PORT:-3306}"
    USER="${MYSQL_USER:-root}"

    ( test -z "${MYSQL_PASS}" && ( test ! -f /password || test ! -s /password ) ) && die "Please set mysql password with one method: [MYSQL_PASS] env var OR [/password] file mount"
    ( test -n "${MYSQL_PASS}" && test -r /password && test -s /password ) && die "Please set mysql password with only one method"
    test -z "${MYSQL_PASS}" || ( echo "Setting [MYSQL_PASS] environment variable is insecure, use passwordfile [/password] instead"; PASS="${MYSQL_PASS}" ) 
    test -f /password && PASS="$(cat /password)"

    test -n "${MYSQL_FILE}" && BACKUP_PREFIX="${MYSQL_FILE}" || BACKUP_PREFIX="${HOST}_${PORT}"

    unset MYSQL_HOST MYSQL_PORT MYSQL_USER MYSQL_PASS MYSQL_FILE

    # Create final Backup Directory
    test -d "${BACKUPDIR}" || ( echo "There might be an error: no final backup dir. Will create one..."; mkdir -p "${BACKUPDIR}" )
    test -w "${BACKUPDIR}" || ( echo "There might be an error: no write access to final backup dir. Will change rights..."; chmod -Rc u+w "${BACKUPDIR}" )

    # Create temp Backup Directory
    TEMPDIR="${BACKUPDIR}/.${NOW}"
    test -d "${TEMPDIR}" || mkdir -p "${TEMPDIR}"
    test -w "${TEMPDIR}" || ( echo "There might be an error: no write access to temp backup dir. Will change rights..."; chmod -Rc u+w "${TEMPDIR}" )

    # Create temp Backup Config
    CONFIG="$(mktemp)"
    echo "[client]" > "${CONFIG}"
    test -n "${HOST}" && echo "host=${HOST}"        >> "${CONFIG}" || die "host"
    test -n "${USER}" && echo "user=${USER}"        >> "${CONFIG}" || die "user"
    test -n "${PASS}" && echo "password=${PASS}"    >> "${CONFIG}" || die "password"
    test -n "${PORT}" && echo "port=${PORT}"        >> "${CONFIG}" || die "port"
    echo "#"                                        >> "${CONFIG}"
    echo "[mysqldump]" >> "${CONFIG}"
    test -n "${HOST}" && echo "host=${HOST}"        >> "${CONFIG}" || die "host"
    test -n "${USER}" && echo "user=${USER}"        >> "${CONFIG}" || die "user"
    test -n "${PASS}" && echo "password=${PASS}"    >> "${CONFIG}" || die "password"
    test -n "${PORT}" && echo "port=${PORT}"        >> "${CONFIG}" || die "port"
    echo "#"                                        >> "${CONFIG}"

    # Backup user DBs
    for DB in $(mysql --defaults-file="${CONFIG}" -e 'show databases' -s --skip-column-names | grep -v -e information_schema -e performance_schema -e sys -e mysql); do
        mysqldump --defaults-file="${CONFIG}" --routines --triggers $DB > "$TEMPDIR/$DB.sql";
    done

    # Backup system DBs
    for DB in information_schema performance_schema sys mysql; do
        mysqldump --defaults-file="${CONFIG}" --routines --triggers --lock-tables=false $DB > "$TEMPDIR/$DB.sql";
    done

    # ZIP BACKUP #
    cd "$TEMPDIR"
    tar -zcvf "${BACKUP_PREFIX}-${NOW}.tar.gz" *.sql
    echo "---"
    du -h "${BACKUP_PREFIX}-${NOW}.tar.gz"
    cd - > /dev/null

    # MOVE BACKUP TO BACKUP DIR #
    mv -f "${TEMPDIR}/${BACKUP_PREFIX}-${NOW}.tar.gz" "${BACKUPDIR}"

    # CLEANUP #
    rm -rf "${TEMPDIR}"
}

########################################################################

help () {
    echo "Set environment variables: MYSQL_HOST MYSQL_PORT MYSQL_USER"
    echo "Set MYSQL_PASS insecurely or put password in file mount /password"
}

case $1 in
    help) shift && help $@;;
    *) backup;;
esac