#!/usr/bin/env bash

DEFPATH="$HOME/Pictures/defaultWall"
WALLFILE="$HOME/Pictures/wallconfig"
BINNAME="setwall"

function unsetwalls() {
    echo unsetting $@
    for wall in $@; do
        sed -i.bak "/$wall/d" $WALLFILE
    done
}
function delete() {
    echo deleting wallfile
    rm $WALLFILE
}
function unsetall() {
    echo clearing wallfile
    echo -n > $WALLFILE
}

function setwalls() {
    for wall in $@; do
        if grep -q $wall "$WALLFILE"; then
            echo $wall already set
        else
            echo setting $wall
            echo $wall >> $WALLFILE
        fi
    done
}

function applywall() {
    echo applying wallpaper $1
    feh --bg-fill $1
}

function help() {
    echo "Wallpaper mangement script"
    echo
    echo "Syntax: ${BINNAME} OPTIONS"
    echo "options:"
    echo "  -A, --apply                     applies a random wallpaper"
    echo "  -S, --set FILES                 sets new wallpapers"
    echo "  -U, --unset [OPTIONS] [FILES]   unsets new wallpapers"
    echo "  -P, --preview FILE              temporarily sets a wallpaper"
    echo "  -h, --help                      this message"
    echo
    echo "unset options:"
    echo "  -a, --all                       clears wallconfig file"
    echo "  -d, --delete                    deleted wallconfig file"
}

function unknown() {
    echo "${BINNAME}: unknown option $1" 1>&2
    exit 1
}

if [[ $# -eq 0 ]]; then
    echo "${BINNAME}: no arguments given" 1>&2
    help
    exit 1
fi

mode="N"
pos=""

while [[ $# -gt 0 ]]; do
    keys="$1"
    # If $1 does is single - argument
    if [[ $1 == '-'* ]] && [[ ! $1 == '--'* ]] ; then
        # Remove first -
        keys=${keys#?}
        # Place space between each character
        keys=$(echo $keys | sed 's/./-& /g')
    fi

    for key in $keys; do
        case $mode in 
            U)
                case $key in
                    -a|--all)
                    unsetall
                    exit 0
                    ;;
                -d|--delete)
                    delete
                    exit 0
                    ;;
                '-'*|'--'*)
                    unknown $key
                    ;;
                *)
                    pos="$pos $key"
                    shift
                    ;;
                esac
                ;;
            S)
                pos="$pos $key"
                shift
                ;;
            *)
            case $key in
                -A|--apply)
                    applywall $(shuf -n 1 $WALLFILE)
                    exit 0
                    ;;
                -U|--unset)
                    mode="U"
                    shift
                    ;;
                -S|--set)
                    mode="S"
                    shift
                    ;;
                -P|--preview)
                    applywall $2
                    exit 0
                    ;;
                -h|--help)
                    help
                    shift
                    exit 0
                    ;;
                *)
                    unknown $key
                    ;;
            esac
            ;;
        esac
    done
done

case $mode in
    U)
        unsetwalls $pos
        ;;
    S)
        setwalls $pos
        ;;
esac