#!/bin/bash

Info () {
title="Info"
author="Peter Starfinger"
mail="E-Mail: info@die-starfingers.de"
year="2021"
app="$(basename $0)"
msgid="The Starbuntu application
<i>\$app</i>
was written by"
info="$(gettext "$msgid" | (export PATH `envsubst --variables "$msgid"`; envsubst "$msgid"))"

yad --center --fixed --title="$title" --window-icon="/usr/share/icons/gnome/48x48/status/info.png" --image="/usr/share/icons/gnome/48x48/status/info.png" --borders=20 --text="$info"$'\n'$'\n'"$author"$'\n'"$mail"$'\n'$'\n'"$year"$'\n' --text-align=center --selectable-labels --button="OK" &
wunwa "$title" > /dev/null; xdotool key Home key Down
}

detect_device () {
    local label dvcs dvc
    label="$@"
    if [ -n "$label" ]; then
	dvcs="$(lsblk -o KNAME,LABEL,FSTYPE)"
	dvc_="$(echo "$dvcs" | grep -w "$label")"
	if [ -n "$dvc_" ]; then dvc="/dev/${dvc_%% *}"; type="${dvc_##* }"; else dvc=""; type=""; fi
    else
	dvc=""
    fi
    echo "$dvc"
}

[ "$1" = "info" ] && Info && exit 0
image=false; dvc=""; path=""
name="$1" # z. B. /dev/sdb1 or sdb1 or device name and/or path of image file
premounted="$@"
premounted="${premounted/$name/}"

if [ -z "$name" ]; then
    IFS=$'\n'
    dev_list=($(lsblk -o KNAME,LABEL,MOUNTPOINT,FSTYPE | grep -v " / " | grep -v -E "swap|KNAME" | grep -v ^[a-z0-9]*\ *$))
    n=${#dev_list[@]}
    for ((k=0; k<n; k++)); do dev_list[$k]=$'\t\t\t'"${dev_list[$k]%%   *}"; done
    title="Automount"
    text="$(echo $"Which data storage shall be mounted?")"$'\n'
    cancel=$"Cancel"
    name=$(yad --center --title="$title" --window-icon="/usr/share/rox/ROX/MIME/inode-mount-point.png" --text="<b>$text</b>" --text-align="center" --width=420 --height=$((n*26+80)) --list --no-headers --column=Device ${dev_list[@]} --button="$cancel":1 --button="Info":"$0 info" --button="OK":0)
    [ $? -gt 0 ] && exit 1
#    echo "$name"; exit
    name="${name:3}"; name="${name%%|*}"
fi

if [[ ! "$name" =~ sd[a-z][0-9]|loop[0-9]p[0-9]|mmc[a-z0-9]+|sr[0-9] ]]; then
    label="${name%%/*}"
    dvc="$(detect_device "$label")"
    if [ -n "$dvc" ]; then
	name="$dvc${name/$label/}"
    elif [[ "$name" =~ \.iso$|\.img$ ]] && [ -f "$name" ]; then
	image=true
    fi
fi
if [[ "$name" =~ sd[a-z][0-9]|loop[0-9]p[0-9]|mmc[a-z0-9]+|sr[0-9] ]]; then
    [[ "$name" =~ ^sd[a-z][0-9]|^loop|^mmc|^sr[0-9] ]] && name="/dev/$name"
    if [[ ! "$name" =~ sd[a-z][0-9]$|loop[0-9]p[0-9]$|mmc[a-z0-9]+$|sr[0-9]$ ]]; then
        rest="${name/\/dev\//}"
        rest="${rest%%\/*}"
	dvc="/dev/$rest"
	path="${name/$dvc\//}"
	name="$dvc"
    fi
fi

user=$(whoami)
[ ! -d "/media/$user" ] && mkdir "/media/$user"

id=$(echo $(ps ax | grep "watch-ports" | head -1))
id=${id%% *}
kill -STOP $id

$image && dev="$(udisksctl loop-setup -f "$name")" && dev="${dev##* }" && dev="${dev::-1}" || dev="$name"

msg="$(LANG=en_GB.UTF-8 udisksctl mount -b "$dev" 2>&1)"
error=$?
sleep 1
aim="$(echo "$msg" | cut -d\  -f4-)"
title="$(basename "$aim") "
if [ $error -gt 0 ]; then
    if [[ "$msg" =~ "already mounted" ]]; then
#	msg="$(cat /etc/mtab | grep $dev)"
#	aim="$(echo "$msg" | cut -d\  -f2)"
	aim="$(echo "$msg" | cut -d\` -f2 | cut -d\' -f1)"
	title="$(basename "$aim") "
	premounted="$premounted $dev"
	error=0
    else
	msg="$(udevil mount "$dev" 2>&1)"
	error=$?
	aim="$(echo "$msg" | cut -d\  -f4-)"
	title="$(basename "$aim") "
	if [ $error -gt 0 ]; then
	    error=404
	    [ $LANGUAGE != "en" ] && [ $(trans -b -identify "$msg") = "en" ] && msg="$(trans -b en:$LANGUAGE "$msg")"
	    yad --center --fixed --title=$"Error" --borders=20 --window-icon="dialog-warning" --image="dialog-warning" --text=$'\n'"$msg" --button="OK":0
	fi
    fi
fi
cd /
if [ $error -eq 0 ]; then
    if [ -z "$path" ]; then
	sh -c 'wunwa "Xephyr" > /dev/null; orient-act-win 8' & Rox2 1024x640 "$title" "$aim" $HOME
    else
	$0 "$aim/$path" "$premounted"
    fi
fi
if [[ ! "$premounted" =~ "$dev" ]]; then
    udevil unmount -l "$dev"
    $image && udisksctl loop-delete -b "$dev"
fi

kill -CONT $id

own="$(lsblk -o KNAME,TYPE,TRAN | grep disk | grep -v usb | cut -d\  -f1)"
if [[ ! "$dev" =~ "$own" ]] && ! $image; then
  if  [ $error -eq 0 ] && [[ ! "$premounted" =~ "$dev" ]]; then
    text=$"Now the mass storage
may be removed!"
  elif [ $error -ne 404 ]; then
    text=$"Perhaps the mass storage is still in use
and therefore should not be removed!"
  fi
  notify-send -i info "$text" 2>/dev/null
fi

