#!/bin/bash

# a menu of customized quick shortcuts

if ! [ -e ~/instantos/quickmenu ]; then
    mkdir ~/instantos/quickmenu
fi

cd ~/instantos/quickmenu

pickscript() {
    unset CHOICE
    while [ -z "$CHOICE" ]; do
        if [ -z "$(ls)" ]; then
            CHOICE="$(echo 'edit menu
close' | instantmenu -bw 4 -C -l 7 -w 300)"

        else
            CHOICE="$(ls -p | sed -e '$aedit menu\nclose' | instantmenu -bw 4 -C -l 7 -w 300)"
        fi
        if [ -e "$CHOICE" ]; then
            if [ -d "$CHOICE" ]; then
                cd "$CHOICE"
                unset CHOICE
            else
                echo "$(realpath $CHOICE)"
            fi
        else
            if grep -Eiq '^(close|edit)' <<<"$CHOICE"; then
                echo "$CHOICE"
                pwd >/tmp/quickpath
            else
                return 1
            fi
        fi
    done
}

addmenu() {
    cd "$(cat /tmp/quickpath)"
    ADDCHOICE="$(echo 'add entry
edit entry
remove entry
rename entry
new category' | instantmenu -bw 4 -C -l 7 -w 300)"
    if [ -z "$ADDCHOICE" ]; then
        echo "no addchoice"
        exit
    fi
    case "$ADDCHOICE" in
    remove*)
        echo "removing entry"
        REMOVECHOICE="$(ls -p | instantmenu -bw 4 -C -l 7 -w 300)"
        if [ -d "$REMOVECHOICE" ] && [ -n "$(ls $REMOVECHOICE/)" ]; then
            imenu -m "category is not empty"
            exit
        elif ! [ -e "$REMOVECHOICE" ]; then
            imenu -m "selection $REMOVECHOICE invalid"
        fi

        if imenu -c "remove $REMOVECHOICE"; then
            if [ -d $REMOVECHOICE ]; then
                rm -rf "$REMOVECHOICE"
            else
                rm "$REMOVECHOICE"
            fi
        fi

        ;;
    new*)
        CATEGORYNAME="$(imenu -i 'enter category name')"
        [ -n "$CATEGORYNAME" ] && mkdir "$CATEGORYNAME"
        ;;
    add*)
        echo "adding new entry"
        SCRIPTNAME="$(imenu -i 'enter name')"
        touch "$SCRIPTNAME" || {
            imenu -m "invalid script name"
            exit
        }
        ADDCHOICE="$(echo 'enter command
edit script' | imenu -l)"
        case "$ADDCHOICE" in

        enter*)
            COMMAND="$(imenu -i 'enter command')"
            echo "$COMMAND" >"$SCRIPTNAME"
            ;;
        edit*)
            echo "editing script"
            echo "#!/bin/bash" >"$SCRIPTNAME"
            echo "# instantosterm" >>"$SCRIPTNAME"
            echo "# instantosarg" >>"$SCRIPTNAME"
            echo "# remove the spaces in front of the above options to enable them" >>"$SCRIPTNAME"
            urxvt -e nvim -c ":e $(realpath $SCRIPTNAME)"
            ;;
        esac
        ;;
    edit*)
        echo "editing existing entry"
        EDITCHOICE="$(ls -p | instantmenu -bw 4 -C -l 7 -w 300)"
        [ -z "$EDITCHOICE" ] && exit
        if [ -d "$EDITCHOICE" ]; then
            imenu -m "selection is not a script"
            exit
        elif ! [ -e "$EDITCHOICE" ]; then
            imenu -m "selection $EDITCHOICE invalid"
            exit
        fi
        urxvt -e nvim -c ":e $(realpath $EDITCHOICE)"
        ;;
    rename*)
        echo "renaming entry"
        EDITCHOICE="$(ls -p | instantmenu -bw 4 -C -l 7 -w 300)"
        [ -z "$EDITCHOICE" ] && exit

        if ! [ -e "$EDITCHOICE" ]; then
            imenu -m "$EDITCHOICE does not exist"
        fi

        NEWNAME="$(imenu -i 'enter new name')"
        [ -z "$NEWNAME" ] && exit
        mv "$EDITCHOICE" "$NEWNAME"

        ;;
    esac
}

QUICKCHOICE="$(pickscript)"
echo "$QUICKCHOICE"

if [ -z "$QUICKCHOICE" ]; then
    exit
fi

case "$QUICKCHOICE" in
close)
    exit
    ;;
"edit menu")
    echo "editing menu"
    addmenu
    ;;
*)
    if ! [ -e "$QUICKCHOICE" ]; then
        echo ""
        echo "choice $QUICKCHOICE not found"
        exit
    fi

    if grep -q "^#instantosarg" "$QUICKCHOICE"; then
        QUICKARGS="$(imenu -i options)"
        [ -z "$QUICKARGS" ] && exit
    fi

    if grep -q "^#instantosterm" "$QUICKCHOICE"; then
        chmod +x "$QUICKCHOICE"
        st -e bash -c "$QUICKCHOICE $QUICKARGS"
    else
        bash $QUICKCHOICE $QUICKARGS
    fi

    ;;
esac
