#!/bin/bash
set -e

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

# Display Help
Help() {
  echo
  echo "$SCRIPT"
  echo
  echo "Description: Restore Odoo database."
  echo "Syntax: $SCRIPT [-p|-d|-f|-h|-r|-n|-m|-v|help]"
  echo "Example: $SCRIPT -p secret -d odoo -f /tmp/odoo.sql -h https://odoo.example.org -r -m -n"
  echo "options:"
  echo "  -p    Odoo master password. Defaults to \$ODOO_MASTER_PASSWORD env var and 'admin'."
  echo "  -d    Database name. Defaults to filename."
  echo "  -f    Odoo database backup file. Defaults to '/var/tmp/odoo.zip'."
  echo "  -h    Odoo host. Defaults to 'http://localhost:8069'."
  echo "  -r    Replace existing database."  
  echo "  -n    Neutralize database after restore."  
  echo "  -m    Database was moved."
  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"
NEUTRALIZE="false"
COPY="true"

# Process params
while getopts ":p: :d: :f: :h: :r :n :m :v" opt; do
    case $opt in
        p) PASSWORD="$OPTARG";;
        d) DATABASE="$OPTARG";;
        f) FILE="$OPTARG";;
        h) ODOO_HOST="$OPTARG";;
        r) REPLACE="true";;
        n) NEUTRALIZE="true";;
        m) COPY="false";;
        v) echo "$SCRIPT version $VERSION"
        exit 0
        ;;
        \?) echo "Invalid option -$OPTARG" >&2
        Help
        exit;;
    esac
done

# Fallback to environment vars and default values
: ${PASSWORD:=${ODOO_MASTER_PASSWORD:="odoo"}}
: ${FILE:="/var/tmp/odoo.zip"}
: ${ODOO_HOST:="http://localhost:8069"}
FILENAME=$(basename -- "$FILE")
: ${DATABASE:="${FILENAME%%.*}"}

# Verify variables
[[ "$ODOO_HOST" == http* ]]  || { echo "Parameter -h|host must start with 'http/s'" ; exit 1; }

# Validate zip file
if [[ "${FILE: -3}" =~ "zip" ]]; then
    unzip -q -t $FILE
fi

if $REPLACE; then
  
    # Ask for confirmation
    read -p "Please confirm the deletion of $DATABASE on $ODOO_HOST (y/n)? " REPLY
    if [[ $REPLY == y ]]; then
    echo "Deleting Odoo database $DATABASE ..."

    curl \
        --silent \
        -F "master_pwd=${PASSWORD}" \
        -F "name=${DATABASE}" \
        ${ODOO_HOST%/}/web/database/drop | grep -q -E 'Internal Server Error|Redirecting...'
    fi
fi

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

COMMAND="curl \
-F \"master_pwd=$PASSWORD\"
-F \"name=$DATABASE\"
-F \"backup_file=@$FILE\""
if $NEUTRALIZE; then
    COMMAND="$COMMAND -F \"neutralize_database=$NEUTRALIZE\""
fi
if $COPY; then
    COMMAND="$COMMAND -F \"copy=$COPY\""
fi
COMMAND="$COMMAND ${ODOO_HOST%/}/web/database/restore"

# Request restore with curl
RESPONSE=$(eval $COMMAND)

# If redirect is response then restore was succesfull
CHECK=$(echo "$RESPONSE" | { grep 'Redirecting...' || true; })
if [[ -n "$CHECK" ]]; then
    echo "The restore for Odoo database $DATABASE has finished."
else
    echo "The restore for Odoo database $DATABASE failed with:"
    echo "$RESPONSE" | grep error
    exit 1
fi