#!/usr/bin/env bash

set -e;

SCRIPT_DIR=$(dirname "$0")

report_error() {
    echo "Error: $1" >&2
    exit 1
}

usage() {
    printf "\n\tUsage: c mongo download <environment> [collection]\n\n"
    printf "\tDownload all or a specific collection from a Mongo database.\n"
    printf "\tIf you don't provide a collection, all will be downloaded.\n\n"
    printf "\tOptions:\n\n"
    printf "\t-h, --help  Display this help message\n\n"
}

if [ "$#" -lt 1 ]; then
    usage
    exit 1
fi

if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
    usage
    exit 0
fi

ENV=$1
COLLECTION=$2

# Disallow "local" environment
if [ "$ENV" == "local" ]; then
    report_error "You cannot download the local database"
fi

CONFIG=$(node "$SCRIPT_DIR/c-mongo-download-config.js" "$ENV" "$COLLECTION")

DOCKER_VOLUME_NAME=$(echo $CONFIG | jq -r '.dockerVolumeName')
OUTPUT_PATH="/data/$(echo $CONFIG | jq -r '.dbName')"
CONNECTION_STRING=$(echo $CONFIG | jq -r '.connectionString')
VOLUMES=$(echo $CONFIG | jq -r '.volumes | join(" ") // ""')

docker volume create "$DOCKER_VOLUME_NAME" >/dev/null 2>&1

docker run --rm -v "$DOCKER_VOLUME_NAME:/data" busybox sh -c "mkdir -p $OUTPUT_PATH && chmod -R 777 /data"

docker run --rm -v "$DOCKER_VOLUME_NAME:/data" $VOLUMES mongo:7 mongodump $CONNECTION_STRING -o /data

docker run --rm -v "$DOCKER_VOLUME_NAME:/data" -v "$(pwd)/data:/host_data" busybox sh -c "cp -r /data/* /host_data"

docker volume rm "$DOCKER_VOLUME_NAME" >/dev/null 2>&1

sudo chown -R "$(id -u):$(id -g)" "$(pwd)/data"
