#!/bin/bash
set -e

# Get script name
SCRIPT=$(basename "$0")
VERSION="1.0.0"

# Display Help
Help() {
    echo
    echo "$SCRIPT"
    echo
    echo "Description: Copy docker volumes or specific folders."
    echo "Syntax: $SCRIPT [-s|-t|-f|-r|-v|help]"
    echo "Example: $SCRIPT -s odoo-main:/filestore/odoo-main -t odoo-int:/filestore/odoo-int -f"
    echo "options:"
    echo "  -s    Source Docker volume name and path."
    echo "  -t    Target Docker volume name and path."
    echo "  -f    Remove target path before copy."
    echo "  -r    Replace existing target volume."
    echo "  -v    Show $SCRIPT version."
    echo "  help  Show $SCRIPT manual."
    echo
}

# Show help and exit
if [[ "$1" == "help" ]]; then
    Help
    exit
fi

# Initialise option flags
REPLACE="false"
FORCE="false"

# Process params
while getopts ":s: :t: :f :r :v" opt; do
    case $opt in
        s) SOURCE="$OPTARG"
        ;;
        t) TARGET="$OPTARG"
        ;;
        f) FORCE="true"
        ;;
        r) REPLACE="true"
        ;;
        v) echo "$SCRIPT version $VERSION"
        exit 0
        ;;
        \?) echo "Invalid option -$OPTARG" >&2
        Help
        exit;;
    esac
done

# Verify variables
[[ -z "$SOURCE" ]] && { echo "Parameter -s|source is empty" ; exit 1; }
[[ -z "$TARGET" ]] && { echo "Parameter -t|target is empty" ; exit 1; }

# Split volume name and path
TARGET_VOLUME=$(echo $TARGET | cut -f1 -d:)
TARGET_PATH=$(echo $TARGET | grep -q ":" && echo $TARGET | cut -f2 -d: || echo "")
SOURCE_VOLUME=$(echo $SOURCE | cut -f1 -d:)
SOURCE_PATH=$(echo $SOURCE | grep -q ":" && echo $SOURCE | cut -f2 -d: || echo "")

if $REPLACE; then
    echo "Remove docker volume $TARGET_VOLUME."
    docker volume rm "$TARGET_VOLUME"
fi

if [[ -z "$TARGET_PATH" ]]; then
    docker volume inspect "$TARGET_VOLUME" > /dev/null && { echo "Docker volume $TARGET_VOLUME already exists." ; exit 1; }
fi

echo "Create docker volume $TARGET_VOLUME."
docker volume create --name "$TARGET_VOLUME"

if $FORCE; then
    echo "Remove path $TARGET_PATH in volume $TARGET_VOLUME."
    docker container run --rm \
        -v "$TARGET_VOLUME":/to \
        alpine ash -c "rm -rf /to$TARGET_PATH"
fi

echo "Copy Docker volume content from $SOURCE to $TARGET."
docker container run --rm \
    -v "$SOURCE_VOLUME":/from \
    -v "$TARGET_VOLUME":/to \
    alpine ash -c "cd /to; mkdir -p .$TARGET_PATH; cd /from$SOURCE_PATH; cp -av . /to$TARGET_PATH" \
    > /dev/null && { echo "Docker volume copy has finished."; }