#!/bin/bash

ISRECURSO="false"
[[ ! -z "${1}" && -d "${1}" ]] && RECURSO="${1}" && ISRECURSO="true"

TITULO="Expusar dispositivos extraibles"
ICONO="drive-removable-media-usb"

# Comando udiskie-info que lista los dispositivos extraibles:
COMANDO="udiskie-info -a -o \":{mount_path}:{ui_device_presentation}:{ui_id_label}:{ui_device_label}:{is_ejectable}:{is_detachable}\""

function salir() {
    vx-funcs-bash vx-mensaje_y_salir \
    "${TITULO}" \
    "Lo sentimos. No se ha detectado ningún dispositivo o memoria a extraer." \
    "3" "${ICONO}" "Salir"
}

function desmontar_dispositivo_extraible() {
    # Unmount media and power down USB device:
    until [ -z "${1}" ] ; do
        [[ "$(eval "${COMANDO}" | grep "^:${1}:" | cut -d":" -f7)"  == "True" ]] && \
        IS_EJECTABLE="true" || \
        IS_EJECTABLE="false"
        "${IS_EJECTABLE}" && \
        udiskie-umount --detach --eject "${1}" || \
        udiskie-umount --detach "${1}"
        shift
    done
}

function mostrar_lista_dispositivos_extraibles() {
    OPCIONES=""
    TEXTO="\n Selecciona los dispositivos extraibles que deseas extraer de manera segura: "
    # Obtenemos la lista de elementos:
    OLDIFS=$IFS; IFS=$'\n';
    LISTA_DISPOSITIVOS=()
    for DISPOSITIVO in $(udiskie-info -a -o ":{mount_path}:{ui_device_presentation}:{ui_id_label}:{ui_device_label}") ; do
        PUNTO_MONTAJE="$(echo "${DISPOSITIVO}" | cut -d":" -f2)"
        LISTA_DISPOSITIVOS+=("${PUNTO_MONTAJE}")
        [[ -z "${PUNTO_MONTAJE}" || ! -d "${PUNTO_MONTAJE}" ]] && continue
        PARTICION="$(echo "${DISPOSITIVO}" | cut -d":" -f3)"
        # Obtenemos la raiz o disco del montaje: /dev/sda1 => /dev/sda ; /dev/sdc12 => /dev/sdc
        DISCO="${PARTICION//[[:digit:]]*}"
        NOMBRE="$(echo "${DISPOSITIVO}" | cut -d":" -f4)"
        if eval "${COMANDO}" | grep -q ":${DISCO}:" ; then
            MODELO="$(eval "${COMANDO}" | grep ":${DISCO}:" | cut -d":" -f6)"
        else
            MODELO="$(echo "${DISPOSITIVO}" | cut -d":" -f6)"
        fi
        OPCIONES+=" FALSE \"<b>${NOMBRE}</b> (${PUNTO_MONTAJE})\" \"[<b>$(vx-funcs-bash vx-trim "${MODELO}")</b>]\" \"${PUNTO_MONTAJE}\" "
    done
    # Comprobamos si hay dispositivos a extraer, sino salimos:
    (( ${#LISTA_DISPOSITIVOS[@]} == 0 )) && salir
    # Componemos la ventana yad con la lista de dispositivos detectados:
    IFS=$OLDIFS
    VENTANA="yad --title \"${TITULO}\" \
    --center \
    --window-icon \"${ICONO}\" \
    --image \"${ICONO}\" \
    --fixed --width \"720\" \
    --justify=\"center\" --text-align=\"center\" \
    --text \"${TEXTO}\" \
    --list --checklist \
    --column \"¿Expulsar?\":CHK \
    --column \"Dispositivo Extraible\" \
    --column \"Modelo\" \
    --column \"Punto de Montaje\":HD \
    ${OPCIONES} \
    --buttons-layout center \
    --button \"Expulsar\":0 \
    --button \"Cancelar\":1"
    if RESULTADO="$(eval "${VENTANA}")" ; then
        # El yad anterior devuelve tantas líneas como CHK han sido marcados.
        # El formato de cada linea devuelta es el siguiente:
        # TRUE|campo2|campo3|campo4(punto de montaje)
        OLDIFS=$IFS; IFS=$'\n';
        for DESMONTAJE in ${RESULTADO} ; do
            DISPOSITIVO_DESMONTAR="$(echo "${DESMONTAJE}" | cut -d"|" -f4)"
            echo "=> Se va a expulsar: ${DISPOSITIVO_DESMONTAR}"
            desmontar_dispositivo_extraible "${DISPOSITIVO_DESMONTAR}"
        done
        IFS=$OLDIFS
    fi
}

function consultar_desmontar_dispositivo_extraible() {
    INFO="$(eval "${COMANDO}" | grep "^:${RECURSO}:")"
    PUNTO_MONTAJE="$(echo "${INFO}" | cut -d":" -f2)"
    [ ! -d "${PUNTO_MONTAJE}" ] && salir
    PARTICION="$(echo "${INFO}" | cut -d":" -f3)"
    # Obtenemos la raiz del montaje: /dev/sda1 => /dev/sda ; /dev/sdc12 => /dev/sdc
    DISCO="${PARTICION//[[:digit:]]*}"
    NOMBRE="$(echo "${INFO}" | cut -d":" -f4)"
    if eval "${COMANDO}" | grep -q ":${DISCO}:" ; then
        MODELO="$(eval "${COMANDO}" | grep ":${DISCO}:" | cut -d":" -f6)"
    else
        MODELO="$(echo "${INFO}" | cut -d":" -f6)"
    fi
    OPCION="Dispositivo: <b>${NOMBRE}</b> (${PUNTO_MONTAJE}) [<b>$(vx-funcs-bash vx-trim "${MODELO}")</b>]"
    TEXTO="\n ¿Confirmas que quieres expulsar el medio extraible? \n${OPCION} \n"
    yad --title "${TITULO}" \
    --center \
    --window-icon "${ICONO}" \
    --image "${ICONO}" \
    --fixed --width "550" \
    --justify="center" --text-align="center" \
    --text "${TEXTO}" \
    --buttons-layout center \
    --button "Confirmar":0 \
    --button "Cancelar":1 && desmontar_dispositivo_extraible "${PUNTO_MONTAJE}"
}

if "${ISRECURSO}" ; then
    consultar_desmontar_dispositivo_extraible
else
    mostrar_lista_dispositivos_extraibles
fi

exit 0


