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

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

# Display Help
help() {
    echo
    echo "$script"
    echo
    echo 'Description: Run Odoo upgrade scripts for target PostgreSQL database.'
    echo "Syntax: $script [-c|-p|-s|-t|-r|-u|-V|help]"
    echo 'Example: $script -c postgres01 -h localhost -d erp -s 16.0 -n upgrade -t 17.0 -m test -l MXXXXXXXXX'
    echo 'options:'
    echo '  -c    PostgreSQL container. Defaults to '\''postgres'\''.'
    echo '  -d    Current database name.'
    echo '  -s    Current Odoo version.'
    echo '  -n    Target database name.'
    echo '  -t    Target Odoo version.'
    echo '  -l    Optional Odoo subscription code.'
    echo '  -m    Upgrade mode. Options are '\''test'\'' or '\''production'\''. Defaults to '\''test'\''.'
    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 ':c: :p: :d: :s: :n: :t: :m: :l: :V' opt; do
    case $opt in
        c) container="$OPTARG";;
        p) postgres_version="$OPTARG";;
        d) database="$OPTARG";;
        s) odoo_version="$OPTARG";;
        n) target_database="$OPTARG";;
        t) target_odoo_version="$OPTARG";;
        m) mode="$OPTARG";;
        l) odoo_enterprise_code="$OPTARG";;
        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}"
: "${mode:=test}"

# Verify variables
[[ -z "$database" ]] && { echo 'Parameter -d|database is empty.' ; exit 1; }
[[ -z "$odoo_version" ]] && { echo 'Parameter -s|current version is empty.' ; exit 1; }
[[ -z "$target_database" ]] && { echo 'Parameter -n|new database is empty.' ; exit 1; }
[[ -z "$target_odoo_version" ]] && { echo 'Parameter -t|target version is empty.' ; exit 1; }

# Retrieve container info
network_id=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.NetworkID}}{{end}}' "$container")
network=$(docker network inspect --format '{{.Name}}' "$network_id")
pghost="$container"
pguser=$(docker exec "$container" /bin/bash -c "echo \$POSTGRES_USER")
pgpassword=$(docker exec "$container" /bin/bash -c "echo \$POSTGRES_PASSWORD")
postgres_version=$(docker exec "$container" postgres --version | awk '{print $3}' | sed 's/^\(.*\)\..*$/\1/')
export network
export pghost
export pguser
export pgpassword
export postgres_version

odoo-upgrade() {
    docker run -e PGHOST="$pghost" -e PGUSER="$pguser" -e PGPASSWORD="$pgpassword" \
        --network="$network" "mintsystem/odoo-upgrade:$postgres_version" "$@"
}

echo "Run upgrade script for database $database in $mode mode."
echo "The database will be upgraded from $odoo_version to $target_odoo_version."
if [[ -z "$odoo_enterprise_code" ]]; then
    odoo-upgrade "$mode" -d "$database" -t "$target_odoo_version" -r "$target_database"
else
    odoo-upgrade "$mode" -d "$database" -t "$target_odoo_version" -r "$target_database" -c "$odoo_enterprise_code"
fi
echo "The upgrade has been successful. The upgraded database has been restored as '$target_database'."
