#!/bin/bash
# last-act: arturo@2021-1-7 arturo@2020-5-8
# desc: Script que configura las secciones [Default Applications] y [Added Associations]
# En función del ejecutor del script se configura a nivel personal o global

# En resumen:
# [Default Applications] : asociación entre mimetype y aplicación (Desktop) que la abrirá por defecto (si se pincha doble click)
# [Added Associations] : asociación entre mimetypes y aplicaciones (uno o varios Desktop separados por ;) que aparecerá como opciones al pinchar con el botón derecho y elegir "abrir con"
# El aspecto de las secciones tiene el siguiente aspecto:
## [Default Applications]
## application/x-shockwave-flash=vx-firefox-swf.desktop
## [Added Associations]
## application/x-shockwave-flash=vx-firefox-swf.desktop;gnash.desktop;...desktop;...;

# El orden de preferencia para las asociaciones entre lanzadores FileDesktop y mimetypes:
# 1) Fichero local/personal:
# ${HOMEUSU}/.local/share/applications/mimeapps.list
# ${HOME}/.config/mimeapps.list
# 2) Fichero general para defaults:
# /etc/xdg/lubuntu/applications/defaults.list
# /usr/share/applications/defaults.list
# 3) Fichero general para asociaciones:
# /etc/xdg/lubuntu/applications/mimeapps.list
# /usr/share/applications/mimeapps.list

uso() {
    echo -e "=> Debes pasar como primer parámetro si quieres configurar:
    1 parámetro) [Default Applications] o [Added Associations] o --all
    Resto parámetros) A continuación una lista de asociaciones mimetype:filedesktop
    p.e. vx-mimetype-desktopfile-conf \"Default Applications\" \"\${LISTADO[@]}\"
    p.e. vx-mimetype-desktopfile-conf \"Added Associations\" \"\${LISTADO[@]}\"
    p.e. vx-mimetype-desktopfile-conf --all \"\${LISTADO[@]}\"
    Donde LISTADO podría ser lo siguiente:
    LISTADO=(
    \"application/x-java-archive:vx-java-jar.desktop\"
    \"application/java-archive:vx-java-jar.desktop\"
    \"application/x-jar:vx-java-jar.desktop\"
    LISTADO=(
    \"application/x-java-archive;application/java-archive;application/x-jar:vx-java-jar.desktop;vx-java-jar.desktop\"
    \"application/tipo1;application/tipo2;application/tipo3:vx-app1.desktop;vx-app2.desktop\"
    )
    "
    exit 1
}

# Comprobamos el primer parámetro recibido:
REGEX='^Default Applications$|^Added Associations$|^--all$'
OPCION="${1}"
LISTA_OPCIONES=()
[[ "${OPCION}" =~ ${REGEX} ]] && \
{
    [[ "${OPCION}" == "--all" ]] && \
    LISTA_OPCIONES=( "Default Applications" "Added Associations" ) || \
    LISTA_OPCIONES=( "${OPCION}" )
    shift ;
} || uso

EJECUTOR="$(whoami)"
USUARIO="$(vx-usuario-grafico)"
HOMEUSU="$(vx-home-usuario-grafico)"
VER_VITALINUX=$(lsb_release -cs) || exit 1
LISTA_ARCHIVOS=()
[[ "${EJECUTOR}" == "root" ]] && \
{
    [[ "${VER_VITALINUX}" == "bionic" ]] && \
    LISTA_ARCHIVOS=( "/etc/xdg/lubuntu/applications/mimeapps.list" ) || \
    LISTA_ARCHIVOS=( "/usr/share/applications/mimeapps.list" ) ;
} || \
{
    [[ "${VER_VITALINUX}" == "bionic" ]] && \
    LISTA_ARCHIVOS=( "${HOMEUSU}/.config/mimeapps.list" ) || \
    LISTA_ARCHIVOS=( "${HOMEUSU}/.local/share/applications/mimeapps.list" ) ;
}
echo "==> Lista de archivos a configurar: ${LISTA_ARCHIVOS[*]}"

for ARCHIVO in "${LISTA_ARCHIVOS[@]}" ; do
    if [ ! -f "${ARCHIVO}" ] ; then
        echo -e "=> No existe el archivo: \"${ARCHIVO}\".\n=> Se creará si hay permisos suficientes ..."
        DIR_BASE="$(dirname "${ARCHIVO}")"
        [ ! -d "${DIR_BASE}" ] && mkdir -p "${DIR_BASE}" && \
        echo "=> Se ha creado el directorio base: ${DIR_BASE}"
        echo -e "[Default Applications]\n[Added Associations]\n" > "${ARCHIVO}"
    fi
    for ASOCIACION in "${@}" ; do
        MIMETYPES="${ASOCIACION%:*}"
        LISTA_MIMETYPES=(${MIMETYPES//;/ })
        for MIMETYPE in "${LISTA_MIMETYPES[@]}" ; do
            for ELEMENTO in "${LISTA_OPCIONES[@]}" ; do
                # Obtenemos la lista de lanzadores recibidos para la asociación:
                LANZADORES="${ASOCIACION#*:}"
                LISTA_LANZADORES=(${LANZADORES//;/ })
                for LANZADOR in "${LISTA_LANZADORES[@]}" ; do
                    # Comprobamos que la asociación no exista ya:
                    EXISTE="false"
                    if OLD_LANZADORES="$(crudini --get "${ARCHIVO}" "${ELEMENTO}" "${MIMETYPE}")" ; then
                        REGEX="${LANZADOR};|${LANZADOR}$"
                        [[ ${OLD_LANZADORES} =~ ${REGEX} ]] && EXISTE="true" && \
                        echo "=> Ya existe la asociación ${ARCHIVO}: [${OPCION}] ${MIMETYPE} ${LANZADOR}"
                    fi
                    if ! "${EXISTE}" ; then
                        # Si se trata de añadir una asociación añadiremos el lanzador a lista de lanzadores que ya haya, teniendo en cuenta el posible ;
                        if [[ "${ELEMENTO}" == "Added Associations" && ! -z "${OLD_LANZADORES}" ]] ; then
                            # Comprobamos si la lista de lanzadores acaba en ";"
                            REGEX='^.*;$'
                            [[ "${OLD_LANZADORES}" =~ ${REGEX} ]] && \
                            NEW_LANZADORES="${OLD_LANZADORES}${LANZADOR};" || \
                            NEW_LANZADORES="${OLD_LANZADORES};${LANZADOR};"
                        else
                            [[ "${ELEMENTO}" == "Added Associations" ]] && \
                            NEW_LANZADORES="${LANZADOR};" || \
                            NEW_LANZADORES="${LANZADOR}"
                        fi
                        crudini --set "${ARCHIVO}" "${ELEMENTO}" "${MIMETYPE}" "${NEW_LANZADORES}" && \
                        echo "=> ${ARCHIVO}: [${OPCION}] ${MIMETYPE} ${NEW_LANZADORES}" || \
                        echo "=> Error al configurar: ${ARCHIVO} ... ¿Falta de permisos?"
                    fi
                done
            done
        done
    done
done

exit 0