#!/usr/bin/env bash
set -x
#set -Eeu -o -pipefail
## Completions for Debian 9.0 - may be included in zgen
# files included from .zshrc
# ~/.zsh-completions
# directories included from .zshrc
# ~/.zshrc.pre-plugins.d
# ~/.zsh-completions.d
# ~/.zshrc.d
# ~/.macos_aliases.d
# ~/.osx_aliases.d
#
#sudo bash -c "cat > /etc/apt/sources.list.d/shells:zsh-users:zsh-completions.list" << 'EOF'
#deb http://download.opensuse.org/repositories/shells:/zsh-users:/zsh-completions/Debian_9.0/ /
#EOF
#
# KEY_DIR=/etc/apt/keyrings
#wget -qO - https://download.opensuse.org/repositories/shells:zsh-users:zsh-completions/Debian_9.0/Release.key | sudo tee ${KEY_DIR}/zsh-completions.gpg
#
#sudo apt update
#sudo apt install zsh-completions

sudo apt install -y zsh nodejs zsh-theme-powerlevel9k git fonts-powerline powerline fzf golang-chroma python3-argcomplete

# compaudit
# There are insecure directories: /usr/local/share/zsh/site-functions
# compaudit | xargs chmod g-w
# compaudit 2>&1 | sed -n '1d; p'
 
mkdir -p /usr/local/share/zsh/site-functions
chmod g-w /usr/local/share/zsh/site-functions

#DEST=$HOME
DEST=${1:-/etc/skel}
HOME="${DEST}"
# KEY_DIR=/etc/apt/keyrings
ALIAS_DIR=".zshrc.d"

cd "${DEST}" || exit
cp /var/tmp/automate/.p10k.zsh "${DEST}"
chsh -s "$(which zsh)" "${USER}"


# Install zgenom plugin manager and zsh quickstart to get a default setup for zsh
# .zgen-setup pulls zgenom automatically and puts it in .zqs-zgenom, plugins in .zgenom
git clone https://github.com/unixorn/zsh-quickstart-kit "${DEST}"/zsh-quickstart-kit

ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zshrc "${DEST}"/.zshrc
ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zsh_functions "${DEST}"/.zsh_functions
#ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zsh_aliases "${DEST}"/.zsh_aliases
ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zgen-setup "${DEST}"/.zgen-setup
#ln -rsf ~/zsh-quickstart-kit/zsh/.zsh_completions ~/.zsh_completions
mkdir -p "${DEST}"/"${ALIAS_DIR}"


touch "${DEST}"/.zshrc
echo "setopt PROMPT_SUBST" >> "${DEST}"/.zshrc


echo "NVIM_PYTHON_LOG_FILE=/var/tmp/nvim_python.log" >> "${DEST}"/"${ALIAS_DIR}"/008_nvim.zsh
echo "NVIM_PYTHON_LOG_LEVEL=DEBUG" >> "${DEST}"/"${ALIAS_DIR}"/008_nvim.zsh
sudo touch /var/tmp/nvim_python.log

# fix path error in .zshrc
#sed -i 's|pushd $(dirname "${HOME}/$(readlink "${DEST}"/.zshrc)")|pushd $(dirname "$(readlink "${DEST}"/.zshrc)")|' "${DEST}"/zsh-quickstart-kit/zsh/.zshrc

# debians locate db locate
# sed -i 's,^\(export LOCATE_PATH=\).*,\1'/var/lib/mlocate/mlocate.db',' "${DEST}"/.zshrc
echo "export LOCATE_PATH=/var/lib/mlocate/mlocate.db" > "${DEST}"/"${ALIAS_DIR}"/005_locatedb.zsh

# add plugins to the load-starter-plugin-list() function in ~/.zgen-setup ~/zsh-quickstart-kit/zsh/.zgen-setup
# FIXED: create a file named .zgen-local-plugins and add your zgenom load commands there. 
# Don't forget to run `zgenom save` at the end of your .zgen-local-plugins file.
# Warning: .zgen-local-plugins REPLACES the starter list setup, it doesn't add to it.

# Comment out default docker plugin and replace with omz docker and compose plugins
sed -i -e "s|zgenom load srijanshetty/docker-zsh|# zgenom load srijanshetty/docker-zsh|" "${DEST}"/zsh-quickstart-kit/zsh/.zgen-setup
#sed -i '/\# zgenom load srijanshetty\/docker-zsh/a\ \ zgenom load ohmyzsh plugins\/docker\n\ \ zgenom load ohmyzsh plugins\/docker-compose' "${DEST}"/zsh-quickstart-kit/zsh/.zgen-setup


# zsh quickstart created this file if missing expecting fzf to be installed in ${HOME}
# we have it installed via apt so the executables are in the path and the key-bindings 
# and completitions are in examples fom the package.
cat <<-EOF | sudo tee "${DEST}/.fzf.zsh"
	# Setup fzf
	# ---------
	#if [[ ! "\$PATH" == *\${HOME}/.vim/bundle/fzf/bin/* ]]; then
	#  export PATH="\$PATH:\${HOME}/.vim/bundle/fzf/bin"
	#fi

	# auto-completion
	# ---------------
	[[ \$- == *i* ]] && source "/usr/share/doc/fzf/examples/completion.zsh" 2> /dev/null

	# Key bindings
	# ------------
	source "/usr/share/doc/fzf/examples/key-bindings.zsh"
EOF

# The contents of the starter plugin function with changes above, pulling from upstream git with now not squash local changes.
cat <<-EOF | tee "${DEST}"/.zgen-local-plugins
	echo "creating a zgen save"
	ZGEN_LOADED=()
	ZGEN_COMPLETIONS=()

	# Load ohmyzsh base
	zgenom ohmyzsh

	# zman fzf to quickly find and browse Zsh manuals in a webbrowser
	zgenom load mattmc3/zman

	# .zgen-local-plugins is sourced during startup *instead* of running .zgen-setup load-starter-plugin-list function,
	# so make sure to include everything from this function that you want to keep.

	# If zsh-syntax-highlighting is bundled after zsh-history-substring-search,
	# they break, so get the order right.
	zgenom load zsh-users/zsh-syntax-highlighting
	zgenom load zsh-users/zsh-history-substring-search
	zgenom load fdellwing/zsh-bat

	# Set keystrokes for substring searching
	zmodload zsh/terminfo
	bindkey "\$terminfo[kcuu1]" history-substring-search-up
	bindkey "\$terminfo[kcud1]" history-substring-search-down

	# Tab complete rakefile targets
	#zgenom load unixorn/rake-completion.zshplugin

	# Automatically run zgen update and zgen selfupdate every 7 days
	#zgenom load unixorn/autoupdate-zgen

	zgenom load unixorn/jpb.zshplugin

	# Colorize the things if you have grc installed. Well, some of the
	# things, anyway.
	zgenom load unixorn/warhol.plugin.zsh

	# OS X helpers
	zgenom load unixorn/tumult.plugin.zsh

	# Warn you when you run a command that you've got an alias for
	# zgenom load djui/alias-tips

	# Add my collection of git helper scripts
	zgenom load unixorn/git-extra-commands

	# Add my bitbucket git helpers plugin
	zgenom load unixorn/bitbucket-git-helpers.plugin.zsh

	# A collection of scripts that might be useful to sysadmins
	zgenom load skx/sysadmin-util

	# Adds aliases to open your current repo & branch on github.
	zgenom load peterhurford/git-it-on.zsh

	# Tom Limoncelli's tooling for storing private information (keys, etc)
	# in a repository securely by encrypting them with gnupg
	zgenom load StackExchange/blackbox

	# Load some ohmyzsh plugins
	zgenom ohmyzsh plugins/aws
	#zgenom ohmyzsh plugins/chruby
	zgenom ohmyzsh plugins/colored-man-pages
	zgenom ohmyzsh plugins/colorize
	zgenom ohmyzsh plugins/git
	zgenom ohmyzsh plugins/github
	zgenom ohmyzsh plugins/golang
	zgenom ohmyzsh plugins/pip
	zgenom ohmyzsh plugins/python
	zgenom ohmyzsh plugins/rsync
	zgenom ohmyzsh plugins/tmux
	zgenom ohmyzsh plugins/screen
	zgenom ohmyzsh plugins/ssh-agent
	zgenom ohmyzsh plugins/sudo
	zgenom ohmyzsh plugins/vagrant

	if [ \$(uname -a | grep -ci Darwin) = 1 ]; then
	# Load OSX-specific plugins
	zgenom ohmyzsh plugins/brew
	zgenom ohmyzsh plugins/osx
	fi

    # pipx completitons
    zgenom load thuandt/zsh-pipx 

	# A set of shell functions to make it easy to install small apps and
	# utilities distributed with pip.
	zgenom load sharat87/pip-app

	zgenom load chrissicool/zsh-256color

	# ZVM - A better and friendly vi(vim) mode plugin for ZSH.'
	zgenom load jeffreytse/zsh-vi-mode

	# Load more completion files for zsh from the zsh-lovers github repo
	#zgenom load zsh-users/zsh-completions src

	# aggregates zsh completions from: zsh-users/zsh-completions, zchee/zsh-completions, 
	# nilsonholger/osx-zsh-completions and various other custom or third-party sources.
	zgenom load clarketm/zsh-completions

	# Docker completion
	# zgenom load srijanshetty/docker-zsh
	#zgenom load akarzim/zsh-docker-aliases
	#zgenom load robbyrussell/oh-my-zsh plugins/docker
	#zgenom load robbyrussell/oh-my-zsh plugins/docker-compose

	# Very cool plugin that generates zsh completion functions for commands
	# if they have getopt-style help text. It doesn't generate them on the fly,
	# you'll have to explicitly generate a completion, but it's still quite cool.
	zgenom load RobSis/zsh-completion-generator

	# Add Fish-like autosuggestions to your ZSH
	zgenom load zsh-users/zsh-autosuggestions

	# Add support for python venv
	zgenom load MichaelAquilina/zsh-autoswitch-virtualenv
	zgenom load bckim92/zsh-autoswitch-conda

	# Add functional testing for zsh
	zgenom load olets/zsh-test-runner
	zgenom load zunit-zsh/zunit

	# IDE-like type-ahead completion for Zsh, asynchronous/non-blocking
	#zgenom load marlonrichert/zsh-autocomplete

	# k is a zsh script / plugin to make directory listings more readable,
	# adding a bit of color and some git status information on files and directories
	zgenom load rimraf/k

	# Bullet train prompt setup
	#zgenom load caiogondim/bullet-train-ohmyzsh-theme bullet-train
	zgenom load robbyrussell/oh-my-zsh themes/agnoster

	## Load Prezto
	# zgen prezto

	## Load prezto plugins
	# zgen prezto <modulename> <option> <value(s)>
	# zgen prezto <modulename>

	## prezto options
	# zgen prezto editor key-bindings 'emacs'
	# zgen prezto prompt theme 'sorin'

	## prezto and modules
	#zgen prezto
	# zgen prezto git
	# zgen prezto command-not-found
	# zgen prezto syntax-highlighting

	## plugins
	# zgenom load/path/to/super-secret-private-plugin
	
	# Load me last
	GENCOMPL_FPATH=\$HOME/.zsh/complete
	GENCOMPL_PY=python3


	# Save it all to init script
	zgenom save
EOF

# prevent update
cat <<-EOF | tee "${DEST}"/"${ALIAS_DIR}"/001_quickstart-refresh.zsh
	# Use unset 'QUICKSTART_KIT_REFRESH_IN_DAYS' to disable.'
	# QUICKSTART_KIT_REFRESH_IN_DAYS=0'
	unset "QUICKSTART_KIT_REFRESH_IN_DAYS"
EOF

# 
echo '# zgenom autoupdate' > "${DEST}"/"${ALIAS_DIR}"/001_zgenom-refresh.zsh


# oh-my-zsh disable update check
echo 'DISABLE_AUTO_UPDATE="true"' > "${DEST}"/"${ALIAS_DIR}"/001_auto-update-off.zsh

# sed -i 's,^\(export LOCATE_PATH=\).*,\1'/var/lib/mlocate/mlocate.db',' ~/.zshrc

# Use powerline-daemon to speedup the prompt.
echo 'powerline-daemon -q' > "${DEST}"/"${ALIAS_DIR}"/006_powerline-daemon.zsh


sudo sed -i 's,^\(CHARMAP=\).*,\1'\"UTF-8\"',' /etc/default/console-setup

# set theme for zsh
cat <<-EOF | tee "${DEST}"/"${ALIAS_DIR}"/002_theme.zsh
	# https://zshthem.es/browse-zsh-themes/
	ZSH_THEME="agnoster" # powerline based theme	
	#ZSH_THEME="3den"
	#ZSH_THEME="Pure"
EOF

# set colorize tool
cat <<-EOF | tee "${DEST}"/"${ALIAS_DIR}"/003_colorize.zsh
    ZSH_COLORIZE_TOOL="chroma"
    ZSH_COLORIZE_CHROMA_FORMATTER=terminal256
EOF

# see also ZVM jeffreytse/zsh-vi-mode plugin
cat <<-'EOF' | tee "${DEST}"/"${ALIAS_DIR}"/001_vi-mode.sh
	# Set vi mode
	bindkey -v
	bindkey '^R' history-incremental-search-backward

	# ZVM settings - https://github.com/jeffreytse/zsh-vi-mode/blob/master/zsh-vi-mode.zsh
	# Always starting with insert mode for each command line
	ZVM_LINE_INIT_MODE=$ZVM_MODE_INSERT

	# # Change to Zsh's default readkey engine (default for zvm is NEX)
	# ZVM_READKEY_ENGINE=$ZVM_READKEY_ENGINE_ZLE
	
	# The plugin will auto execute this zvm_after_select_vi_mode function
	# function zvm_after_select_vi_mode() {
	#   case $ZVM_MODE in
	#     $ZVM_MODE_NORMAL)
	#       # Something you want to do...
	#     ;;
	#     $ZVM_MODE_INSERT)
	#       # Something you want to do...
	#     ;;
	#     $ZVM_MODE_VISUAL)
	#       # Something you want to do...
	#     ;;
	#     $ZVM_MODE_VISUAL_LINE)
	#       # Something you want to do...
	#     ;;
	#     $ZVM_MODE_REPLACE)
	#       # Something you want to do...
	#     ;;
	#   esac
	# }

	# Change cursor style for different vi modes
	ZVM_INSERT_MODE_CURSOR=$ZVM_CURSOR_BEAM
	ZVM_NORMAL_MODE_CURSOR=$ZVM_CURSOR_BLOCK
	ZVM_OPPEND_MODE_CURSOR=$ZVM_CURSOR_UNDERLINE
EOF


#git clone http://github.com/bhilburn/powerlevel9k.git "${DEST}"/.zgen/robbyrussell/ohmyzsh-master/themes/powerlevel9k

## add a separate zsh aliases directory
ALIAS_DIR=.zsh_aliases.d
mkdir -p "${DEST}"/"${ALIAS_DIR}"

cat <<-EOF | sudo tee -a "${DEST}"/.zshrc >/dev/null
	# Make it easy to append your own aliases
	# loading all files from "${ALIAS_DIR}" directory
	ALIAS_DIR=${ALIAS_DIR}

	if [ -n "\${HOME}/\${ALIAS_DIR}" ]; then
	  for dotfile in \${HOME}/"${ALIAS_DIR}"/*
	  do
	    if [ -r "\${dotfile}" ]; then
	      source "\${dotfile}"
	    fi
	  done
	fi
EOF


# tell bash to check the next word after the alias (i.e sudo) by adding a space to the end of the alias value.
echo "# tell bash to check the next word after the alias (i.e sudo) by adding a space to the end of the alias value." > "${DEST}"/"${ALIAS_DIR}"/002_sudo.zsh
echo 'alias sudo="sudo "' >>  "${DEST}"/"${ALIAS_DIR}"/002_sudo.zsh

cat <<-EOF | sudo tee "\${DEST}"/"\${ALIAS_DIR}"/003_py_aliases.zsh
	_py_version() {
	  PY_VERSIONS=(2 3)

	  LINE=(\${(s: :)history[\$HISTCMD]})
	  COMMAND=\${LINE[1]}
	  ARGS=\${(j: :)LINE[2,-1]}

	  while (( 1 )) {
	    read -s -k1 VERSION"?\$COMMAND [\${PY_VERSIONS[1]}]: "
	    if [[ \$VERSION == $'\n' ]]; then
	      VERSION=\${PY_VERSIONS[1]}
	      break
	    elif (( \${PY_VERSIONS[(I)\$VERSION]} )); then
	      echo \$VERSION
	      break
	    fi
	    echo "\$VERSION is not supported (\${(j:, :)PY_VERSIONS})"
	  }

	  if [[ -x \$(which \$COMMAND\$VERSION) ]]; then
	    COMMAND=\$COMMAND\$VERSION
	  else
	    COMMAND="python\$VERSION \$(which -a \$COMMAND | grep -v aliased | head -n 1)"
	  fi
	  eval \$COMMAND \$ARGS
	}

	# versioned python commands
	# alias python="_py_version"
	# alias pip="_py_version"
	# alias pydoc="_py_version"
	# alias idle="_py_version"
	# alias ipython="_py_version"
	# alias jupyter="_py_version"
EOF

mkdir -p "${DEST}"/"${ALIAS_DIR}"/
cat <<-EOF | sudo tee "${DEST}"/"${ALIAS_DIR}"/003_transfer.zsh
	#
	# Defines transfer alias and provides easy command line file and folder sharing.
	#
	# Authors:
	#   Remco Verhoef <remco@dutchcoders.io>
	#

	curl --version 2>&1 > /dev/null
	if [ \$? -ne 0 ]; then
	  echo "Could not find curl."
	  return 1
	fi

	transfer() { 
	    # check arguments
	    if [ \$# -eq 0 ]; 
	    then
		echo -e "No arguments specified.\n\nUsage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"
		return 1
	    fi

	    # get temporarily filename, output is written to this file show progress can be showed
	    tmpfile=\$( mktemp -t transferXXX )
	    
	    # upload stdin or file
	    file=\$1

	    if tty -s; 
	    then 
		basefile=\$(basename "\$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g') 

		if [ ! -e \$file ];
		then
		    echo "File \$file doesn't exists."
		    return 1
		fi
		
		if [ -d \$file ];
		then
		    # zip directory and transfer
		    zipfile=\$( mktemp -t transferXXX.zip )
		    cd \$(dirname \$file) && zip -r -q - \$(basename \$file) >> \$zipfile
		    curl --progress-bar --upload-file "\$zipfile" "https://transfer.sh/\$basefile.zip" >> \$tmpfile
		    rm -f \$zipfile
		else
		    # transfer file
		    curl --progress-bar --upload-file "\$file" "https://transfer.sh/\$basefile" >> \$tmpfile
		fi
	    else 
		# transfer pipe
		curl --progress-bar --upload-file "-" "https://transfer.sh/\$file" >> \$tmpfile
	    fi
	   
	    # cat output link
	    cat \$tmpfile
	    
	    # log file link
	    APPLICATION="\${0##*/}"
	    RIGHTNOW="\$(date)"
	    EXPIRES="\$(date -d "+14 days")"
	    echo -e "\$(cat "\$tmpfile") - uploaded \$RIGHTNOW - expires \$EXPIRES\n" >> ~/\$APPLICATION.log
	    echo "\n\nSee ~/\$APPLICATION.log for all transfers.\n"

	    # cleanup
	    rm -f \$tmpfile
	}
EOF


sudo chown -R root:root /usr/local/share/zsh/site-functions
sudo chmod -R 755 /usr/local/share/zsh/site-functions
