#!/bin/bash

source "$(dirname $0)/vars"

verify_db_name() {
    sanitize_name "$1" "database name"
    DB_NAME="$1"
}

mysql_shell() {
    DB_USER="$1"
    DB_PASSWORD="$2"
    shift 2
    ensure_database_container_is_running
    docker run -i --rm \
            --link="$DB_CONTAINER":"$DB_CONTAINER_LINK" \
            -e MYSQL_PWD="$(cat "$DB_PASSWORD")" \
            "$DB_IMAGE" \
        bash -c "mysql --user=\"$DB_USER\" --host=\"$DB_HOST\" $@"
}

mysql_admin() {
    mysql_shell "root" "$DB_ADMIN_PASSWORD" "$@"
}

case "$1" in
  mariadb:create)
    verify_db_name "$2"
    verify_max_args 2 "$@"
    
    mysql_admin <<EOF
CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` DEFAULT CHARACTER SET \`utf8\` COLLATE \`utf8_unicode_ci\`;
EOF
    info "MariaDB database created: $DB_NAME"
    ;;

  mariadb:delete|mariadb:destroy)
    verify_db_name "$2"
    verify_max_args 2 "$@"

    mysql_admin <<EOF
DROP DATABASE IF EXISTS \`$DB_NAME\`;
EOF
    rm -f $DB_APP_DATABASES*/$DB_NAME
    info "MariaDB database deleted: $DB_NAME"
    ;;

  mariadb:list)
    verify_app_name "$2"
    verify_max_args 2 "$@"

    DB_LINKS="$DB_APP_DATABASES$APP/"
    mkdir -p "$DB_LINKS"
    ls -1 "$DB_LINKS"
    ;;

  mariadb:info)
    verify_app_name "$2"
    verify_db_name "$3"
    verify_max_args 3 "$@"

    if ! db_info "$APP" "$DB_NAME"; then
        fail "$DB_NAME: database is not linked to $APP"
    fi

    echo
    cat <<EOF
echo "       Host: $DB_HOST"
echo "       Port: $DB_PORT"
echo "       User: $DB_USER"
echo "       Password: $DB_PASSWORD"
echo "       Database: $DB_DATABASE"
echo
echo "       MARIADB_URL=$DB_URL"
EOF
    echo
    ;;

  mariadb:link)
    verify_app_name "$2"
    verify_db_name "$3"
    verify_max_args 3 "$@"

    DB_APP_PASSWORD="$DB_APP_PASSWORDS$APP"
    if [[ ! -f "$DB_APP_PASSWORD" ]]; then
        DB_NEW_PASSWORD="$(generate_random_password)"
        mysql_admin <<EOF
CREATE USER '$APP'@'%' IDENTIFIED BY '$DB_NEW_PASSWORD';
EOF
        echo "$DB_NEW_PASSWORD" > "$DB_APP_PASSWORD"
    fi
    mysql_admin <<EOF
GRANT ALL ON \`$DB_NAME\`.* TO '$APP'@'%';
EOF
    mkdir -p "$DB_APP_DATABASES$APP"
    touch "$DB_APP_DATABASES$APP/$DB_NAME"
    redeploy_app "$APP"
    ;;

  mariadb:unlink)
    verify_app_name "$2"
    verify_db_name "$3"
    verify_max_args 3 "$@"

    mysql_admin <<EOF
REVOKE ALL ON \`$DB_NAME\`.* FROM '$APP'@'%';
EOF
    rm "$DB_APP_DATABASES$APP/$DB_NAME"
    redeploy_app "$APP"
    ;;

  mariadb:console)
    verify_app_name "$2"
    verify_db_name "$3"
    verify_max_args 3 "$@"

    if ! db_info "$APP" "$DB_NAME"; then
        fail "$DB_NAME: database is not linked to $APP"
    fi
    shift 2
    docker run -t -i --rm \
            --link="$DB_CONTAINER":"$DB_CONTAINER_LINK" \
            -e MYSQL_PWD="$DB_PASSWORD" \
            "$DB_IMAGE" \
        bash -c "mysql -u \"$DB_USER\" -h \"$DB_HOST\" -P \"$DB_PORT\" \"$DB_DATABASE\""
    ;;

  help)
    cat && cat<<EOF
    mariadb:create <db>         Create a MariaDB database
    mariadb:delete <db>         Delete specified MariaDB database
    mariadb:list <app>          List linked databases
    mariadb:link <app> <db>     Link database to app
    mariadb:unlink <app> <db>   Unlink database from app
    mariadb:info <app> <db>     Display application informations
    mariadb:console <app> <db>  Launch console for MariaDB container
EOF
    ;;

esac
