#!/usr/bin/env bash

wineqgui-backup()
{
    local configdir
    local prefixdir
    local backupdir
    local selection
    local file
    local name
    local prefix
    local safe_name
    local timestamp
    local app_backup_dir
    local archive
    local metadata
    local entries=()

    configdir="${HOME}/.local/share/wineqgui/applications"
    prefixdir="${HOME}/.local/share/wineqgui/prefixes"
    backupdir="${HOME}/.local/share/wineqgui/backups"

    mkdir -p "$configdir"
    mkdir -p "$prefixdir"
    mkdir -p "$backupdir"


    # -------------------------------------------------
    # Finn registrerte program
    # -------------------------------------------------

    while IFS= read -r -d '' file; do

        name=$(read_config_value "$file" "NAME")

        [[ -z "$name" ]] && continue

        entries+=("$name" "$file")

    done < <(
        find "$configdir" \
            -maxdepth 1 \
            -type f \
            -name '*.conf' \
            -print0
    )


    # -------------------------------------------------
    # Ingen program
    # -------------------------------------------------

    if (( ${#entries[@]} == 0 )); then
        show_info "There are no WineQGUI applications to back up."
        return
    fi


    # -------------------------------------------------
    # Vel program
    # -------------------------------------------------

    selection=$(
        qarma --list \
            --title="Backup Wine application" \
            --width=600 \
            --height=400 \
            --hide-header \
            --column="Application" \
            --column="Config" \
            "${entries[@]}"
    )

    [[ -z "$selection" ]] && return


    name=$(read_config_value "$selection" "NAME")
    prefix=$(read_config_value "$selection" "PREFIX")


    # -------------------------------------------------
    # Berre WineQGUI-eigde miljø
    # -------------------------------------------------

    case "$prefix" in
        "${prefixdir}"/*)
            ;;
        *)
           show_error "
This application uses the shared/default Wine environment.

WineQGUI only backs up environments created specifically for an application.

To enable backups, create a dedicated Wine environment for this application.

This application uses:

<b>${prefix}</b>
"
            return 1
            ;;
    esac


    if [[ ! -d "$prefix" ]]; then
        show_error \
            "Wine environment does not exist:\n\n<b>${prefix}</b>"
        return 1
    fi


    # -------------------------------------------------
    # Lag namn
    # -------------------------------------------------

    safe_name=$(
        printf '%s' "$name" |
        tr '[:upper:]' '[:lower:]' |
        tr ' ' '-' |
        tr -cd 'a-z0-9._-'
    )

    [[ -z "$safe_name" ]] && safe_name="application"

    timestamp=$(date '+%Y-%m-%d_%H-%M-%S')

    app_backup_dir="${backupdir}/${safe_name}"
    mkdir -p "$app_backup_dir"

    archive="${app_backup_dir}/${safe_name}-${timestamp}.tar.gz"
    metadata="${app_backup_dir}/${safe_name}-${timestamp}.meta"


    # -------------------------------------------------
    # Stadfest
    # -------------------------------------------------

    if ! qarma --question \
        --title="Backup ${name}" \
        --text="Create a backup of:\n\n<b>${name}</b>\n\nWine environment:\n${prefix}?"
    then
        return
    fi


    # -------------------------------------------------
    # Lag backup
    # -------------------------------------------------

    (
        echo "10"
        echo "# Preparing backup..."

        sleep 0.3

        echo "30"
        echo "# Compressing Wine environment..."

        if tar -czf "$archive" \
            -C "$(dirname "$prefix")" \
            "$(basename "$prefix")"
        then
            echo "90"
            echo "# Writing backup information..."

            {
                printf 'NAME=%s\n' "$name"
                printf 'PREFIX=%s\n' "$prefix"
                printf 'CONFIG=%s\n' "$selection"
                printf 'ARCHIVE=%s\n' "$archive"
                printf 'DATE=%s\n' "$timestamp"
            } > "$metadata"

            echo "100"
            echo "# Backup completed."
        else
            rm -f -- "$archive"
            exit 1
        fi

    ) |
    qarma --progress \
        --title="Backing up ${name}" \
        --text="Creating backup..." \
        --percentage=0 \
        --auto-close

    status=${PIPESTATUS[0]}

    if [[ "$status" -ne 0 ]]; then
        rm -f -- "$archive" "$metadata"

        show_error \
            "Backup failed for:\n\n<b>${name}</b>"
        return 1
    fi


    show_info \
        "Backup completed for:\n\n<b>${name}</b>\n\nSaved as:\n${archive}"
}
