#!/bin/bash

source "$(dirname $0)/vars"

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

mongo_shell() {
    local DB_USER="$1"
    local DB_PASSWORD="$2"
    local DB_NAME="$3"
    shift 3
    ensure_database_container_is_running
    docker run -i --rm \
            --link="$DB_CONTAINER":"$DB_CONTAINER_LINK" \
            "$DB_IMAGE" \
        bash -c "mongo --quiet -u \"$DB_USER\" -p \"$(cat "$DB_PASSWORD")\" \"$DB_HOST:$DB_PORT/$DB_NAME\" $@"
}

mongo_admin() {
    mongo_shell "admin" "$DB_ADMIN_PASSWORD" "admin" "$@"
}

case "$1" in
  mongodb:create)
    verify_db_name "$2"
    verify_max_args 2 "$@"
    
    mongo_admin <<EOF
use $DB_NAME
EOF
    info "MongoDB database created: $DB_NAME"
    ;;

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

    mongo_admin <<EOF
use $DB_NAME
db.dropDatabase()
EOF
    rm -f $DB_APP_DATABASES*/$DB_NAME
    info "MongoDB database deleted: $DB_NAME"
    ;;

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

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

  mongodb: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 "       MONGODB_URL=$DB_URL"
EOF
    echo
    ;;

  mongodb: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)"
        echo "$DB_NEW_PASSWORD" > "$DB_APP_PASSWORD"
    fi

    mongo_admin <<EOF
use $3
db.addUser("$2", "$(cat "$DB_APP_PASSWORD")")
EOF
    mkdir -p "$DB_APP_DATABASES$APP"
    touch "$DB_APP_DATABASES$APP/$DB_NAME"
    redeploy_app "$APP"
    ;;

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

    mongo_admin <<EOF
use $3
db.removeUser("$2")
EOF

    rm "$DB_APP_DATABASES$APP/$DB_NAME"
    redeploy_app "$APP"
    ;;

  mongodb: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

    docker run -t -i --rm \
            --link="$DB_CONTAINER":"$DB_CONTAINER_LINK" \
            "$DB_IMAGE" \
        bash -c "mongo -u \"$DB_USER\" -p \"$DB_PASSWORD\" \"$DB_HOST:$DB_PORT/$DB_NAME\""
    ;;

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

esac
