#!/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_REMOTE_SSH="ssh://git@curry.rre.nu:3022/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
-c, --codecs        install propriatory media codecs (openSUSE)
-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
    google-chrome https://extensions.gnome.org/extension/1319/gsconnect/ 2> /dev/null
    google-chrome https://extensions.gnome.org/extension/906/sound-output-device-chooser/ 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

    printf "Do you want to switch to SSH remote on dotfiles [N/y]? "
    read -r -n 1 -s answer
    if [[ $answer == [Yy] ]];then
        $dotf remote set-url origin "$DOTFILES_REMOTE_SSH"
    fi

}

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
}
function suse_install_codecs(){
    new_log "Install Proprietary media codecs?"
    log "WARNING! This is for openSUSE only"
    if asktobreak; then
        return
    fi
    sudo "$HOME/bin/install_codecs"
}

function check_prerequisites(){
    set +e
    local answer
    type git > /dev/null 2>&1
    RESULT=$?
    if [[ $RESULT != 0 ]];then
        printf "git is not installed, do your want to install it [y/N]?"
        read -r -n 1 -s answer;
        printf "\n"
        if [[ $answer == [yY] ]];then
            sudo zypper --non-interactive install git
        fi
    fi

    type salt-call > /dev/null 2>&1
    RESULT=$?
    if [[ $RESULT != 0 ]];then
        printf "salt-minion is not installed, do your want to install it [y/N]?"
        read -r -n 1 -s answer;
        printf "\n"
        if [[ $answer == [yY] ]];then
            sudo zypper --non-interactive install salt-minion
        fi
    fi
    set -e
}

#initialize all options
ALL=true
CODECS=false
FIREFOX=false
GNOME=false
SALT=false
DOTFILES=false
CHROME=false
ANSWER_YES=false
while :; do
    case $1 in
        -c|--codecs)
            CODECS=true
            ALL=false
            ;;
        -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

check_prerequisites

[[ $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
[[ $ALL == true ]] || [[ $CODECS == true ]] && suse_install_codecs

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