#!/bin/bash

. /etc/rc.d/efw_lib.sh

UPGRADED=/etc/upgrade/upgrade.d
PRE_HOOKS=/etc/upgrade/pre-upgrade.d
LOG="/var/efw/product/openfw-updates.log"
PIDFILE="/var/run/openfw-update.pid"
UPDATE_LIST_FILE="/var/cache/en/update_list"

trap "rm -f $PIDFILE; exit" INT TERM EXIT

loadSettings /var/efw/main/settings

function setupchannels() {
    smart channel --remove-all -y > /dev/null 2>&1
    smart channel --add openfw \
        baseurl="http://repo.openfw.com.br" \
        type=rpm-md -y > /dev/null 2>&1
        
    smart update > /dev/null 2>&1
    smart newer 2>&1 | sed 's/\r//g; s/\[#*\]//g' >> $LOG
}

function start_upgrade() {
    local PACKAGES="$@"

    echo "+++ Running pre-upgrade hooks..." >> $LOG
    [ -d "${PRE_HOOKS}" ] && run-parts --report ${PRE_HOOKS} >> $LOG 2>&1

    if [ -n "${PACKAGES}" ]; then
        echo "+++ Analyzing selected packages: ${PACKAGES}" >> $LOG
        
        local TO_UPGRADE=""
        local TO_INSTALL=""

        # Separa os pacotes entre os já instalados e os novos (mudança de nome)
        for pkg in ${PACKAGES}; do
            if rpm -q "$pkg" >/dev/null 2>&1; then
                TO_UPGRADE="$TO_UPGRADE $pkg"
            else
                TO_INSTALL="$TO_INSTALL $pkg"
            fi
        done

        if [ -n "$TO_UPGRADE" ]; then
            echo "+++ Upgrading installed packages: ${TO_UPGRADE}" >> $LOG
            smart upgrade -y ${TO_UPGRADE} >> $LOG 2>&1
        fi

        if [ -n "$TO_INSTALL" ]; then
            echo "+++ Installing/Fallback for packages (new or renamed): ${TO_INSTALL}" >> $LOG
            smart install -y ${TO_INSTALL} >> $LOG 2>&1
        fi
    else
        echo "+++ Starting full system upgrade..." >> $LOG
        smart upgrade -y >> $LOG 2>&1
    fi
    
    if [ $? -eq 0 ]; then
        echo "+++ Running post-upgrade hooks..." >> $LOG
        [ -d "${UPGRADED}" ] && run-parts --report ${UPGRADED} >> $LOG 2>&1
        echo "+++ Upgrade process finished successfully." >> $LOG
        [ -f "${UPDATE_LIST_FILE}" ] && rm -f "${UPDATE_LIST_FILE}"
    else
        echo "!!! ERROR: System upgrade failed." >> $LOG
    fi
}

echo $$ > $PIDFILE

ACTION="$1"

case "$ACTION" in
    update)
        > $LOG
        setupchannels
        ;;
    upgrade)
        shift
        start_upgrade "$@"
        ;;
    *)
        echo "Usage: $0 {update|upgrade} [package1 package2 ...]"
        exit 1
        ;;
esac