#!/usr/bin/env bash
set -e

# Get script name
script=$(basename "$0")
version="1.0.1"

# Display Help
help() {
    echo
    echo "$script"
    echo
    echo 'Description: Restore Odoo database from container.'
    echo "Syntax: $script [-d|-c|-f|-r|-u|-V|help]"
    echo 'Example: $script -d erp-dev -c postgres01 -f tmp/erp.zip -r -p ~/.local/share/Odoo/filestore'
    echo 'options:'
    echo '  -d    Database name. Defaults to filename.'
    echo '  -c    Postgres container. Defaults to '\''odoo'\''.'
    echo '  -f    Odoo database backup file. Defaults to '\''/var/tmp/odoo.zip'\''.'
    echo '  -r    Replace existing database.'
    echo '  -p    Path to the filestore. Defaults to '\''~/.local/share/Odoo/filestore'\''.'
    echo "  -V    Show $script version."
    echo "  help  Show $script manual."
    echo
}

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

# Check requiremements
command -v uuidgen >/dev/null 2>&1 || { echo >&2 'uuidgen not found: apt-get install uuid-runtime'; exit 1; }

# Initialise option flag with a false value
replace='false'

# Process params
while getopts ':c: :d: :f: :r :p :V' opt; do
    case $opt in
        c) container="$OPTARG";;
        d) database="$OPTARG";;
        f) file="$OPTARG";;
        r) replace='true';;
        p) filestore_path='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:=postgres}"
: "${file:=/var/tmp/odoo.zip}"
: "${filestore_path:=~/.local/share/Odoo/filestore}"

# 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
    echo "Remove filestore $filestore_path/$database."
    rm -rf "$filestore_path/$database"
    docker-postgres-drop -c "$container" -d "$database"
fi

# Copy filestore
echo 'Move filestore.'
mv filestore "$filestore_path/$database"

# Create database
echo "Create database $database."
docker exec "$container" /bin/bash -c "createdb -U \$POSTGRES_USER -T template0 $database"

# Restore database
echo "Restore database from $database."
docker-postgres-restore -c "$container" -d "$database" -f ./dump.sql

# Remove source files
echo 'Cleanup source files.'
rm -rf dump.sql filestore

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