#!/bin/bash
set -e

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

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

# Display Help
Help() {
    echo
    echo "$SCRIPT"
    echo
    echo "Description: Backup Odoo database from container."
    echo "Syntax: $SCRIPT [-d|-c|-f|-r|-u|-v|help]"
    echo "Example: $SCRIPT -d erp-dev -c odoo06 -f tmp/erp.zip -r"
    echo "options:"
    echo "  -d    Database name. Defaults to filename."
    echo "  -c    Docker container. Defaults to 'odoo'."
    echo "  -f    Odoo database backup file. Defaults to '/var/tmp/odoo.zip'."
    echo "  -r    Replace existing database."
    echo "  -u    Update database uuid."
    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'

# Process params
while getopts ":c: :d: :f: :r :u :v" opt; do
    case $opt in
        c) CONTAINER="$OPTARG";;
        d) DATABASE="$OPTARG";;
        f) FILE="$OPTARG";;
        r) REPLACE='true';;
        u) UPDATE='true';;
        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'}
: ${FILE:='/var/tmp/odoo.zip'}

# Get file and directory name
DIR=`dirname "$FILE"`
FILENAME=`basename "$FILE"`
: ${DATABASE:="${FILENAME::-4}"}

# Start restore
echo "Requesting restore for Odoo database from $FILENAME to $DATABASE ..."

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

# Unip archive
echo "Unzip archive."
cd $DIR
unzip -q -o $FILENAME

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

# Copy filestore and dump
echo "Copy filestore and dump."
$docker_exec_root_bash 'mkdir -p /var/lib/odoo/filestore'
docker cp filestore/ "$CONTAINER:/var/lib/odoo/filestore/$DATABASE"
docker cp dump.sql "$CONTAINER:/var/lib/odoo/"

# Set filestore ownership
echo "Set filestore ownership."
$docker_exec_root_bash 'chown -R odoo:odoo /var/lib/odoo/filestore/$DATABASE'

# Create database
echo "Create database $DATABASE."
$docker_exec_bash 'PGPASSWORD="$PASSWORD" createdb -h $HOST -U $USER -T template0 $DATABASE'

# Restore database
echo "Restore database from $DATABASE."
$docker_exec_bash 'PGPASSWORD="$PASSWORD" psql -q -h $HOST -U $USER $DATABASE -f ~/dump.sql' 

# Remove source files
echo "Cleanup source files."
$docker_exec_bash 'rm ~/dump.sql'
rm -rf dump.sql filestore

# 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/$DATABASE -c \"$QUERY\""
fi

# Notify if backup has finished
echo "The restore for Odoo database $DATABASE has finished."
