#!/bin/bash

set -e

. ./CLUSTER-SERVER/_mongodb_cluster_common.bash

LOCAL_SHARD_INDEX=$(gs_mongodb_cluster_find_local_shard) ||
    gs_mongodb_die "The current host is not listed in GS_MONGODB_SHARD_HOSTNAMES."

SHARD_NUMBER=$((LOCAL_SHARD_INDEX + 1))
SHARD_HOST=$(gs_mongodb_cluster_shard_host "$LOCAL_SHARD_INDEX")
SHARD_REPLSET=$(gs_mongodb_cluster_shard_replset "$LOCAL_SHARD_INDEX")
HOST_PORT="${SHARD_HOST}:${GS_MONGODB_SHARD_PORT}"

echo "Configuring shard $SHARD_NUMBER replica set:"
echo "  replica set: $SHARD_REPLSET"
echo "  member:      $HOST_PORT"

"$GS_MONGODB_SHELL" \
    --quiet \
    --host "$SHARD_HOST" \
    --port "$GS_MONGODB_SHARD_PORT" <<EOF
var expectedReplicaSet = "$SHARD_REPLSET";
var expectedHost = "$HOST_PORT";

try {
    var currentConfig = rs.conf();

    if (currentConfig._id !== expectedReplicaSet) {
        throw new Error(
            "Server is already configured as replica set '" +
            currentConfig._id + "', not '" + expectedReplicaSet + "'."
        );
    }

    if (currentConfig.members.length !== 1 ||
        currentConfig.members[0].host !== expectedHost) {
        throw new Error(
            "Existing shard member does not match '" + expectedHost + "'."
        );
    }

    print("Shard replica set is already configured.");
}
catch (error) {
    if (error.code === 94 || error.codeName === "NotYetInitialized") {
        printjson(
            rs.initiate({
                _id: expectedReplicaSet,
                members: [
                    {
                        _id: 0,
                        host: expectedHost
                    }
                ]
            })
        );
    }
    else {
        throw error;
    }
}
EOF

gs_mongodb_cluster_wait_for_primary \
    "Shard replica set $SHARD_REPLSET" \
    "$SHARD_HOST" \
    "$GS_MONGODB_SHARD_PORT" \
    "$GS_MONGODB_PRIMARY_TIMEOUT"
