#!/bin/bash


# -------------------------------------------------
# Snapper Backups GUI
# -------------------------------------------------

APP_WITH_VER="SnapperGUI 0.1"

QARMA=(qarma -qwindowtitle "Snapper Backups")

SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"

if [[ -d "${SCRIPT_DIR}/lib" && -d "${SCRIPT_DIR}/modules" ]]; then
    DATADIR="${SCRIPT_DIR}"
else
    DATADIR="/usr/share/snappergui"
fi

LIBDIR="${DATADIR}/lib"
MODULEDIR="${DATADIR}/modules"

source "${LIBDIR}/snapper-source"
# -------------------------------------------------
# Be om sudo-passord éin gong
# -------------------------------------------------

sudo -v || exit 1


# -------------------------------------------------
# Vel Snapper-konfigurasjon
# -------------------------------------------------
show_help() {

    if [[ -f "${MODULEDIR}/help" ]]; then
        source "${MODULEDIR}/help"
        show_help_dialog
    else
        "${QARMA[@]}" --error \
            --title="Error" \
            --text="Help module not found:

${MODULEDIR}/help"
    fi
}

choose_config() {

    config=$(
        "${QARMA[@]}" --list \
            --title="Choose snapshot location" \
            --text="Select the Snapper configuration you want to use:" \
            --column="Location" \
            --print-column=1 \
            "Root" \
            "Home" \
            "Help" \
            "Quit" \
            --width=400 \
            --height=300
    )

    case "$config" in

        "Root")
            SNAPPER_CMD=(sudo snapper)
            CONFIG_NAME="Root"
            ;;

        "Home")
            SNAPPER_CMD=(sudo snapper -c home)
            CONFIG_NAME="Home"
            ;;

        "Help")
            show_help
            return 2
            ;;

        "Quit"|"")
            return 1
            ;;

    esac
}


# -------------------------------------------------
# Vis snapshots
# -------------------------------------------------

snapper_list() {

    snapshots=()

    while IFS= read -r -d '' felt; do
        snapshots+=("$felt")
    done < <(
        LC_ALL=C "${SNAPPER_CMD[@]}" \
            --csvout \
            --no-headers \
            --separator='|' \
            list \
            --columns number,date,user,cleanup,description |
        awk -F'|' '
            {
                for (i=1; i<=NF; i++) {
                    gsub(/^"|"$/, "", $i)
                    printf "%s%c", $i, 0
                }
            }
        '
    )

    if [ ${#snapshots[@]} -eq 0 ]; then
        "${QARMA[@]}" --info \
            --title="$CONFIG_NAME snapshots" \
            --text="No snapshots found."
        return
    fi

    "${QARMA[@]}" --list \
        --title="$CONFIG_NAME snapshots" \
        --text="Existing Snapper snapshots:" \
        --column="Nr." \
        --column="Date" \
        --column="User" \
        --column="Cleanup" \
        --column="Description" \
        --width=1200 \
        --height=650 \
        "${snapshots[@]}"
}


# -------------------------------------------------
# Opprett snapshot
# -------------------------------------------------

snapper_create() {

    description=$(
        "${QARMA[@]}" --entry \
            --title="Add snapshot" \
            --text="Enter a description for the $CONFIG_NAME snapshot:" \
            --width=500
    )

    [ -z "$description" ] && return

    "${QARMA[@]}" --question \
        --title="Add snapshot" \
        --text="Do you want to create this $CONFIG_NAME snapshot?

Description:
$description"

    [ $? -ne 0 ] && return

    if "${SNAPPER_CMD[@]}" create \
        --description "$description"
    then

        "${QARMA[@]}" --info \
            --title="Finished" \
            --text="$CONFIG_NAME snapshot created successfully."

    else

        "${QARMA[@]}" --error \
            --title="Error" \
            --text="Could not create the $CONFIG_NAME snapshot."

    fi
}


# -------------------------------------------------
# Fjern snapshot
# -------------------------------------------------

snapper_delete() {

    snapshots=()

    while IFS= read -r -d '' felt; do
        snapshots+=("$felt")
    done < <(
        LC_ALL=C "${SNAPPER_CMD[@]}" \
            --csvout \
            --no-headers \
            --separator='|' \
            list \
            --columns number,date,description |
        awk -F'|' '
            {
                for (i=1; i<=NF; i++)
                    gsub(/^"|"$/, "", $i)

                # Snapshot 0 kan ikkje slettast
                if ($1 != "0") {
                    printf "%s%c", $1, 0
                    printf "%s%c", $2, 0
                    printf "%s%c", $3, 0
                }
            }
        '
    )

    if [ ${#snapshots[@]} -eq 0 ]; then
        "${QARMA[@]}" --info \
            --title="Remove snapshot" \
            --text="No removable $CONFIG_NAME snapshots found."
        return
    fi

    snapshot=$(
        "${QARMA[@]}" --list \
            --title="Remove $CONFIG_NAME snapshot" \
            --text="Choose a snapshot to remove:" \
            --column="Nr." \
            --column="Date" \
            --column="Description" \
            --print-column=1 \
            --width=1000 \
            --height=550 \
            "${snapshots[@]}"
    )

    [ -z "$snapshot" ] && return

    "${QARMA[@]}" --question \
        --title="Remove snapshot" \
        --text="Do you really want to remove $CONFIG_NAME snapshot $snapshot?"

    [ $? -ne 0 ] && return

    if "${SNAPPER_CMD[@]}" delete "$snapshot"; then

        "${QARMA[@]}" --info \
            --title="Finished" \
            --text="$CONFIG_NAME snapshot $snapshot was removed."

    else

        "${QARMA[@]}" --error \
            --title="Error" \
            --text="Could not remove $CONFIG_NAME snapshot $snapshot."

    fi
}


# -------------------------------------------------
# Hovudmeny
# -------------------------------------------------

while true; do

    choose_config choose_config
result=$?

if [ "$result" -eq 1 ]; then
    exit 0
elif [ "$result" -eq 2 ]; then
    continue
fi|| exit 0

    valg=$(
    "${QARMA[@]}" --list \
        --title="Snapper Backups - $CONFIG_NAME" \
        --text="Choose an action for $CONFIG_NAME:" \
        --column="Action" \
        --print-column=1 \
        "View snapshots" \
        "Add snapshot" \
        "Remove snapshot" \
        "Change location" \
        "Help" \
        "Quit" \
        --width=450 \
        --height=400
)

    case "$valg" in

    "View snapshots")
        snapper_list
        ;;

    "Add snapshot")
        snapper_create
        ;;

    "Remove snapshot")
        snapper_delete
        ;;

    "Change location")
        continue
        ;;

    "Help")
        show_help
        ;;

    "Quit"|"")
        exit 0
        ;;

esac

done
