#!/bin/bash

set -e

DB_HOST="localhost"
DB_PORT=5443
PGPASSWORD="xivocc"
DB_USERNAME="postgres"

DB_MIGRATION_VERSION="2025.06"
FACTORY_ENV_FILE="/etc/docker/compose/factory.env"
PG_DATA_FOLDER="/var/lib/postgresql"
PG_17_DATA="$PG_DATA_FOLDER/17"


locale_fr="fr_FR.utf8"
db_data_folder_old="$PG_DATA_FOLDER/15/data"

source /usr/bin/xivo-upgrade-functions

properly_shutdown_database() {
    xivocc-dcomp stop pgxivocc
}

get_distribution() {
    local distribution=$(grep -oP -m 1 '^\s*XIVOCC_DIST=\K.*' ${FACTORY_ENV_FILE})
    echo -e "$distribution"
}

migrate_15_to_17() {
    set -o pipefail
    local distribution=$(get_distribution)
    # Note: Using implicit parameter from tianon's docker image PGDATANEW and PGDATAOLD
    docker run --rm \
        -v /etc/timezone:/etc/timezone:ro \
        -v /etc/localtime:/etc/localtime:ro \
        -v /var/lib/postgresql/:/var/lib/postgresql/ \
        -e LANG="${locale_fr}" \
        xivoxc/xivo-db-migration:${DB_MIGRATION_VERSION}."${distribution}" --link 2>&1
}

display_upgrade_notice() {
    echo -e "\e[32m*********************************************************************************"
    echo -e "*   XiVO-CC Database was upgraded from Postgres version 15 to version 17        *"
    echo -e "*********************************************************************************\e[0m"
}

clean_pg_upgrade_remainders() {
    echo -e  "\e[33mRemove old cluster and clean pg_upgrade files\e[0m"
    rm -rf "${PG_DATA_FOLDER}/15" \
           "${PG_DATA_FOLDER}/data" \
        /var/lib/postgresql/delete_old_cluster.sh
}

add_access_configuration() {
    cp "${db_data_folder_old}/pg_hba.conf" "${PG_DATA_FOLDER}/17/data"
}

pull_and_start_db() {
    if output=$(xivocc-dcomp upgrade-db 2>&1 > /dev/null); then
        echo -e "\e[1;32mCommand 'xivocc-dcomp upgrade-db' completed successfully.\e[0m"
    else
        echo -e "\e[1;33mCommand 'xivocc-dcomp upgrade-db' failed.\e[0m"
        echo -e "\e[1;33m$output\e[0m"
    fi
}

run_psql_file() {
  PGPASSWORD=${PGPASSWORD} psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -t -f "$1"
}

migrate() {
    local distribution=$(get_distribution)
    echo -e "\e[32mStarting database migration to postgres 17...\e[0m"

    echo -e "\e[33mRe-starting database with fast shutdown...\e[0m"

    properly_shutdown_database
    if is_postgres_running_on_port ${PGPASSWORD} ${DB_HOST} ${DB_PORT} ${DB_USERNAME} "xivo_stats"; then
        echo -e "\e[31mERROR: Failed to stop database.\e[0m"
        exit 3
    fi

    echo -e "\e[33mPulling docker migration container...\e[0m"

    if output=$(docker pull xivoxc/xivo-db-migration:${DB_MIGRATION_VERSION}.${distribution} 2>&1 > /dev/null); then
        echo -e "\e[1;32mImage pulled successfully.\e[0m"
    else
        echo -e "\e[1;31mFailed to pull Docker image.\e[0m"
        echo -e "\e[1;31m$output\e[0m"
    fi

    echo -e "\e[33mRunning migration...\e[0m"
    migrate_15_to_17



    if [ "$?" -eq 0 ]; then
        echo -e "\e[32mDatabase upgrade successful.\e[0m"
        set +o pipefail

        echo -e "\e[33mRetrieving old pg_hba.conf...\e[30m"
        add_access_configuration

        echo -e "\e[33mStarting database container...\e[0m"
        pull_and_start_db
        wait_for_postgres ${PGPASSWORD} ${DB_HOST} ${DB_PORT} ${DB_USERNAME} "xivo_stats"
        if [ -f "/var/lib/postgresql/update_extensions.sql" ]; then
          run_psql_file "/var/lib/postgresql/update_extensions.sql"
        fi
        clean_pg_upgrade_remainders

        display_upgrade_notice
    fi
}

if [ ! -d "$PG_17_DATA" ]; then
    migrate
else
    echo -e "\e[31mERROR: $PG_17_DATA directory exists.\e[0m"
fi

exit 0
