#!/bin/bash
set -e

# Check requiremements
command -v uuidgen >/dev/null 2>&1 || { echo >&2 "uuidgen not found."; exit 1; }

SCRIPT=$(basename "$0")
VERSION="1.0.0"

# Display Help
Help() {
    echo
    echo "$SCRIPT"
    echo
    echo "Description: Duplicate Odoo database in container."
    echo "Syntax: $SCRIPT [-c|-s|-t|-r|-u|-v|help]"
    echo "Example: $SCRIPT -c odoo06 -s odoo -t odoo-int -r -u -i"
    echo "options:"
    echo "  -c    Docker container. Defaults to 'odoo'."
    echo "  -s    Source database name."
    echo "  -t    Target database name."
    echo "  -r    Replace existing database."
    echo "  -u    Update database uuid."
    echo "  -i    Ignore filestore."
    echo "  -v    Show $SCRIPT version."
    echo "  help  Show $SCRIPT manual."
    echo
}

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

# Initialise option flag with a false value
REPLACE='false'
UPDATE='false'
COPY_FILESTORE='true'

# Process params
while getopts ":c: :s: :t: :r :u :i :v" opt; do
    case $opt in
        c) CONTAINER="$OPTARG";;
        s) SOURCE_DATABASE="$OPTARG";;
        t) TARGET_DATABASE="$OPTARG";;
        r) REPLACE='true';;
        u) UPDATE='true';;
        i) COPY_FILESTORE='false';;
        v) echo "$SCRIPT version $VERSION"
        exit 0
        ;;
        \?) echo "Invalid option -$OPTARG" >&2
        Help
        exit;;
    esac
done

# Fallback to environment vars and default values
: "${CONTAINER:=odoo}"

# Verify variables
[[ -z "$SOURCE_DATABASE" ]] && { echo "Parameter -s|source is empty" ; exit 1; }
[[ -z "$TARGET_DATABASE" ]] && { echo "Parameter -t|target is empty" ; exit 1; }
[[ "$TARGET_DATABASE" == "$SOURCE_DATABASE" ]] && { echo "Parameter -s|source and -t|target cannot be the same" ; exit 1; }

# Switch container name with id
CONTAINER_ID=$(docker ps -f "name=$CONTAINER" -q | tail -n1)

# Set alias
docker_exec_bash="docker exec $CONTAINER_ID /bin/bash -c"
docker_exec_root_bash="docker exec --user root $CONTAINER_ID /bin/bash -c"

# Clear database
if $REPLACE; then
    docker-odoo-drop -c "$CONTAINER" -d "$TARGET_DATABASE"
fi

# Kill datbase connections
echo "Kill database connections on $SOURCE_DATABASE."
QUERY="SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$SOURCE_DATABASE';"
$docker_exec_bash "psql postgres://\$USER:\$PASSWORD@\$HOST:5432/postgres -c \"$QUERY\""

# Duplicate database
echo "Duplicate database from $SOURCE_DATABASE to $TARGET_DATABASE."
$docker_exec_bash "PGPASSWORD=\"\$PASSWORD\" createdb -h \$HOST -U \$USER -T $SOURCE_DATABASE $TARGET_DATABASE"

# Duplicate filestore
if $COPY_FILESTORE; then
    echo "Duplicate filestore from $SOURCE_DATABASE to $TARGET_DATABASE."
    $docker_exec_root_bash "mkdir -p /var/lib/odoo/filestore"
    $docker_exec_root_bash "cp -ar /var/lib/odoo/filestore/$SOURCE_DATABASE /var/lib/odoo/filestore/$TARGET_DATABASE"
fi

# Update database uuid
if $UPDATE; then
    UUID=$(uuidgen)
    echo "Update database uuid."
    QUERY="UPDATE ir_config_parameter SET value = '$UUID' WHERE key = 'database.uuid';"
    $docker_exec_bash "psql postgres://\$USER:\$PASSWORD@\$HOST:5432/$TARGET_DATABASE -c \"$QUERY\""
fi

# Notify if backup has finished
echo "The duplication for Odoo database $TARGET_DATABASE has finished."
