#!/bin/bash

# ======================================================================
# Archivo:       gimp-quirinux
# Ruta:          /usr/local/bin/
# Autor:         Charlie Martínez® <cmartinez@quirinux.org>
# Licencia:      https://www.gnu.org/licenses/gpl-2.0.txt
# Propósito:     Alternar iconos y shortcuts de Photoshop en GIMP (apt y Flatpak)
# 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
#

# ----------------------------------------------------------------------
# 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.menu_title]="GIMP-QUIRINUX"
TXT[es.menu_col]="Opciones disponibles"
TXT[es.opt_ps_ps]="Usar iconos y atajos de Photoshop"
TXT[es.opt_gimp_gimp]="Usar iconos y atajos de GIMP"
TXT[es.opt_ps_gimp]="Usar iconos de Photoshop y atajos de GIMP"
TXT[es.opt_gimp_ps]="Usar iconos de GIMP y atajos de Photoshop"
TXT[es.opt_exit]="Salir"
TXT[es.progress_title]="Configurando"
TXT[es.progress_text]="Ten paciencia, llevará tiempo"
TXT[es.progress_step]="# Procesando"
TXT[es.cancel]="Configuración cancelada"
TXT[es.done]="Configuraciones realizadas. Siempre puedes revertirlas."
TXT[es.select_title]="Elegir versión de GIMP"
TXT[es.select_col]="Versiones de GIMP instaladas"
TXT[es.select_text]="Se detectaron varias versiones de GIMP. ¿Cuál quieres iniciar?"
TXT[es.opt_apt]="GIMP del sistema (apt) - versión %s"
TXT[es.opt_flatpak]="GIMP Flatpak (Flathub) - versión %s"
TXT[es.prep_title]="Preparando GIMP"
TXT[es.prep_text]="Preparando la configuración de GIMP Flatpak (solo la primera vez)…"

# Inglés

TXT[en.menu_title]="GIMP-QUIRINUX"
TXT[en.menu_col]="Available options"
TXT[en.opt_ps_ps]="Use Photoshop icons and shortcuts"
TXT[en.opt_gimp_gimp]="Use GIMP icons and shortcuts"
TXT[en.opt_ps_gimp]="Use Photoshop icons and GIMP shortcuts"
TXT[en.opt_gimp_ps]="Use GIMP icons and Photoshop shortcuts"
TXT[en.opt_exit]="Exit"
TXT[en.progress_title]="Configuring"
TXT[en.progress_text]="Please wait, this will take some time"
TXT[en.progress_step]="# Processing"
TXT[en.cancel]="Configuration canceled"
TXT[en.done]="Settings made. You can always reverse them."
TXT[en.select_title]="Choose GIMP version"
TXT[en.select_col]="Installed GIMP versions"
TXT[en.select_text]="Several GIMP versions were detected. Which one do you want to start?"
TXT[en.opt_apt]="System GIMP (apt) - version %s"
TXT[en.opt_flatpak]="GIMP Flatpak (Flathub) - version %s"
TXT[en.prep_title]="Preparing GIMP"
TXT[en.prep_text]="Preparing the GIMP Flatpak configuration (first time only)…"

# Gallego

TXT[gl.menu_title]="GIMP-QUIRINUX"
TXT[gl.menu_col]="Opcións dispoñibles"
TXT[gl.opt_ps_ps]="Usa iconas e atallos de Photoshop"
TXT[gl.opt_gimp_gimp]="Usa iconas e atallos de GIMP"
TXT[gl.opt_ps_gimp]="Usa iconas de Photoshop e atallos de GIMP"
TXT[gl.opt_gimp_ps]="Usa iconas de GIMP e atallos de Photoshop"
TXT[gl.opt_exit]="Saír"
TXT[gl.progress_title]="Configurando"
TXT[gl.progress_text]="Ten paciencia, levará tempo"
TXT[gl.progress_step]="# Procesando"
TXT[gl.cancel]="Configuración cancelada"
TXT[gl.done]="Configuración feita. Sempre podes revertela."
TXT[gl.select_title]="Escoller a versión de GIMP"
TXT[gl.select_col]="Versións de GIMP instaladas"
TXT[gl.select_text]="Detectáronse varias versións de GIMP. Cal queres iniciar?"
TXT[gl.opt_apt]="GIMP do sistema (apt) - versión %s"
TXT[gl.opt_flatpak]="GIMP Flatpak (Flathub) - versión %s"
TXT[gl.prep_title]="Preparando GIMP"
TXT[gl.prep_text]="Preparando a configuración de GIMP Flatpak (só a primeira vez)…"

# Portugués

TXT[pt.menu_title]="GIMP-QUIRINUX"
TXT[pt.menu_col]="Opções disponíveis"
TXT[pt.opt_ps_ps]="Use ícones e atalhos do Photoshop"
TXT[pt.opt_gimp_gimp]="Use ícones e atalhos do GIMP"
TXT[pt.opt_ps_gimp]="Use ícones do Photoshop e atalhos do GIMP"
TXT[pt.opt_gimp_ps]="Use ícones do GIMP e atalhos do Photoshop"
TXT[pt.opt_exit]="Sair"
TXT[pt.progress_title]="Configurando"
TXT[pt.progress_text]="Por favor, aguarde, isso levará algum tempo"
TXT[pt.progress_step]="# Processando"
TXT[pt.cancel]="Configuração cancelada"
TXT[pt.done]="Configurações feitas. Você sempre pode revertê-las."
TXT[pt.select_title]="Escolher a versão do GIMP"
TXT[pt.select_col]="Versões do GIMP instaladas"
TXT[pt.select_text]="Foram detectadas várias versões do GIMP. Qual deseja iniciar?"
TXT[pt.opt_apt]="GIMP do sistema (apt) - versão %s"
TXT[pt.opt_flatpak]="GIMP Flatpak (Flathub) - versão %s"
TXT[pt.prep_title]="Preparando o GIMP"
TXT[pt.prep_text]="Preparando a configuração do GIMP Flatpak (somente na primeira vez)…"

# Francés

TXT[fr.menu_title]="GIMP-QUIRINUX"
TXT[fr.menu_col]="Options disponibles"
TXT[fr.opt_ps_ps]="Utiliser les icônes et raccourcis Photoshop"
TXT[fr.opt_gimp_gimp]="Utiliser les icônes et raccourcis GIMP"
TXT[fr.opt_ps_gimp]="Utiliser les icônes Photoshop et raccourcis GIMP"
TXT[fr.opt_gimp_ps]="Utiliser les icônes GIMP et raccourcis Photoshop"
TXT[fr.opt_exit]="Quitter"
TXT[fr.progress_title]="Configuration"
TXT[fr.progress_text]="Veuillez patienter, cela prendra du temps"
TXT[fr.progress_step]="# Traitement en cours"
TXT[fr.cancel]="Configuration annulée"
TXT[fr.done]="Paramètres définis. Vous pouvez toujours les inverser."
TXT[fr.select_title]="Choisir la version de GIMP"
TXT[fr.select_col]="Versions de GIMP installées"
TXT[fr.select_text]="Plusieurs versions de GIMP ont été détectées. Laquelle souhaitez-vous lancer ?"
TXT[fr.opt_apt]="GIMP du système (apt) - version %s"
TXT[fr.opt_flatpak]="GIMP Flatpak (Flathub) - version %s"
TXT[fr.prep_title]="Préparation de GIMP"
TXT[fr.prep_text]="Préparation de la configuration de GIMP Flatpak (première fois uniquement)…"

# Italiano

TXT[it.menu_title]="GIMP-QUIRINUX"
TXT[it.menu_col]="Opzioni disponibili"
TXT[it.opt_ps_ps]="Usa icone e scorciatoie di Photoshop"
TXT[it.opt_gimp_gimp]="Usa icone e scorciatoie di GIMP"
TXT[it.opt_ps_gimp]="Usa icone Photoshop e scorciatoie di GIMP"
TXT[it.opt_gimp_ps]="Usa icone di GIMP e scorciatoie di Photoshop"
TXT[it.opt_exit]="Esci"
TXT[it.progress_title]="Configurazione"
TXT[it.progress_text]="Attendere, potrebbe richiedere del tempo"
TXT[it.progress_step]="# Elaborazione in corso"
TXT[it.cancel]="Configurazione annullata"
TXT[it.done]="Impostazioni effettuate. Puoi sempre invertirle."
TXT[it.select_title]="Scegli la versione di GIMP"
TXT[it.select_col]="Versioni di GIMP installate"
TXT[it.select_text]="Sono state rilevate più versioni di GIMP. Quale vuoi avviare?"
TXT[it.opt_apt]="GIMP di sistema (apt) - versione %s"
TXT[it.opt_flatpak]="GIMP Flatpak (Flathub) - versione %s"
TXT[it.prep_title]="Preparazione di GIMP"
TXT[it.prep_text]="Preparazione della configurazione di GIMP Flatpak (solo la prima volta)…"

# Alemán

TXT[de.menu_title]="GIMP-QUIRINUX"
TXT[de.menu_col]="Verfügbare Optionen"
TXT[de.opt_ps_ps]="Photoshop-Symbole und Verknüpfungen verwenden"
TXT[de.opt_gimp_gimp]="GIMP-Symbole und Verknüpfungen verwenden"
TXT[de.opt_ps_gimp]="Photoshop-Symbole und GIMP-Verknüpfungen verwenden"
TXT[de.opt_gimp_ps]="GIMP-Symbole und Photoshop-Verknüpfungen verwenden"
TXT[de.opt_exit]="Beenden"
TXT[de.progress_title]="Konfiguration"
TXT[de.progress_text]="Bitte warten, dies kann etwas dauern"
TXT[de.progress_step]="# Verarbeitung läuft"
TXT[de.cancel]="Konfiguration abgebrochen"
TXT[de.done]="Einstellungen vorgenommen. Sie können sie jederzeit rückgängig machen."
TXT[de.select_title]="GIMP-Version auswählen"
TXT[de.select_col]="Installierte GIMP-Versionen"
TXT[de.select_text]="Es wurden mehrere GIMP-Versionen gefunden. Welche möchten Sie starten?"
TXT[de.opt_apt]="System-GIMP (apt) – Version %s"
TXT[de.opt_flatpak]="GIMP Flatpak (Flathub) – Version %s"
TXT[de.prep_title]="GIMP wird vorbereitet"
TXT[de.prep_text]="Die Konfiguration von GIMP Flatpak wird vorbereitet (nur beim ersten Mal)…"

# Ruso 

TXT[ru.menu_title]="GIMP-QUIRINUX"
TXT[ru.menu_col]="Доступные варианты"
TXT[ru.opt_ps_ps]="Значки и ярлыки Photoshop"
TXT[ru.opt_gimp_gimp]="Значки и ярлыки GIMP"
TXT[ru.opt_ps_gimp]="Значки Photoshop и ярлыки GIMP"
TXT[ru.opt_gimp_ps]="Значки GIMP и ярлыки Photoshop"
TXT[ru.opt_exit]="Выход"
TXT[ru.progress_title]="Настройка"
TXT[ru.progress_text]="Пожалуйста, подождите, это займет некоторое время"
TXT[ru.progress_step]="# Обработка"
TXT[ru.cancel]="Настройка отменена"
TXT[ru.done]="Настройки применены. Их можно отменить в любое время."
TXT[ru.select_title]="Выбор версии GIMP"
TXT[ru.select_col]="Установленные версии GIMP"
TXT[ru.select_text]="Обнаружено несколько версий GIMP. Какую запустить?"
TXT[ru.opt_apt]="GIMP из системы (apt) — версия %s"
TXT[ru.opt_flatpak]="GIMP Flatpak (Flathub) — версия %s"
TXT[ru.prep_title]="Подготовка GIMP"
TXT[ru.prep_text]="Подготовка конфигурации GIMP Flatpak (только при первом запуске)…"

# Húngaro

TXT[hu.menu_title]="GIMP-QUIRINUX"
TXT[hu.menu_col]="Elérhető lehetőségek"
TXT[hu.opt_ps_ps]="Photoshop ikonok és gyorsbillentyűk használata"
TXT[hu.opt_gimp_gimp]="GIMP ikonok és gyorsbillentyűk használata"
TXT[hu.opt_ps_gimp]="Photoshop ikonok és GIMP gyorsbillentyűk"
TXT[hu.opt_gimp_ps]="GIMP ikonok és Photoshop gyorsbillentyűk"
TXT[hu.opt_exit]="Kilépés"
TXT[hu.progress_title]="Beállítás"
TXT[hu.progress_text]="Kérjük, várjon, ez eltarthat egy ideig"
TXT[hu.progress_step]="# Feldolgozás"
TXT[hu.cancel]="Beállítás megszakítva"
TXT[hu.done]="Beállítások alkalmazva. Bármikor visszavonhatók."
TXT[hu.select_title]="GIMP-verzió kiválasztása"
TXT[hu.select_col]="Telepített GIMP-verziók"
TXT[hu.select_text]="Több GIMP-verzió is telepítve van. Melyiket szeretné elindítani?"
TXT[hu.opt_apt]="Rendszer GIMP (apt) – verzió %s"
TXT[hu.opt_flatpak]="GIMP Flatpak (Flathub) – verzió %s"
TXT[hu.prep_title]="GIMP előkészítése"
TXT[hu.prep_text]="A GIMP Flatpak konfigurációjának előkészítése (csak első alkalommal)…"

# ----------------------------------------------------------------------
# Detección de instalaciones de GIMP (apt/sistema y Flatpak)
# ----------------------------------------------------------------------
SHARE="/usr/local/share/gimp-quirinux"
FLATPAK_ID="org.gimp.GIMP"
# GIMP (apt y Flatpak) leen/escriben en ~/.config/GIMP/<versión>: el Flatpak
# usa la carpeta del sistema (permiso xdg-config/GIMP), no ~/.var/app/...
CFG_BASE="${XDG_CONFIG_HOME:-$HOME/.config}"

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

_detectar() {
    # GIMP instalado desde apt (o cualquier "gimp" en el PATH)
    if command -v gimp >/dev/null 2>&1; then
        HAS_NATIVE=1
        NATIVE_VER=$(gimp --version 2>/dev/null | awk '{print $NF}' | head -n1)
    fi

    # GIMP 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
}

# ----------------------------------------------------------------------
# Funciones comunes
# ----------------------------------------------------------------------
_salir() { exit 0; }

_fin() {
    # Si hay Flatpak, dejar lista su configuración antes de que se abra con ventana
    if (( HAS_FLATPAK )); then
        _flatpak_dir
        _preparar_flatpak
    fi
    zenity --info --text "${TXT[$LANG_CODE.done]}"
    _lanzar
}

# Inicia GIMP; si hay más de una instalación, ofrece un selector
_lanzar() {
    local choice=""

    if (( HAS_NATIVE && HAS_FLATPAK )); then
        local l_apt l_flat
        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"
        ) || _salir
    elif (( HAS_FLATPAK )); then
        choice="flatpak"
    else
        choice="apt"
    fi

    case "$choice" in
        flatpak) _lanzar_flatpak ;;
        apt)     exec gimp ;;
        *)       _salir ;;
    esac
}

# Carpeta de configuración y variable de entorno que usa el Flatpak
# (3.2.6 -> ~/.config/GIMP/3.2 con GIMP3_DIRECTORY ; 2.10.x -> GIMP2_DIRECTORY)
_flatpak_dir() {
    FP_DIR=""; FP_VAR="GIMP3_DIRECTORY"
    if [[ -n "$FLATPAK_VER" ]]; then
        FP_DIR="$CFG_BASE/GIMP/$(echo "$FLATPAK_VER" | cut -d. -f1,2)"
        [[ "$FLATPAK_VER" == 2.* ]] && FP_VAR="GIMP2_DIRECTORY"
    fi
}

# GIMP 3.x migra la configuración anterior (3.0 -> 3.2) la primera vez que se
# abre. Si esa primera apertura es con ventana, los temas de iconos que viven
# en la carpeta del usuario (como el de Photoshop) no se registran y se ven
# sin iconos. Por eso la migración se hace antes, sin ventana (-i --quit).
_preparar_flatpak() {
    [[ -n "$FP_DIR" && ! -d "$FP_DIR" ]] || return 0
    (
        flatpak run --env="$FP_VAR=$FP_DIR" "$FLATPAK_ID" -i --quit >/dev/null 2>&1
        echo "100"
    ) | zenity --progress --pulsate --auto-close --no-cancel \
            --title="${TXT[$LANG_CODE.prep_title]}" \
            --text="${TXT[$LANG_CODE.prep_text]}" 2>/dev/null
}

# Inicia el Flatpak indicando de forma explícita la carpeta de configuración
_lanzar_flatpak() {
    _flatpak_dir
    if [[ -n "$FP_DIR" ]]; then
        exec flatpak run --env="$FP_VAR=$FP_DIR" "$FLATPAK_ID"
    else
        exec flatpak run "$FLATPAK_ID"
    fi
}

# Carpeta de configuración compartida por GIMP de apt y GIMP Flatpak
_file() {
    mkdir -p "$CFG_BASE/GIMP"
}

_borrar() {
    rm -rf "$CFG_BASE/GIMP"
}

# Copia uno o más conjuntos de configuración (en orden). Se copian las
# carpetas de todas las versiones (2.10 y 3.0): GIMP 3.2 migra la 3.0 solo.
_cfg() {
    local set
    for set in "$@"; do
        cp -rf "$SHARE/$set/.config/"* "$CFG_BASE/"
    done
}

# Datos globales en /usr/share/gimp: solo aplican al GIMP de apt
# (el Flatpak es de solo lectura, no se toca)
_share() {
    (( HAS_NATIVE )) || return 0
    cp -rf "$SHARE/$1/usr/share/gimp/"* /usr/share/gimp/
}

# ----------------------------------------------------------------------
# Aplicadores de configuraciones
# ----------------------------------------------------------------------

_photoshop() {
    _file
    _cfg gimp-shop
    _share gimp-shop
}

_gimp() {
    _file
    _cfg gimp-original-full
    _share gimp-original-full
}

_photogimp() {
    _file
    _cfg gimp-shop gimp-original-rc
}

_gimpshop() {
    _file
    _cfg gimp-original-full gimp-shop-rc
}

# ----------------------------------------------------------------------
# Barra de progreso
# ----------------------------------------------------------------------

_run_with_progress() {
(
    _borrar
    echo "50"; sleep 1
    echo "${TXT[$LANG_CODE.progress_step]}"
    "$1"
    echo "100"; sleep 1
    echo "${TXT[$LANG_CODE.progress_step]}"
) |
zenity --progress \
    --title="${TXT[$LANG_CODE.progress_title]}" \
    --text="${TXT[$LANG_CODE.progress_text]}" \
    --percentage=0 --auto-close --auto-kill

[[ "$?" == -1 ]] && zenity --error --text="${TXT[$LANG_CODE.cancel]}"
}

# ----------------------------------------------------------------------
# Menú principal
# ----------------------------------------------------------------------

menu_principal() {

choice=$(zenity --list \
    --title "${TXT[$LANG_CODE.menu_title]}" \
    --width=600 --height=300 \
    --column "${TXT[$LANG_CODE.menu_col]}" \
    "${TXT[$LANG_CODE.opt_ps_ps]}" \
    "${TXT[$LANG_CODE.opt_gimp_gimp]}" \
    "${TXT[$LANG_CODE.opt_ps_gimp]}" \
    "${TXT[$LANG_CODE.opt_gimp_ps]}" \
    "${TXT[$LANG_CODE.opt_exit]}"
)

case "$choice" in
    "${TXT[$LANG_CODE.opt_ps_ps]}")   _run_with_progress _photoshop; _fin ;;
    "${TXT[$LANG_CODE.opt_gimp_gimp]}") _run_with_progress _gimp; _fin ;;
    "${TXT[$LANG_CODE.opt_ps_gimp]}") _run_with_progress _photogimp; _fin ;;
    "${TXT[$LANG_CODE.opt_gimp_ps]}") _run_with_progress _gimpshop; _fin ;;
    *) _salir ;;
esac
}

_detectar
menu_principal
