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

script=$(basename "$0")
version="1.1.0"

help() {
    echo
    echo "$script"
    echo
    echo 'Description: Restore Odoo database from zip or tar file.'
    echo "Syntax: $script [-d|-c|-f|-r|-u|-V|help]"
    echo 'Example: $script -d erp-dev -c odoo06 -f tmp/erp.tar -r'
    echo 'options:'
    echo '  -d    Database name.'
    echo '  -c    Odoo container. Defaults to '\''odoo'\''.'
    echo '  -f    Odoo database backup file (.zip or .tar). 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
}

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

replace='false'
update='false'
container=odoo
file=/var/tmp/odoo.zip

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

[[ -z "$database" ]] && { echo 'Parameter -d|database is empty.' ; exit 1; }

# Determine archive format from file extension
if [[ "${file: -4}" == '.tar' ]]; then
    format='tar'
elif [[ "${file: -4}" == '.zip' ]]; then
    format='zip'
else
    echo "Unsupported file extension for '$file'. Use .zip or .tar." >&2
    exit 1
fi

restore_dir=$(dirname "$file")
filename=$(basename "$file")

echo "Requesting restore for Odoo database from $filename to $database"

echo "Extract archive ($format)"
cd "$restore_dir"
if [[ "$format" == 'tar' ]]; then
    tar -xf "$filename"
else
    unzip -q -o "$filename"
fi

if $replace; then
    docker-odoo-drop -c "$container" -d "$database"
fi

echo 'Copy filestore'
docker exec "$container" mkdir -p /var/lib/odoo/filestore
docker cp filestore/ "$container:/var/lib/odoo/filestore/$database"

echo "Create database $database"
docker exec "$container" /bin/bash -c "PGPASSWORD=\"\$PGPASSWORD\" createdb -h \$PGHOST -U \$PGUSER -T template0 $database"

echo "Restore database $database"
cat ./dump.sql | docker exec -i "$container" /bin/bash -c "psql postgres://\$PGUSER:\$PGPASSWORD@\$PGHOST:5432/$database"

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

# Update database uuid
if $update; then
    command -v uuidgen >/dev/null 2>&1 || { echo >&2 'uuidgen not found: apt-get install uuid-runtime'; exit 1; }
    uuid=$(uuidgen)
    echo 'Update database uuid'
    query="UPDATE ir_config_parameter SET value = '$uuid' WHERE key = 'database.uuid';"
    docker exec "$container" /bin/bash -c "psql postgres://\$PGUSER:\$PGPASSWORD@\$PGHOST:5432/$database -c \"$query\""
fi

echo "The restore for Odoo database $database has finished."