#!/bin/bash

# Configuração
dbconfig=/elotech/dbconfig.ini
web_d=/elotech/web

oxy_tranp_version=3.123.0
oxy_transparencia_path=${web_d}/server/portaltransparencia

oxy_protocolo_version=4.223.1
oxy_protocolo_path=${web_d}/server/protocolo

oxy_tributos_version=4.319.0
oxy_tributos_path=${web_d}/server/tributos

oxy_unico_version=5.66.0
oxy_unico_path=${web_d}/server/unico

oxy_report_version=2.138.0
oxy_report_path=${web_d}/server/report-server

# Espelho
mirror=repos.bettertech.com.br

# Caminho base
cd /tmp

update_oxy_transparencia()
{
    sed -i '/spring\.profiles\.include=standalone/d' /elotech/web/server/portaltransparencia/config/application-production.properties

    wget --no-check-certificate https://${mirror}/unix/release/transparencia/portal-transparencia-${oxy_tranp_version}.zip -P /tmp

    if [ -f "/tmp/portal-transparencia-${oxy_tranp_version}.zip" ]; then
        systemctl stop elotech-portal-transparencia
        
        rm -rf ${web_d}/client/html/portaltransparencia
        rm -rf ${web_d}/client/html/admportaltransparencia
        
        yes | unzip /tmp/portal-transparencia-${oxy_tranp_version}.zip -d ${web_d} -x server/portaltransparencia/config/application-production.properties
        
        echo "app.version=$oxy_tranp_version" > ${oxy_transparencia_path}/build-params
        
        systemctl start elotech-portal-transparencia
    else 
        echo "arquivo de atualização do portal transparência não foi encontrado"
    fi
}

update_oxy_protocolo()
{
    wget --no-check-certificate https://${mirror}/unix/release/protocolo/protocolo-${oxy_protocolo_version}.zip -P /tmp

    if [ -f "/tmp/protocolo-${oxy_protocolo_version}.zip" ]; then
        systemctl stop elotech-protocolo
        
        rm -rf ${web_d}/client/html/protocolo
        
        yes | unzip /tmp/protocolo-${oxy_protocolo_version}.zip -d ${web_d} -x server/protocolo/config/application-production.properties
        
        echo "app.version=$oxy_protocolo_version" > ${oxy_protocolo_path}/build-params
        
        systemctl start elotech-protocolo
    else 
        echo "arquivo de atualização do protocolo não foi encontrado"
    fi
}

update_oxy_tributos()
{
    wget --no-check-certificate https://${mirror}/unix/release/portal-contribuinte/portal-contribuinte-${oxy_tributos_version}.zip -P /tmp

    if [ -f "/tmp/portal-contribuinte-${oxy_tributos_version}.zip" ]; then
        systemctl stop elotech-portal-contribuinte
        
        rm -rf ${web_d}/client/html/portal-contribuinte
        
        yes | unzip /tmp/portal-contribuinte-${oxy_tributos_version}.zip -d ${web_d} -x server/tributos/config/application-production.properties
        
        echo "app.version=$oxy_tributos_version" > ${oxy_tributos_path}/build-params
        
        systemctl start elotech-portal-contribuinte
    else 
        echo "arquivo de atualização do portal-contribuinte não foi encontrado"
    fi
}

update_oxy_unico()
{
    wget --no-check-certificate https://${mirror}/unix/release/unico/unico-${oxy_unico_version}.zip -P /tmp

    if [ -f "/tmp/unico-${oxy_unico_version}.zip" ]; then
        systemctl stop elotech-unico
        
        rm -rf ${web_d}/client/html/unico
        rm -rf ${web_d}/client/html/login
        
        yes | unzip /tmp/unico-${oxy_unico_version}.zip -d ${web_d} -x server/unico/config/application-production.properties
        
        echo "app.version=$oxy_unico_version" > ${oxy_unico_path}/build-params
        
        systemctl start elotech-unico
    else 
        echo "arquivo de atualização do unico não foi encontrado"
    fi
}

update_oxy_report()
{
    wget --no-check-certificate https://${mirror}/unix/release/report-server/report-server-${oxy_report_version}.zip -P /tmp

    if [ -f "/tmp/report-server-${oxy_report_version}.zip" ]; then
        systemctl stop elotech-report-server
        
        rm -rf ${web_d}/client/html/report-server
        
        yes | unzip /tmp/report-server-${oxy_report_version}.zip -d ${web_d} -x server/report-server/config/application-production.properties
        
        echo "app.version=$oxy_report_version" > ${oxy_report_path}/build-params
        
        systemctl start elotech-report-server
    else 
        echo "arquivo de atualização do report-server não foi encontrado"
    fi
}

# Função para comparar versões e retornar true ou false
is_version_greater() {
    v1=$1
    v2=$2

    # Transformando a versão em um formato numérico que possa ser comparado diretamente
    v1=$(echo "$v1" | awk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }')
    v2=$(echo "$v2" | awk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }')

    # Comparando as versões
    if [ "$v1" -gt "$v2" ]; then
        return 0 # Verdadeiro
    else
        return 1 # Falso
    fi
}

init_update_oxy_transparencia()
{
    if [ -e "${oxy_transparencia_path}/build-params" ]; then
        # lê o valor da versão do arquivo e armazena na variável
        oxy_tranp_version_line=$(grep -Eo 'app\.version=[0-9]+\.[0-9]+\.[0-9]+' ${oxy_transparencia_path}/build-params)
        oxy_tranp_version_old=${oxy_tranp_version_line#app.version=}

        if is_version_greater $oxy_tranp_version $oxy_tranp_version_old; then
            update_oxy_transparencia
        else
            echo "Versão do portal transparência já atualizada ${oxy_tranp_version}"
        fi
    else
        update_oxy_transparencia
    fi
}

init_update_oxy_protocolo()
{
    if [ -e "${oxy_protocolo_path}/build-params" ]; then
        # lê o valor da versão do arquivo e armazena na variável
        oxy_protocolo_version_line=$(grep -Eo 'app\.version=[0-9]+\.[0-9]+\.[0-9]+' ${oxy_protocolo_path}/build-params)
        oxy_protocolo_version_old=${oxy_protocolo_version_line#app.version=}

        if is_version_greater $oxy_protocolo_version $oxy_protocolo_version_old; then
            update_oxy_protocolo
        else
            echo "Versão do protocolo já atualizada ${oxy_protocolo_version}"
        fi
    else
        update_oxy_protocolo
    fi
}

init_update_oxy_tributos()
{
    if [ -e "${oxy_tributos_path}/build-params" ]; then
        # lê o valor da versão do arquivo e armazena na variável
        oxy_tributos_version_line=$(grep -Eo 'app\.version=[0-9]+\.[0-9]+\.[0-9]+' ${oxy_tributos_path}/build-params)
        oxy_tributos_version_old=${oxy_tributos_version_line#app.version=}

        if is_version_greater $oxy_tributos_version $oxy_tributos_version_old; then
            update_oxy_tributos
        else
            echo "Versão do portal-contribuinte já atualizada ${oxy_tributos_version}"
        fi
    else
        update_oxy_tributos
    fi
}

init_update_oxy_unico()
{
    if [ -e "${oxy_unico_path}/build-params" ]; then
        # lê o valor da versão do arquivo e armazena na variável
        oxy_unico_version_line=$(grep -Eo 'app\.version=[0-9]+\.[0-9]+\.[0-9]+' ${oxy_unico_path}/build-params)
        oxy_unico_version_old=${oxy_unico_version_line#app.version=}

        if is_version_greater $oxy_unico_version $oxy_unico_version_old; then
            update_oxy_unico
        else
            echo "Versão do unico já atualizada ${oxy_unico_version}"
        fi
    else
        update_oxy_unico
    fi
}

init_update_oxy_report()
{
    if [ -e "${oxy_report_path}/build-params" ]; then
        # lê o valor da versão do arquivo e armazena na variável
        oxy_report_version_line=$(grep -Eo 'app\.version=[0-9]+\.[0-9]+\.[0-9]+' ${oxy_report_path}/build-params)
        oxy_report_version_old=${oxy_report_version_line#app.version=}

        if is_version_greater $oxy_report_version $oxy_report_version_old; then
            update_oxy_report
        else
            echo "Versão do report-server já atualizada ${oxy_report_version}"
        fi
    else
        update_oxy_report
    fi
}

mostrar_menu()
{
    echo "============================================"
    echo "         SISTEMA DE ATUALIZAÇÃO"
    echo "============================================"
    echo "1) Portal Transparência"
    echo "2) Protocolo" 
    echo "3) Portal Contribuinte (Tributos)"
    echo "4) Único"
    echo "5) Report Server"
    echo "6) Atualizar Todos os Módulos"
    echo "0) Sair"
    echo "============================================"
    echo -n "Digite o número da opção desejada: "
}

executar_opcao()
{
    local opcao=$1
    
    case $opcao in
        1)
            echo "Iniciando atualização do Portal Transparência..."
            init_update_oxy_transparencia
            ;;
        2)
            echo "Iniciando atualização do Protocolo..."
            init_update_oxy_protocolo
            ;;
        3)
            echo "Iniciando atualização do Portal Contribuinte..."
            init_update_oxy_tributos
            ;;
        4)
            echo "Iniciando atualização do Único..."
            init_update_oxy_unico
            ;;
        5)
            echo "Iniciando atualização do Report Server..."
            init_update_oxy_report
            ;;
        6)
            echo "Iniciando atualização de todos os módulos..."
            init_update_oxy_transparencia &&
            init_update_oxy_protocolo &&
            init_update_oxy_tributos &&
            init_update_oxy_unico &&
            init_update_oxy_report
            ;;
        0)
            echo "Saindo do sistema..."
            exit 0
            ;;
        *)
            echo "Opção inválida! Tente novamente."
            return 1
            ;;
    esac
}

# Lógica principal
app_start=$1

if [ -z "$app_start" ]; then
    while true; do
        mostrar_menu
        read opcao
        echo
        
        if executar_opcao $opcao; then
            echo
            echo "Operação concluída!"
            echo
            read -p "Pressione Enter para continuar ou 'q' para sair: " continuar
            
            if [ "$continuar" = "q" ] || [ "$continuar" = "Q" ]; then
                echo "Saindo do sistema..."
                exit 0
            fi
        fi
        echo
    done
else
    # Mantém compatibilidade com o sistema antigo
    case $app_start in
        34)
            init_update_oxy_transparencia
            ;;
        4)
            init_update_oxy_protocolo
            ;;
        49)
            init_update_oxy_tributos
            ;;
        99)
            init_update_oxy_unico
            ;;
        50)
            init_update_oxy_report
            ;;
        *)
            echo "Parâmetro inválido!"
            mostrar_menu
            ;;
    esac
fi