#!/bin/sh -e

SERVER=      # set by set_server()
SERVER_NAME= # set by set_server()
ACTION=      # set by set_action()
SNAPSHOT=    # set by set_snapshot()
IMAGE=       # set by set_image()

show_state() {
    printf "SERVER:      %s\n" "$SERVER"
    printf "SERVER_NAME: %s\n" "$SERVER_NAME"
    printf "ACTION:      %s\n" "$ACTION"
    printf "SNAPSHOT:    %s\n" "$SNAPSHOT"
    printf "IMAGE:       %s\n" "$IMAGE"
    printf "\nContinue? "
    read -r _c
    case $_c in
        [Yy]) return; ;;
        *) exit 2; ;;
    esac
}

########################
### SERVER SELECTION ###
########################

set_server() {
    SERVER_LIST="$(hcloud server list \
                -o noheader \
                -o columns=id,name,status,ipv4,ipv6)"
    SERVER="$(printf '%s\n%s' \
                "$SERVER_LIST" \
                "0 create new server" \
                    | fzf --tac --exact --with-nth=2.. \
                    | cut -d" " -f1 \
            )"
}

########################
### ACTION SELECTION ###
########################

# Format: key Description...
ACTION_LIST="\
create_snap Create snapshot
delete_snap Delete snapshot
restore_snap Restore snapshot
on Turn on
off Turn off
delete_server Delete VM(!!!!)
"

set_action() {
    ACTION="$(printf '%s\n' "$ACTION_LIST" \
                | fzf --tac --exact --with-nth=2.. \
                    --header="Action for Server ID ${SERVER}" \
                | cut -d" " -f1 \
            )"
}

##########################
### SNAPSHOT SELECTION ###
##########################
# needs: SERVER

set_snap() {
    SNAPSHOT="$(hcloud image list \
                    -o columns=id,description \
                    -o noheader \
                    -t snapshot \
                        | fzf --tac --exact --with-nth=2.. \
                        | cut -d" " -f1 \
              )"
}

#######################
### IMAGE SELECTION ###
#######################

set_image() {
    IMAGE="$(hcloud image list \
                    -o columns=id,description \
                    -o noheader \
                    -t system \
                        | fzf --tac --exact --with-nth=2.. \
                        | cut -d" " -f1 \
              )"
}

#########################
### CREATE NEW SERVER ###
#########################
# needs: SERVER=0, IMAGE
create_server() {
    echo NOT IMPLEMENTED
}

#####################
### DELETE SERVER ###
#####################
# needs: SERVER=0
delete_server() {
    echo NOT IMPLEMENTED
}

#########################
### RESTORE FROM SNAP ###
#########################
# needs: SERVER, SNAPSHOT
restore_snap() {
    echo NOT IMPLEMENTED
}

#######################
### CREATE SNAPSHOT ###
#######################
# needs: SERVER
create_snap() {
    echo NOT IMPLEMENTED
}

#######################
### DELETE SNAPSHOT ###
#######################
# needs: SERVER, SNAPSHOT

delete_snap() {
    echo NOT IMPLEMENTED
}



################################
### MAIN PROGRAM STARTS HERE ###
################################

# We need a server
set_server

# In case we want a new server, the action is implicit. For all other
# cases, we ask for user input.
if [ $SERVER -eq 0 ]; then
    ACTION=create_server
else
    set_action
fi

# Now we evaluate the action and execute the next steps
case $ACTION in
    delete_snap) set_snap; delete_snap; ;;
    restore_snap) set_snap; restore_snap; ;;
    create_snap) create_snap; ;;
    create_server) create_server; ;;
    delete_server) delete_server; ;;
    console)  hcloud server request-console ${SERVER}; ;;
    turn*on)  hcloud server poweron ${SERVER}; exit 0; ;;
    turn*off) hcloud server poweroff ${SERVER}; exit 0; ;;
esac