#!/bin/bash
set -e

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

# Display Help
Help() {
  echo
  echo "$SCRIPT"
  echo
  echo "Description: Backup Odoo database."
  echo "Syntax: $SCRIPT [-p|-d|-o|-h|-t|-s|-v|help]"
  echo "Example: $SCRIPT -p password -d odoo -o /tmp -h https://odoo.example.com" -t token -s
  echo "options:"
  echo "  -p    Odoo master password. Defaults to \$ODOO_MASTER_PASSWORD env var."
  echo "  -d    Database name."
  echo "  -o    Output directory with or without filename. Defaults to '/var/tmp'."
  echo "  -h    Odoo host. Defaults to 'http://localhost:8069'."
  echo "  -t    Pass a bearer auth token."
  echo "  -s    Download SQL dump only."
  echo "  -v    Show $SCRIPT version."
  echo "  help  Show $SCRIPT manual."
  echo
}

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

# Process params
while getopts ":p: :d: :o: :h: :t: :s :v" opt; do
    case $opt in
        p) PASSWORD="$OPTARG";;
        d) DATABASE="$OPTARG";;
        o) OUTPUT="$OPTARG";;
        h) ODOO_HOST="$OPTARG";;
        t) TOKEN="$OPTARG";;
        s) BACKUP_FORMAT="dump";;
        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"}}
: ${DATABASE:="odoo"}
: ${OUTPUT:="/var/tmp"}
: ${BACKUP_FORMAT:="zip"}
: ${ODOO_HOST:="http://localhost:8069"}

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

# Remove trailing slash in url
ODOO_HOST="${ODOO_HOST%/}"

# Check if dir var is file or folder
if [[ "${OUTPUT: -3}" =~ "zip|sql" ]]; then
    DIR=$(dirname "$OUTPUT")
    FILE=$(basename "$OUTPUT")
else
    DIR=$OUTPUT
fi

# Ensure output directory exists
mkdir -p $DIR

# Ensure file name is set
if [ -z "$FILE" ];then
    if [[ "$BACKUP_FORMAT" == "zip" ]]; then
        FILE="$DATABASE.zip"
    fi
    if [[ "$BACKUP_FORMAT" == "dump" ]]; then
        FILE="$DATABASE.sql"
    fi
fi

# Set file path
FILEPATH="${DIR}/${FILE}"

echo "Backup database $DATABASE to $FILEPATH ..."

# Request backup with curl
RESPONSE=$(curl \
    -H "Authorization: Bearer $TOKEN" \
    -F "master_pwd=$PASSWORD" \
    -F "name=$DATABASE" \
    -F "backup_format=$BACKUP_FORMAT" \
    -o "$FILEPATH" \
    "$ODOO_HOST/web/database/backup")

echo "$RESPONSE" | grep "error" && exit 1

# Grep error if is html response
FILETYPE=$(file --mime-type -b "$FILEPATH")
if [[ "$FILETYPE" == "text/html" ]]; then
    grep error "$FILEPATH"
fi

# Validate zip file
if [[ "$BACKUP_FORMAT" == "zip" ]];then
    unzip -q -t "$FILEPATH"
fi

# Notify if backup has finished
echo "The Odoo backup has finished: $FILEPATH"
