#!/bin/bash
# Set up my desktop/laptop with all default setttings that I want.
#
# uses salt-call masterless configuration.
#
# to auto answer YES set the INITDESKTOP_YES=1 environment variable

DOTFILES_REPO="$HOME/.dotfiles"
DOTFILES_REMOTE="https://git.rre.nu:443/jonas/dotfiles.git"

DOTFILES_RENAME_EXISTING_FILES=(
    .bashrc
)

### NO Changes below this line

set -aeo pipefail

function printHelp(){
    cat << EOF
Usage ${0##*/} [options..]
-h,-?, --help       Show help and exit
-f, --firefox       configure firefox and install addons
-g, --gnome         configure gnome and install extentions
-G, --google-chrome configure and install google-chrome extentions
-d, --dotfiles      configure dotfiles
-s, --salt          run a masterless salt-call
-y, --yes           answer 'yes' on all questions
EOF
}


function asktobreak(){
    if [[ "$ANSWER_YES" == true ]];then
        printf "\n"
        return 1
    fi
    printf "Do you want to run this step (y/n)"
    while read -r -n 1 -s answer; do
        if [[ $answer == [YyNn] ]];then
            [[ $answer == [Yy] ]] && return_value=1
            [[ $answer == [Nn] ]] && return_value=0
            printf "\n"
            break;
        fi
    done
    return $return_value
}
function new_log(){
    # script output
    printf "\n****  [%s]  ***\n" "$*"
}

function log(){
    printf "%s\n" "$*"
}

function gnome_config(){
    new_log "Setting my default gnome bindings"
    log "WARNING! All running google-chrome instances will be killed"
    if asktobreak; then
        return
    fi
    set +e
    pkill -f firefox
    set -e
    printf "Current version %s\n" "$(gnome-shell --version)"
    log "Launching firefox to install GNOME Extetions"
    google-chrome https://extensions.gnome.org/extension/1031/topicons/ 2> /dev/null
    google-chrome https://extensions.gnome.org/extension/600/launch-new-instance/ 2> /dev/null
    google-chrome https://extensions.gnome.org/extension/921/multi-monitors-add-on/ 2> /dev/null

    log "loading dconf settings"
    dconf load  /  < "$HOME/.dconf.conf"
}

function setup_dotfiles(){
    local dotf="git --git-dir=$DOTFILES_REPO --work-tree=$HOME"
    new_log "Setting up dotf (dotfiles)"
    if asktobreak;then
        return
    fi
    log "creating git repo in $DOTFILES_REPO"
    mkdir "$HOME/.dotfiles"
    git init --bare "$DOTFILES_REPO"
    $dotf config --local status.showUntrackedFiles no

    log "adding remote repo ($DOTFILES_REMOTE)"
    $dotf remote add origin "$DOTFILES_REMOTE"


    for file in "${DOTFILES_RENAME_EXISTING_FILES[@]}"; do

       if [[ -f "$HOME/.bashrc" ]];then
           log "renaming local $file to ${file}.bak"
           mv "$HOME/$file" "$HOME/${file}.bak"
       fi
    done

    log "fetching dotfiles"
    $dotf fetch origin
    $dotf checkout master
}

function do_salt_call(){
    local salt="sudo salt-call --local --file-root $HOME/salt/states --pillar-root $HOME/salt/pillars"
    new_log "Running salt high state"
    if asktobreak;then
        return
    fi
    $salt state.apply pillar="{username: $USER}"
}

function firefox_config(){
    new_log "Installing firefox addons"
    if [[ ! -f "$HOME/bin/install_firefox_addon" ]];then
        printf "install firefox addon script not found, run dotfile sync first"
    fi
    log "WARNING! all running firefox instances will be killed"
    if asktobreak;then
        return
    fi
    set +e
    pkill -f firefox
    set -e
    $HOME/bin/install_firefox_addon
}

function chrome_config(){
    new_log "Installing chrome extentions"
    log "WARNING! all running instances of google-chrome will be killed"
    if asktobreak; then
        return
    fi
    set +e
    pkill -f google-chrome
    set -e
    google-chrome https://chrome.google.com/webstore/detail/gnome-shell-integration/gphhapmejobijbbhgpjhcjognlahblep 2> /dev/null
}

#initialize all options
ALL=true
FIREFOX=false
GNOME=false
SALT=false
DOTFILES=false
CHROME=false
ANSWER_YES=false
while :; do
    case $1 in
        -h|-\?|--help)
            printHelp
            exit
            ;;
        -f|--firefox)
            FIREFOX=true
            ALL=false
            ;;
        -g|--gnome)
            GNOME=true
            ALL=false
            ;;
        -G|--google-chrome)
            CHROME=true
            ALL=false
            ;;
        -s|--salt)
            SALT=true
            ALL=false
            ;;
        -d|--dotfiles)
            DOTFILES=true
            ALL=false
            ;;
        -y|--yes)
            ANSWER_YES=true
            ;;
        --)                 #End of all options
            shift
            break
            ;;
        -?*)
            printf "'$1' is not a valid option\n" >&2
            exit 1
            ;;
        *)                 #Break out of case, no more options
            break
    esac
    shift
done

[[ $ALL == true ]] || [[ $DOTFILES == true ]] && setup_dotfiles
[[ $ALL == true ]] || [[ $SALT == true ]] && do_salt_call
[[ $ALL == true ]] || [[ $FIREFOX == true ]] && firefox_config
[[ $ALL == true ]] || [[ $CHROME == true ]] && chrome_config
[[ $ALL == true ]] || [[ $GNOME == true ]] && gnome_config

printf "\n DONE!!!!!!!\n"