#!/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({"user": "$2", "pwd":"$(cat "$DB_APP_PASSWORD")", "roles": ["readWrite"]})
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

    ensure_database_container_is_running
    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\""
    ;;

  mongodb:import)
    verify_app_name "$2"
    verify_db_name "$3"
    verify_max_args 4 "$@"

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

    ensure_database_container_is_running
    docker run -i --rm \
            --link="$DB_CONTAINER":"$DB_CONTAINER_LINK" \
            "$DB_IMAGE" \
        bash -c "mongoimport --username \"$DB_USER\" --password \"$DB_PASSWORD\" --host \"$DB_HOST\" --port \"$DB_PORT\" --db \"$DB_NAME\" --collection \"$4\""
    ;;

  mongodb:export)
    verify_app_name "$2"
    verify_db_name "$3"
    verify_max_args 4 "$@"

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

    ensure_database_container_is_running
    docker run -i --rm \
            --link="$DB_CONTAINER":"$DB_CONTAINER_LINK" \
            "$DB_IMAGE" \
        bash -c "mongoexport --username \"$DB_USER\" --password \"$DB_PASSWORD\" --host \"$DB_HOST\" --port \"$DB_PORT\" --db \"$DB_NAME\" --collection \"$4\" --out -"
    ;;

  mongodb:dump)
    verify_app_name "$2"
    verify_db_name "$3"
    verify_max_args 4 "$@"

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

    ensure_database_container_is_running
    docker run -i --rm \
            --link="$DB_CONTAINER":"$DB_CONTAINER_LINK" \
            "$DB_IMAGE" \
        bash -c "mongodump --username \"$DB_USER\" --password \"$DB_PASSWORD\" --host \"$DB_HOST\" --port \"$DB_PORT\" --db \"$DB_NAME\" --collection \"$4\" --out -"
    ;;

  mongodb:restart)
    info "Stopping MongoDB container..."
    stop_and_remove_container "$DB_CONTAINER"
    info "Starting MongoDB container..."
    start_database_container
    info "MongoDB container started!"
    ;;

  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
    mongodb:import <app> <db> <collection>    Import database collection for an app
    mongodb:export <app> <db> <collection>    Export database collection for an app
    mongodb:dump <app> <db> <collection>      Dump database collection in bson for an app
    mongodb:restart             Restart MongoDB container (for example to switch image)
EOF
    ;;

  *)
    exit $DOKKU_NOT_IMPLEMENTED_EXIT
    ;;

esac
