#!/bin/bash
# Lancador do LexSigner (v5) - (c) 2026 LexSigner, todos os direitos reservados
# Encontra um Java utilizavel e informa o motivo exato quando nao consegue.

DIR="$(cd "$(dirname "$0")/../Resources" && pwd)"
JAR="$DIR/LexSigner.jar"
LOG="$HOME/Library/Logs/LexSigner.log"

# --- o conversor embutido precisa PODER rodar.
# Dois sabotadores conhecidos: descompactadores que perdem o bit de execucao
# do zip, e a marca de quarentena do macOS, que bloqueia o exec de um binario
# baixado mesmo com o bit certo (o Gatekeeper age no exec, nao no ls).
# Sem isto, o aplicativo abre normal e toda conversao de audio morre calada
# no nascimento do processo.
if [ -f "$DIR/ffmpeg" ]; then
    [ -x "$DIR/ffmpeg" ] || /bin/chmod +x "$DIR/ffmpeg" 2>/dev/null
    /usr/bin/xattr -d com.apple.quarantine "$DIR/ffmpeg" >/dev/null 2>&1
fi

# --- o Java que vem DENTRO do aplicativo.
# A versao 7.0 provou, com medicao, que o comportamento do programa mudava
# conforme o Java que estivesse instalado no Mac: o JavaSound do Java 8
# recusa um WAV que o do Java 21 aceita, e uma conversao inteira caia por
# causa dessa loteria. A resposta definitiva e nao depender da maquina:
# o .app carrega o proprio runtime (Temurin 21, recortado por jlink).
# Ele e arm64; num Mac Intel o lancador segue para a busca de sempre.
RUNTIME="$(cd "$DIR/.." && pwd)/Runtime"
if [ -x "$RUNTIME/bin/java" ] && [ "$(/usr/bin/uname -m)" = "arm64" ]; then
    /usr/bin/xattr -dr com.apple.quarantine "$RUNTIME" >/dev/null 2>&1
fi

# --- drivers PKCS#11 embarcados: mesma dequarentena do ffmpeg e do Runtime.
# Sem isto o Gatekeeper barra o dlopen da biblioteca embutida e o token
# "nao abre" sem explicacao.
FRAMEWORKS="$(cd "$DIR/.." && pwd)/Frameworks"
if [ -d "$FRAMEWORKS" ]; then
    /usr/bin/xattr -dr com.apple.quarantine "$FRAMEWORKS" >/dev/null 2>&1
fi

# --- localidade UTF-8, obrigatoria para nome de arquivo com acento.
# O Finder abre aplicativos sem LANG definido. Sem uma localidade UTF-8 o Java
# grava nomes de arquivo em ASCII: "peticao.pdf" com cedilha falha ao ser
# criado, ou vira "peti??o.pdf". No Terminal isso nao aparece, porque o shell
# ja define LANG — por isso o problema so surge no uso real, pelo icone.
case "$LANG" in
    *[Uu][Tt][Ff]*8*) ;;
    *)
        DISPONIVEIS="$(/usr/bin/locale -a 2>/dev/null)"
        for tentativa in pt_BR.UTF-8 en_US.UTF-8 C.UTF-8; do
            if printf '%s\n' "$DISPONIVEIS" | grep -qx "$tentativa"; then
                export LANG="$tentativa"
                export LC_ALL="$tentativa"
                break
            fi
        done
        ;;
esac
mkdir -p "$(dirname "$LOG")"

alerta() {
    /usr/bin/osascript -e "display alert \"$1\" message \"$2\" as critical buttons {\"OK\"} default button 1" >/dev/null 2>&1
}

# --- procura um Java utilizavel, do mais provavel ao mais improvavel
CANDIDATOS=()
# O runtime embutido vem PRIMEIRO: e o unico Java em que o programa foi
# testado por inteiro, versao por versao. Os demais sao reserva — um Mac
# Intel, ou um Runtime que alguem apagou, continuam funcionando como antes.
if [ -x "$RUNTIME/bin/java" ] && [ "$(/usr/bin/uname -m)" = "arm64" ]; then
    CANDIDATOS+=("$RUNTIME/bin/java")
fi
if [ -x /usr/libexec/java_home ]; then
    while IFS= read -r casa; do
        [ -n "$casa" ] && CANDIDATOS+=("$casa/bin/java")
    done < <(/usr/libexec/java_home -V 2>&1 | awk -F'"' '/\/.*Contents\/Home/ {print $NF}' | sed 's/^ *//')
    PADRAO="$(/usr/libexec/java_home 2>/dev/null)"
    [ -n "$PADRAO" ] && CANDIDATOS=("$PADRAO/bin/java" "${CANDIDATOS[@]}")
fi
for extra in \
    /Library/Java/JavaVirtualMachines/*/Contents/Home/bin/java \
    /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java \
    /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java \
    /opt/homebrew/opt/openjdk/bin/java \
    /usr/local/opt/openjdk/bin/java \
    "$(command -v java 2>/dev/null)"
do
    [ -x "$extra" ] && CANDIDATOS+=("$extra")
done

# --- escolhe o primeiro com versao 8 ou superior
JAVA=""
MELHOR=0
ENCONTRADOS=""
for c in "${CANDIDATOS[@]}"; do
    [ -x "$c" ] || continue
    # A linha da versao nem sempre e a primeira: avisos de JAVA_TOOL_OPTIONS ou
    # _JAVA_OPTIONS vem antes. Por isso procura-se a linha, em vez de head -1.
    v="$("$c" -version 2>&1 | grep -m1 -E '(^| )version "' )"
    [ -z "$v" ] && v="$("$c" -version 2>&1 | tail -3 | head -1)"
    ENCONTRADOS="$ENCONTRADOS
  $c
      $v"
    # numero entre aspas: "1.8.0_301" -> 8 ; "11.0.2" -> 11 ; "21" -> 21
    num="$(printf '%s' "$v" | sed -n 's/.*version "\([0-9][0-9._]*\).*/\1/p')"
    maior="$(printf '%s' "$num" | cut -d. -f1)"
    if [ "$maior" = "1" ]; then
        maior="$(printf '%s' "$num" | cut -d. -f2)"
    fi
    if [ -n "$maior" ] && [ "$maior" -ge 8 ] 2>/dev/null; then
        # Fica com o Java mais novo, nao com o primeiro encontrado. O primeiro
        # costuma ser o Java 8 antigo que ficou de alguma instalacao anterior,
        # e o suporte a token PKCS#11 e melhor nas versoes recentes.
        if [ "$maior" -gt "$MELHOR" ]; then
            MELHOR="$maior"
            JAVA="$c"
        fi
        # O runtime embutido nao disputa por numero de versao: se ele executa
        # e tem versao valida, e o escolhido, porque e o unico em que a
        # bateria inteira do produto rodou. A busca continua so para montar o
        # diagnostico dos demais.
        if [ "$c" = "$RUNTIME/bin/java" ]; then
            JAVA="$c"
            MELHOR=99
        fi
    fi
done

if [ -z "$JAVA" ]; then
    if [ -n "$ENCONTRADOS" ]; then
        alerta "Java muito antigo" "O LexSigner precisa do Java 8 ou superior. O que existe neste Mac:$ENCONTRADOS

Instale o Temurin (gratuito) em adoptium.net e abra o aplicativo de novo."
    else
        alerta "Java não encontrado" "O LexSigner precisa do Java para funcionar, e não há nenhum instalado neste Mac.

Baixe o Temurin (gratuito) em adoptium.net, escolhendo macOS e o processador do seu Mac, instale e abra o aplicativo de novo."
    fi
    exit 1
fi

# --- executa, guardando a saida para diagnostico
{
    echo "=============================================="
    echo "Início: $(date)"
    echo "Java:   $JAVA"
    "$JAVA" -version 2>&1 | sed 's/^/        /'
} >> "$LOG"

# --- monta as opcoes da JVM, descartando as que este Java nao aceita.
# Uma unica opcao desconhecida (o -Xdock: fora do macOS, por exemplo) faz a
# JVM abortar antes de desenhar qualquer janela: o aplicativo simplesmente
# nao abre, sem mensagem. Por isso cada opcao e testada antes de entrar.
OPCOES=()
juntar_se_aceita() {
    if "$JAVA" "$@" -version >/dev/null 2>&1; then
        OPCOES+=("$@")
    else
        echo "opção ignorada (não suportada por este Java): $*" >> "$LOG"
    fi
}

juntar_se_aceita -Xdock:name="LexSigner"
juntar_se_aceita -Xdock:icon="$DIR/LexSigner.icns"
juntar_se_aceita -Xmx3g
juntar_se_aceita -Dfile.encoding=UTF-8
juntar_se_aceita -Dsun.jnu.encoding=UTF-8
juntar_se_aceita -Dapple.laf.useScreenMenuBar=true
juntar_se_aceita -Dapple.awt.application.appearance=system
juntar_se_aceita -Dapple.awt.application.name="LexSigner"
# onde estao o ffmpeg e os demais recursos embutidos no .app
juntar_se_aceita -Dassinador.recursos="$DIR"
# o ffmpeg pode perder o bit de execucao ao sair do .dmg
[ -f "$DIR/ffmpeg" ] && [ ! -x "$DIR/ffmpeg" ] && chmod +x "$DIR/ffmpeg" 2>/dev/null

"$JAVA" "${OPCOES[@]}" -jar "$JAR" "$@" >> "$LOG" 2>&1

CODIGO=$?
if [ $CODIGO -ne 0 ]; then
    ERRO="$(tail -12 "$LOG" | tr '"' "'" | tr '\n' ' ')"
    alerta "O LexSigner não conseguiu abrir" "Código $CODIGO.

$ERRO

O registro completo está em Biblioteca/Logs/LexSigner.log"
fi
exit $CODIGO
