#!/bin/bash

# ======================================================================
# Archivo:       iniciar-krita-selector
# Ruta:          /usr/local/bin/
# Autor:         Charlie Martínez® <cmartinez@quirinux.org>
# Licencia:      https://www.gnu.org/licenses/gpl-2.0.txt
# Propósito:     Inicia Krita. Si hay Krita de apt y de Flatpak instalados,
#                pregunta cuál iniciar. Lo usa krita.desktop.
# Distribución:  Quirinux 2.x
# ======================================================================

#
# Copyright (c) 2019-2025 Charlie Martínez, derechos reservados.
# Licencia: https://www.gnu.org/licenses/gpl-2.0.txt
# Usos autorizados y no autorizados de la marca Quirinux:
# Ver https://www.quirinux.org/aviso-legal
#

# Uso:  iniciar-krita-selector [archivos a abrir...]
#   - solo Krita de apt       -> lo inicia
#   - solo Krita Flatpak      -> lo inicia
#   - ambos                   -> muestra un selector para elegir

# ----------------------------------------------------------------------
# Traducciones
# ----------------------------------------------------------------------

LANG_CODE="${LANG%%_*}"
SUPPORTED_LANGS="es en gl pt fr it de ru hu"

# Idioma por defecto
[[ " $SUPPORTED_LANGS " =~ " $LANG_CODE " ]] || LANG_CODE="en"

declare -A TXT

# Español

TXT[es.select_title]="Elegir versión de Krita"
TXT[es.select_col]="Versiones de Krita instaladas"
TXT[es.select_text]="Se detectaron varias versiones de Krita. ¿Cuál quieres iniciar?"
TXT[es.opt_apt]="Krita del sistema (apt) - versión %s"
TXT[es.opt_flatpak]="Krita Flatpak (Flathub) - versión %s"

# English

TXT[en.select_title]="Choose Krita version"
TXT[en.select_col]="Installed Krita versions"
TXT[en.select_text]="Several Krita versions were detected. Which one do you want to start?"
TXT[en.opt_apt]="System Krita (apt) - version %s"
TXT[en.opt_flatpak]="Krita Flatpak (Flathub) - version %s"

# Galego

TXT[gl.select_title]="Escoller a versión de Krita"
TXT[gl.select_col]="Versións de Krita instaladas"
TXT[gl.select_text]="Detectáronse varias versións de Krita. Cal queres iniciar?"
TXT[gl.opt_apt]="Krita do sistema (apt) - versión %s"
TXT[gl.opt_flatpak]="Krita Flatpak (Flathub) - versión %s"

# Português

TXT[pt.select_title]="Escolher a versão do Krita"
TXT[pt.select_col]="Versões do Krita instaladas"
TXT[pt.select_text]="Foram detectadas várias versões do Krita. Qual deseja iniciar?"
TXT[pt.opt_apt]="Krita do sistema (apt) - versão %s"
TXT[pt.opt_flatpak]="Krita Flatpak (Flathub) - versão %s"

# Français

TXT[fr.select_title]="Choisir la version de Krita"
TXT[fr.select_col]="Versions de Krita installées"
TXT[fr.select_text]="Plusieurs versions de Krita ont été détectées. Laquelle souhaitez-vous lancer ?"
TXT[fr.opt_apt]="Krita du système (apt) - version %s"
TXT[fr.opt_flatpak]="Krita Flatpak (Flathub) - version %s"

# Italiano

TXT[it.select_title]="Scegli la versione di Krita"
TXT[it.select_col]="Versioni di Krita installate"
TXT[it.select_text]="Sono state rilevate più versioni di Krita. Quale vuoi avviare?"
TXT[it.opt_apt]="Krita di sistema (apt) - versione %s"
TXT[it.opt_flatpak]="Krita Flatpak (Flathub) - versione %s"

# Deutsch

TXT[de.select_title]="Krita-Version auswählen"
TXT[de.select_col]="Installierte Krita-Versionen"
TXT[de.select_text]="Es wurden mehrere Krita-Versionen gefunden. Welche möchten Sie starten?"
TXT[de.opt_apt]="System-Krita (apt) – Version %s"
TXT[de.opt_flatpak]="Krita Flatpak (Flathub) – Version %s"

# Русский

TXT[ru.select_title]="Выбор версии Krita"
TXT[ru.select_col]="Установленные версии Krita"
TXT[ru.select_text]="Обнаружено несколько версий Krita. Какую запустить?"
TXT[ru.opt_apt]="Krita из системы (apt) — версия %s"
TXT[ru.opt_flatpak]="Krita Flatpak (Flathub) — версия %s"

# Magyar

TXT[hu.select_title]="Krita-verzió kiválasztása"
TXT[hu.select_col]="Telepített Krita-verziók"
TXT[hu.select_text]="Több Krita-verzió is telepítve van. Melyiket szeretné elindítani?"
TXT[hu.opt_apt]="Rendszer Krita (apt) – verzió %s"
TXT[hu.opt_flatpak]="Krita Flatpak (Flathub) – verzió %s"

# ----------------------------------------------------------------------
# Detección de instalaciones de Krita (apt/sistema y Flatpak)
# ----------------------------------------------------------------------
APP_CMD="krita"            # ejecutable de la versión apt
APT_PKG="krita"            # paquete apt
FLATPAK_ID="org.kde.krita"
VERSION_FLAG="--version"     # vacío = no ejecutar la aplicación solo para leer su versión

HAS_NATIVE=0
HAS_FLATPAK=0
NATIVE_VER=""
FLATPAK_VER=""

# Versión de un paquete apt instalado, sin epoch ni sufijos de empaquetado
# (1:5.1.5+dfsg-2 -> 5.1.5). Vacío si el paquete no está instalado.
_apt_ver() {
    local v
    v=$(dpkg-query -W -f='${db:Status-Status}\t${Version}\n' "$1" 2>/dev/null \
        | awk -F'\t' '$1 == "installed" {print $2; exit}')
    v="${v#*:}"
    v="${v%%[+~-]*}"
    echo "$v"
}

_detectar() {
    # Krita instalado desde apt (o cualquier "krita" en el PATH)
    if command -v "$APP_CMD" >/dev/null 2>&1; then
        HAS_NATIVE=1
        NATIVE_VER=$(_apt_ver "$APT_PKG")
        # Respaldo: si no viene de un paquete .deb, se le pregunta al ejecutable
        if [[ -z "$NATIVE_VER" && -n "$VERSION_FLAG" ]]; then
            NATIVE_VER=$(timeout 10 "$APP_CMD" "$VERSION_FLAG" 2>/dev/null \
                | grep -oE '[0-9]+(\.[0-9]+)+' | head -n1)
        fi
    fi

    # Krita instalado desde Flathub (sistema o usuario)
    if command -v flatpak >/dev/null 2>&1 && flatpak info "$FLATPAK_ID" >/dev/null 2>&1; then
        HAS_FLATPAK=1
        # flatpak traduce las etiquetas ("Versión:" en español): forzar idioma neutro
        FLATPAK_VER=$(LC_ALL=C LANGUAGE=C flatpak info "$FLATPAK_ID" 2>/dev/null \
            | sed -n 's/^[[:space:]]*Version:[[:space:]]*//p' | head -n1)
        # Respaldo: "flatpak list" (columnas separadas por tabulador, sin depender del idioma)
        if [[ -z "$FLATPAK_VER" ]]; then
            FLATPAK_VER=$(LC_ALL=C LANGUAGE=C flatpak list --app --columns=application,version 2>/dev/null \
                | awk -F'\t' -v id="$FLATPAK_ID" '$1 == id {print $2}' | head -n1)
        fi
    fi

    # Si no se detecta nada, se mantiene el comportamiento original (apt)
    if (( ! HAS_NATIVE && ! HAS_FLATPAK )); then
        HAS_NATIVE=1
    fi
}

# ----------------------------------------------------------------------
# Flatpak
# ----------------------------------------------------------------------

# Krita de apt y el Flatpak comparten el ID org.kde.krita.desktop. Una copia
# oculta en ~/.local/share/applications (que se lee antes que todo) los oculta
# de verdad, y en el menu queda solo el lanzador oficial de Quirinux
# (krita.desktop). La copia se toma de /etc/skel (la misma que reciben los
# usuarios nuevos).
_ocultar_lanzador_flatpak() {
    local src="/etc/skel/.local/share/applications/${FLATPAK_ID}.desktop"
    local dstdir="${XDG_DATA_HOME:-$HOME/.local/share}/applications"
    local dst="$dstdir/${FLATPAK_ID}.desktop"

    # Si ya existe oculta (o es una copia ajena), no se toca. Si es la copia
    # visible de la version 1.0.0+q2, se sustituye por la oculta.
    if [[ -e "$dst" ]]; then
        grep -q '^Hidden=true' "$dst" && return 0
        grep -q 'iniciar-krita-selector' "$dst" || return 0
    fi
    mkdir -p "$dstdir" 2>/dev/null || return 0

    if [[ -f "$src" ]]; then
        cp -f "$src" "$dst" 2>/dev/null
    else
        cat > "$dst" 2>/dev/null << DESKTOP
[Desktop Entry]
Type=Application
Name=Krita
Exec=iniciar-krita-selector %F
NoDisplay=true
Hidden=true
DESKTOP
    fi
    return 0
}

# Los archivos se reenvían con --file-forwarding (portal de documentos), igual
# que hace el lanzador original del Flatpak, para no depender de los permisos
# de acceso al sistema de archivos de cada usuario.
_iniciar_flatpak() {
    if (( $# )); then
        exec flatpak run --file-forwarding "$FLATPAK_ID" @@ "$@" @@
    else
        exec flatpak run "$FLATPAK_ID"
    fi
}

# ----------------------------------------------------------------------
# Krita de apt
# ----------------------------------------------------------------------

_iniciar_apt() {
    exec "$APP_CMD" "$@"
}

# ----------------------------------------------------------------------
# Selector (solo si hay más de una instalación)
# ----------------------------------------------------------------------

# Escribe en stdout "apt" o "flatpak"; sale sin iniciar nada si se cancela
_elegir() {
    local l_apt l_flat choice

    # Sin zenity no se puede preguntar: se usa la versión Flatpak, que es la
    # que instala krita-quirinux
    if ! command -v zenity >/dev/null 2>&1; then
        echo "flatpak"
        return 0
    fi

    printf -v l_apt  "${TXT[$LANG_CODE.opt_apt]}"     "${NATIVE_VER:-?}"
    printf -v l_flat "${TXT[$LANG_CODE.opt_flatpak]}" "${FLATPAK_VER:-?}"

    choice=$(zenity --list \
        --title "${TXT[$LANG_CODE.select_title]}" \
        --text "${TXT[$LANG_CODE.select_text]}" \
        --width=600 --height=300 \
        --column "id" --column "${TXT[$LANG_CODE.select_col]}" \
        --hide-column=1 --print-column=1 \
        apt "$l_apt" \
        flatpak "$l_flat"
    ) || exit 0

    echo "$choice"
}

# ----------------------------------------------------------------------
# Principal
# ----------------------------------------------------------------------

_detectar
(( HAS_FLATPAK )) && _ocultar_lanzador_flatpak

if (( HAS_NATIVE && HAS_FLATPAK )); then
    case "$(_elegir)" in
        flatpak) _iniciar_flatpak "$@" ;;
        apt)     _iniciar_apt "$@" ;;
        *)       exit 0 ;;
    esac
elif (( HAS_FLATPAK )); then
    _iniciar_flatpak "$@"
else
    _iniciar_apt "$@"
fi
