#!/bin/bash

################################################################################
### SHELL SETUP ################################################################
################################################################################

function SOURCE_DOTWRYN_RC {
	local HOME_RC="$1";
	local WRYN_RC="$2";

	[ ! -f "$HOME/$HOME_RC" ] && touch "$HOME/$HOME_RC";

	grep -q '\.wryn' "$HOME/$HOME_RC" \
		&& echo "already set up $HOME_RC" \
		|| {
			echo "source $WRYN_RC" >> "$HOME/$HOME_RC";
			echo "successfully set up $HOME_RC";
		}
}

function SHELL__SETUP {
	SOURCE_DOTWRYN_RC '.bashrc' '$HOME/.wryn/bash/rc'
	which bash >/dev/null && "$HOME/.wryn/env/env.bash";

	SOURCE_DOTWRYN_RC '.zshrc' '$HOME/.wryn/zsh/rc';
	which zsh >/dev/null && "$HOME/.wryn/env/env.zsh";
}


################################################################################
### VIM SETUP ##################################################################
################################################################################

function VIM__SETUP_ENVIRONMENT_VARIABLES() {
	VIM_ENV="$HOME/.config/wryn/env.vim";

	[ ! -f "$VIM_ENV" ] && {
		touch "$VIM_ENV";
		which google-chrome-stable \
			&& echo 'let $WEBBROWSER="'$(which google-chrome-stable)'"' >> $VIM_ENV\
			|| echo 'let $WEBBROWSER=""' >> $VIM_ENV;
	} || {
		echo 'vim environment variables already set up';
	}
}

function VIM__UPDATE_COLORSCHEMES() {
	$HOME/.wryn/bin/vim/update_colorschemes
}

function VIM__INSTALL_VUNDLE_PLUGINS() {
	[ ! -d "$HOME/.vim" ] && mkdir "$HOME/.vim"
	[ ! -d "$HOME/.vim/bundle" ] && mkdir "$HOME/.vim/bundle"
	[ ! -d "$HOME/.vim/bundle/Vundle.vim" ] && {
		echo "installing vundle";
		git clone https://github.com/VundleVim/Vundle.vim.git "$HOME/.vim/bundle/Vundle.vim";
	}

	echo "installing vundle plugins"
	vim +PluginInstall +qall;

	echo "building plugins"
	$HOME/.wryn/bin/vim/rebuild_plugins;
}

function VIM__SETUP() {
	echo 'setting up vim';

	SOURCE_DOTWRYN_RC '.vimrc' '$HOME/.wryn/vim/rc.vim';

	VIM__SETUP_ENVIRONMENT_VARIABLES;
	VIM__UPDATE_COLORSCHEMES;
	VIM__INSTALL_VUNDLE_PLUGINS;

	echo 'vim setup complete';
}


################################################################################
### LINK CONFIGURATION FILES ###################################################
################################################################################

function CONFIG__BASIC_SYMLINK() {
	local HOME_CONFIG="$1";
	local WRYN_CONFIG="$2";

	mv "$HOME_CONFIG" "$HOME_CONFIG.bak" >/dev/null 2>&1;
	ln -s "$WRYN_CONFIG" "$HOME_CONFIG";
}

function CONFIG__SYMLINK() {
	local CONFIG_DIR="$1";
	local FILENAME="$2";

	local HOME_CONFIG_DIR="$HOME/.config/$CONFIG_DIR";
	local HOME_CONFIG="$HOME_CONFIG_DIR/$FILENAME";

	local WRYN_CONFIG="$HOME/.wryn/config/$CONFIG_DIR/$FILENAME";

	[ ! -d "$HOME_CONFIG_DIR" ] && mkdir "$HOME_CONFIG_DIR";

	CONFIG__BASIC_SYMLINK $HOME_CONFIG $WRYN_CONFIG;
}


function CONFIG__I3() {
	CONFIG__SYMLINK "i3" "config";
	CONFIG__BASIC_SYMLINK "$HOME/.config/wryn/i3utils" "$HOME/.wryn/config/i3/utils";
	echo "linked i3 configuration";
}

function CONFIG__PGCLI() {
	CONFIG__SYMLINK "pgcli" "config";
	echo "linked pgcli configuration";
}

function CONFIG__MSSQLCLI() {
	CONFIG__SYMLINK "mssqlcli" "config";
	echo "linked mssqlcli configuration";
}

function CONFIG__COMPTON() {
	CONFIG__SYMLINK "compton" "compton.conf";
	echo "linked compton configuration"
}

function CONFIG__KITTY() {
	CONFIG__SYMLINK "kitty" "kitty.conf";
	CONFIG__SYMLINK "kitty" "theme.conf";

	echo "linked kitty configuration"
}

function CONFIG__GIT() {
	CONFIG__BASIC_SYMLINK "$HOME/.gitconfig" "$HOME/.wryn/config/git/gitconfig";
	echo "linked global git configuration"
}

function CONFIG__PYLINT() {
	CONFIG__BASIC_SYMLINK "$HOME/.config/pylintrc" "$HOME/.wryn/config/pylint/pylintrc";
	echo "linked pylint configuration"
}

function CONFIG__TMUX() {
	CONFIG__BASIC_SYMLINK "$HOME/.tmux.conf" "$HOME/.wryn/tmux/tmux.conf";
	echo "linked tmux configuration"
}

function CONFIG__XINITRC() {
	CONFIG__BASIC_SYMLINK "$HOME/.xinitrc" "$HOME/.wryn/config/xserver/xinitrc"
	echo "linked xinitrc"
}

function CONFIG__TERMINFO() {
	echo "adding terminfo files"
	for file in $(find "$HOME/.wryn/config/terminfo" -type f); do
		tic -x $file >/dev/null 2>&1 || echo "failed to add $file" ;
	done
}


function CONFIG__SETUP() {
	CONFIG__I3;
	CONFIG__PGCLI;
	CONFIG__MSSQLCLI;
	CONFIG__COMPTON;
	CONFIG__KITTY;

	CONFIG__GIT;
	CONFIG__PYLINT;
	CONFIG__TMUX;
	CONFIG__XINITRC;

	CONFIG__TERMINFO;
}


################################################################################
### RUN CONFIG #################################################################
################################################################################

function CLEAN_BACKUP() {
	read -p "Clean backup files? [yN] : " yn;

	case $yn in
		[Yy]* ) 
			echo 'cleaning backup files';
			for file in $(find "$HOME/.config/" -name \*.bak 2>/dev/null); do rm $file && echo cleaned $file; done
			for file in $(find "$HOME" -name .\*.bak 2>/dev/null); do rm $file && echo cleaned $file; done
			;;
		* ) echo 'skipping cleanup';;
	esac
}


[ ! -d "$HOME/.config" ] && mkdir "$HOME/.config";
[ ! -d "$HOME/.config/wryn" ] && mkdir "$HOME/.config/wryn";

SHELL__SETUP;
VIM__SETUP;
CONFIG__SETUP;

CLEAN_BACKUP;

echo -e "\nsetup complete"