#!/bin/bash
# mabox-quickemu - dynamic menu gui for quickget/quickemu
# TODO: custom VM (linux only)
# TODO: translation
# TODO: check if snapshot tag exist

me="${0##*/}"
CONF_FILE="$HOME/.config/mabox/mabox-quickemu.conf"

source <(grep = ~/.config/mabox/mabox.conf)
# If config file not exist create one with defaults
if [ ! -f $CONF_FILE ]; then
cat <<EOF > ${CONF_FILE}
mode=basic
vms_dir=$HOME/emu
qget=/usr/bin/quickget
qget_md5=$(md5sum /usr/bin/quickget | awk '{print $1}')
options=(--display sdl --width 1600 --height 900)
EOF
fi

# read config variables from file
source <(grep = $CONF_FILE)

main(){
case $LANG in
    pl*)
    _TITLE="Mabox Quickemu Menu"
    ;;
    *)
    _TITLE="Mabox Quickemu Menu"
    ;;
esac
#if [ -f "${vms_dir}/*.conf" ];then
if [ -n "$(find ${vms_dir}/ -prune -empty -type d 2>/dev/null)" ];then
out+=("^sep(No Virtual Machines available)")
else
out+=("^sep(Virtual Machines)")
out1+=("^tag(vms)")
if [[ "$mode" != "basic" ]];then

out1+=("^sep(Manage VMs)")


	# list installed
	for vm in ${vms_dir}/*.conf;do
	config=${vm##*/}
	pretty=0
	source <(grep = ${vm})
		if [[ ${pretty} != 0 ]];then
		name="${pretty}"
		else
		name=${config%.*}
		fi
	#out+=("${config%.*},terminator --working-dir ${vms_dir} -e \"quickemu --vm ${config};bash\"")
	if [ ! -f "${vms_dir}/${disk_img}" ] && [ ! -f "${vms_dir}/${iso}" ];then
	out+=("<big>󰐊</big>   <s><i>${name}</i></s>	<span bgcolor='${warn_bgcolor}' fgcolor='${warn_fgcolor}'> info </span>,^checkout(bad$config)")
	out2+=("^tag(bad$config)")
	out2+=("^sep(_NO_DISK_NO_ISO)")
	out2+=("Open directory and place ISO into it ${disk_img%/*},xdg-open ${vms_dir}/${disk_img%/*}")
	else
	[[ ! -f "${vms_dir}/${disk_img}" ]] && icon="<big>     󰗮</big>" || icon=""
	out+=("<big>󰐊</big>   ${name}	${icon},quickemu --vm ${vms_dir}/${config} ${options[*]}")
	fi
	out1+=("${name},^checkout(vm${config})")

	#notify-send.sh "vm" "$vm"
	out2+=("^tag(vm${config})")
	out2+=("^sep(${name})")
	[[ "${pretty}" == 0 ]] && out2+=("Set pretty name..." "^sep()")
	out2+=("Edit config file,geany $vm")
	[[ -f "${vms_dir}/${disk_img}" ]] && out2+=("^sep()" "<big></big>   Clone VM as...,${me} clone ${vm}")
	## Snapshots
	if [[ -f "${vms_dir}/${disk_img}" ]];then 
	out2+=("^sep(Snapshots)")
	s=0
	while read -r id tag rest
	do
	((s++))
	out2+=("<big>󰓹</big>  tag: <b>${tag}</b>,^checkout($vm-snap-$s)")
	out3+=("^tag($vm-snap-$s)")
	out3+=("^sep(<i>Snapshot: ${tag}</i>)")
	out3+=("^sep(Apply)")
	out3+=("<big>北</big>   <b>Apply</b> ${tag},quickemu --vm ${vm} --snapshot apply ${tag};${me}")
	out3+=("^sep(Delete)")
	out3+=("<big>󰗨</big>   <b>Delete</b> ${tag},quickemu --vm ${vm} --snapshot delete ${tag};${me}")
	
	done < <(qemu-img snapshot -l "${vms_dir}/${disk_img}" | tail -n +3)
	[[ "$s" != 0 ]] && out2+=("^sep()")
	out2+=("Create snapshot...,${me} addsnapshot ${vm}")
	fi
	out2+=("^sep(Danger zone)")
	[[ -f "${vms_dir}/${disk_img}" ]] && out2+=("<big>󰋊</big>   Delete disk only,quickemu --vm ${vm} --delete-disk;${me}")

	[[ -f "${vms_dir}/${iso}" ]] && out2+=("<big>󰗮</big>   Delete ISO only,rm ${vms_dir}/${iso};${me}")
	out2+=("^sep()")
	out2+=("<big>󰚌</big>   Delete VM completly,quickemu --vm ${vm} --delete-vm;${me}")
	done
	out+=("^sep()")
	out+=("<big></big>   Manage VMs,^checkout(vms)")
	out1+=("^sep()")
	out1+=("<big></big>   Open VMs dir,xdg-open ${vms_dir}")
	if hash qdirstat 2>/dev/null;then 
	out1+=("<big>󰀻</big>   Open VMs dir in QDirStat,qdirstat ${vms_dir}")
	fi


else # basic mode
	# list installed
	out1+=("^sep(Delete VM)")
	for vm in ${vms_dir}/*.conf;do
	config=${vm##*/}
	pretty=0
	source <(grep = ${vm})
	if [[ ${pretty} != 0 ]];then
	name="${pretty}"
	else
	name=${config%.*}
	fi
	#out+=("${config%.*},terminator --working-dir ${vms_dir} -e \"quickemu --vm ${config};bash\"")
	if [ ! -f "${vms_dir}/${disk_img}" ] && [ ! -f "${vms_dir}/${iso}" ];then
	out+=("<big>󰐊</big>   <s><i>${name}</i></s>	<span bgcolor='${warn_bgcolor}' fgcolor='${warn_fgcolor}'> info </span>,^checkout(bad$config)")
	out2+=("^tag(bad$config)")
	out2+=("^sep(_NO_DISK_NO_ISO)")
	out2+=("Open directory and place ISO into it ${disk_img%/*},xdg-open ${vms_dir}/${disk_img%/*}")
	else
	[[ ! -f "${vms_dir}/${disk_img}" ]] && icon="<big>     󰗮</big>" || icon=""
	out+=("<big>󰐊</big>   ${name}	${icon},quickemu --vm ${vms_dir}/${config} ${options[*]}")
	fi
	out1+=("<big>󰚌</big>   Delete ${name},quickemu --vm ${vm} --delete-vm;${me}")
	done
	out+=("^sep()")
	out+=("<big>󰚌</big>   Delete Virtual Machine,^checkout(vms)")
fi
#else

fi
out+=("^sep(Quick Download)")
out+=("ABCD,^checkout(abc)")
out+=("EFGHIJKL,^checkout(ef)")
out+=("MNOPR,^checkout(mno)")
out+=("STUVWXYZ,^checkout(stu)")
out+=("^sep()")
out+=("_CREATE_CUSTOM_VM,mabox-quickemu custom")
out+=("^sep(Settings)")
[[ "${mode}" = "basic" ]] && out+=("<big></big>   Basic mode,mb-setvar mode=normal ${CONF_FILE};${me}") || out+=("<big>󰄱</big>   Basic mode,mb-setvar mode=basic ${CONF_FILE};${me}")

. $HOME/.config/mabox/mabox.conf
. /usr/share/mb-jgtools/pipemenu-standalone.cfg

read WALLPATH<<< $(grep file "$HOME"/.config/nitrogen/bg-saved.cfg |  tail -1 | cut -d'=' -f2)
THUMBDIR="$HOME/.cache/colorizer/thumbs"

NAME=${WALLPATH////_}
if [[ "${NAME}" =~ ^_home_.* ]]; then
    n=${#HOME}
    ((n++))
    NAME=${NAME:${n}}
fi
ext="${WALLPATH##*.}"
THUMB="${THUMBDIR}/${NAME}.png"
   
MENU_PADDING_TOP=${jgtools_padding:-0}
MENU_VALIGN="top"
MENU_MARGIN_Y=80
MENU_HALIGN="left"
jgmenu_icon_size=0
JGWIDTH=40
TABS=200
menu_margin_x=${submenu_spacing:-0}
[ $(pidof picom) ] && MENU_RADIUS=$jgtools_radius
[ -z $jgmenu_use_borders ] && menu_border=0
JGWIDTH=$((jgtools_padding + 270 + jgtools_padding))
    MENU_PADDING_TOP=$((jgtools_padding + 150))

mkconfigfile
echo menu_height_mode=dynamic >> ${CONFIG_FILE}


cat <<EOF > ${MENU_ITEMS}
@icon,,$((jgtools_padding )),$((jgtools_padding)),270,150,4,left,top,,,${THUMB}
@icon,,$((jgtools_padding)),$((jgtools_padding+84)),64,64,4,left,top,,,$HOME/.config/conky/images/mabox_3d.png
@rect,,$((jgtools_padding+68)),$((jgtools_padding + 118)),160,24,4,left,top,#222222 20,#222222 70,
@text,,$((jgtools_padding + 72)),$((jgtools_padding + 116)),180,28,0,left,top,#FFFFFF ,${WINCLR},<span size='10400' font_family='Ubuntu'>$_TITLE</span>
@rect,,$((jgtools_padding+4)),$((jgtools_padding + 6)),262,28,4,left,top,#222222 20,#222222 70,
@icon,,$((jgtools_padding+4)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-archlinux.svg
@icon,,$((jgtools_padding+30)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-manjaro.svg
@icon,,$((jgtools_padding+56)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-fedora.svg
@icon,,$((jgtools_padding+82)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-bunsenlabs.svg
@icon,,$((jgtools_padding+108)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-linux-mint.svg
@icon,,$((jgtools_padding+134)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-debian.svg
@icon,,$((jgtools_padding+160)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-ubuntu.svg
@icon,,$((jgtools_padding+186)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-solus.svg
@icon,,$((jgtools_padding+212)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-alpine.svg
@icon,,$((jgtools_padding+238)),$((jgtools_padding+8)),24,24,4,left,top,,,/usr/share/icons/Papirus/32x32/apps/distributor-logo-puppy-linux.svg
$(printf '%s\n' "${out[@]}")
$(printf '%s\n' "${out1[@]}")
$(printf '%s\n' "${out2[@]}")
$(printf '%s\n' "${out3[@]}")
. ~/.config/mabox/quickinst.csv
EOF

jgmenu --config-file=${CONFIG_FILE} --csv-file=${MENU_ITEMS} 2>/dev/null


printf '%s\n' "${out[@]}"
printf '%s\n' "${out1[@]}"
#printf '%s\n' "${out2[@]}"
#printf '%s\n' "${out3[@]}"
exit 0
}

clone(){
# GUI progress indicator!!!!!!!

#notify-send.sh "vm to clone" "${1}"
SRCCONF=${1##*/}
SRCDIR=${SRCCONF%.*}
notify-send.sh "SRC" "SRCCONF:${SRCCONF}\n SRCDIR: ${SRCDIR}"
#1. Prompt for name, make it lowercase,replace spaces with -
destpretty=$(yad --borders=40 --title="Clone VM as..." --center --ricon=gtk-clear --text-align=center \
--text="Cloning ${SRCDIR}.\n Enter name for new VM" --entry --entry-text="VM name")
[ -z "$destpretty" ] && exit 0
name=${destpretty// /-}
DESTDIR=${name,,}

#2. check if dir exist
if [[ -d "${vms_dir}/${DESTDIR}" ]];then
notify-send.sh "Error" "Dir: ${DESTDIR} already exist!"
exit 0
else
notify-send.sh -u critical -t 60000 --replace-file /tmp/clone_notify "_VM_CLONING" "Cloning ${SRCDIR} to ${destpretty}\n\nThis may take a while.\n\nPlease wait..." 
fi
#3. Copy config and replace dirname. Create dir, copy content from SRCDIR replace 
cp ${1} "${vms_dir}/${DESTDIR}.conf"
sd "${SRCDIR}" "${DESTDIR}" ${vms_dir}/${DESTDIR}.conf
mb-setvar pretty="\"${destpretty}\"" ${vms_dir}/${DESTDIR}.conf
mkdir -p "${vms_dir}/${DESTDIR}"
cp ${vms_dir}/${SRCDIR}/* ${vms_dir}/${DESTDIR}/
mv "${vms_dir}/${DESTDIR}/${SRCDIR}.sh" "${vms_dir}/${DESTDIR}/${DESTDIR}.sh"
sd "${SRCDIR}" "${DESTDIR}" "${vms_dir}/${DESTDIR}/${DESTDIR}.sh"
mv "${vms_dir}/${DESTDIR}/${SRCDIR}.log" "${vms_dir}/${DESTDIR}/${DESTDIR}.log"
mv "${vms_dir}/${DESTDIR}/${SRCDIR}.ports" "${vms_dir}/${DESTDIR}/${DESTDIR}.ports"
notify-send.sh -u critical -t 60000 --replace-file /tmp/clone_notify "_VM_CLONED" " Virtual Machine ${SRCDIR} cloned as ${DESTDIR}" \
--action=_RUN_QUICK_MENU:mabox-quickemu
}

addsnapshot(){
tagname=$(yad --borders=40 --title="Create snapshot..." --center --ricon=gtk-clear --text-align=center \
--text="Creating snapshot.\n Enter tag for snapshot" --entry --entry-text="fresh")
[ -z "$tagname" ] && exit 0
## check if snapshot tagname already exist

}

custom() {
customname=$(yad --borders=40 --title="Create custom VM" --center --ricon=gtk-clear --text-align=center \
--text="Creating custom Virtual Machine.\nOnly linux supported!\nEnter name" --entry --entry-text="My custom vm")
[ -z "$customname" ] $$ exit 0
notify-send.sh "Name" "${customname}"
name=${customname// /-}
DESTDIR=${name,,}
if [ -d "${vms_dir}/${DESTDIR}" ];then
notify-send.sh "ERROR" "Directory ${vms_dir}/${DESTDIR} already exist!"
else
mkdir -p "${vms_dir}/${DESTDIR}"
cat <<EOF > "${vms_dir}/${DESTDIR}.conf"
guest_os="linux"
disk_img="${DESTDIR}/disk.qcow2"
iso="${DESTDIR}/my-custom-linux.iso"
pretty="${customname}"
EOF
notify-send.sh "Success!" "Virtual Machine: ${customname} created!\nCopy or download iso into <b>${vms_dir}/${DESTDIR}</b>"
fi
}

case "$1" in
    clone)clone "$2";;
    custom)custom;;
    addsnapshot)addsnapshot "$2";;
    quickget) terminator --working-dir ${vms_dir} -e "$1 $2 $3 $4;bash";;
    *) main "$@";;
esac
