#!/bin/bash
set -e

# Check requiremements
command -v zip >/dev/null 2>&1 || { echo >&2 "zip 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|-o|-v|help]"
    echo "Example: $SCRIPT -d erp -c odoo06 -o tmp/erp.zip"
    echo "options:"
    echo "  -d    Database name. Defaults to 'odoo'."
    echo "  -c    Docker container. Defaults to 'odoo'."
    echo "  -o    Output directory with or without filename. Defaults to '/var/tmp'."
    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 ":d: :c: :o: :v" opt; do
    case $opt in
        c) CONTAINER="$OPTARG";;
        d) DATABASE="$OPTARG";;
        o) OUTPUT="$OPTARG";;
        v) echo "$SCRIPT version $VERSION"
        exit 0
        ;;
        \?) echo "Invalid option -$OPTARG" >&2
        Help
        exit;;
    esac
done

# Fallback to environment vars and default values
: ${DATABASE:='odoo'}
: ${CONTAINER:='odoo'}
: ${OUTPUT:='/var/tmp'}

# Check if dir var is file or folder
if [ "${OUTPUT: -4}" = ".zip" ];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
  FILE="$DATABASE.zip"
fi

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

# Switch container name with id
CONTAINER_ID=$(docker ps -f "name=$CONTAINER" -q | tail -n1)

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

# Copy filestore
echo "Copy filestore."
rm -rf "$DIR/filestore"
docker cp "$CONTAINER_ID:/var/lib/odoo/filestore/$DATABASE" "$DIR/filestore"

# Set alias
docker_exec_bash="docker exec $CONTAINER_ID /bin/bash -c"

# Create pgpass file
echo "Create pgpass file."
$docker_exec_bash "echo \"\$HOST:5432:$DATABASE:\$USER:\$PASSWORD\" > ~/.pgpass"
$docker_exec_bash "chmod 600 ~/.pgpass"

# Dump database
echo "Dump database."
$docker_exec_bash "pg_dump -h \$HOST -U \$USER $DATABASE" > "$DIR/dump.sql"

# Zip everything
echo "Zip filestore and dump to $FILE."
rm -f "$FILEPATH"
cd "$DIR"
zip -q -r "$FILE" ./dump.sql ./filestore

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

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