#!/bin/bash

. lib/common

set -e

DBNAME=$(relation-get dbname) || {
    DBNAME="${BASE_SERVICE_NAME//\./_}"
    relation-set dbname "$DBNAME"
}


ensure_db_docker_running

if dbs=$(mongo:db:ls); then
    if matching_db=$(e "$dbs" | egrep "[a-zA-Z0-9.-_]*_${DBNAME}"); then
        if e "$dbs" | grep "^${DBNAME}$"; then
            err "Error: unexpected database '$matching_db'" \
                "found along with database named '${DBNAME}'."
            exit 1
        fi
        ## Let's take for granted that only current source service is
        ## concerned by the database. We need to restart source service
        ## container only if already running.
        container_ids=($(get_running_containers_for_service "$MASTER_BASE_SERVICE_NAME"))
        for container_id in "${container_ids[@]}"; do
            mongo_url=$(docker:container:env_get "$container_id" MONGO_URL) || return 1
            if [[ "$mongo_url" == */"${matching_db}"* ]]; then
                info "Attempting to stop current containers of service $MASTER_BASE_SERVICE_NAME"
                docker stop -t 5 "$container_id"
            fi
        done

        mongo:db:rename "$matching_db" "${DBNAME}"

        ## we DO NOT want to start the stopped container again as they are not
        ## properly configured
    fi
else
    err "Failed to query for database list"
    exit 14
fi

## ReplicaSet initialization

cmd="rs.initiate({ _id: 'rs01', members: [ { _id: 0, host: '$TARGET_SERVICE_NAME:27017' } ]})"
debug "${WHITE}running:$NORMAL $cmd"

out=$(ddb < <(echo "use $DBNAME";
              echo "$cmd"))

if [[ "$out" == *"\"codeName\" : \"AlreadyInitialized\""* ]]; then
    info "ReplicaSet already initialized."
elif [[ "$out" == *"\"ok\" : 1"* ]]; then
    info "ReplicaSet initialized. "
else
    err "ReplicaSet initialisation failed:"
    echo "$out" >&2
    exit 13
fi