# shellcheck disable=SC1090,SC1091,SC2034,SC2154,SC2296

# If not running interactively, don't do anything
case $- in
  *i*) ;;
    *) return;;
esac

### Language / Fonts
export LANG="en_US"
export LC_ALL="en_US.UTF-8"

### Advanced Bash-features are supported
export BASH_SUPPORT=true

### Import Common Settings
export XDG_CONFIG_HOME="$HOME/.config"
if [ -f "$HOME/.config/shell/profile.sh" ]; then
  . "$XDG_CONFIG_HOME/shell/profile.sh"
fi

### Misc.
export HISTFILE="$XDG_STATE_HOME/zsh/history"
export ZLE_RPROMPT_INDENT=0
export WORDCHARS=${WORDCHARS//\/}
export PROMPT_EOL_MARK=
export TIMEFMT=$'\nreal\t%E\nuser\t%U\nsys\t%S\ncpu\t%P'

### Antigen
export ADOTDIR="$HOME/.local/antigen"

### Powerline
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

### Fig
[[ -f "$HOME/.fig/shell/zshrc.pre.zsh" ]] && . "$HOME/.fig/shell/zshrc.pre.zsh"

# --------------------------------- SETTINGS ----------------------------------
setopt AUTO_CD
setopt BEEP
setopt CORRECT
setopt HIST_BEEP
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_FIND_NO_DUPS
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_DUPS
setopt HIST_REDUCE_BLANKS
setopt HIST_SAVE_NO_DUPS
setopt HIST_VERIFY
setopt INC_APPEND_HISTORY
setopt INTERACTIVE_COMMENTS
setopt MAGIC_EQUAL_SUBST
setopt NO_NO_MATCH
setopt NOTIFY
setopt NUMERIC_GLOB_SORT
setopt PROMPT_SUBST
setopt SHARE_HISTORY

# ZSH completion system
if [ ! -d "$XDG_CACHE_HOME/zsh" ]; then
	mkdir -p "$XDG_CACHE_HOME/zsh"
fi
compinit -d "$XDG_CACHE_HOME/zsh/zcompdump-$ZSH_VERSION"
autoload -Uz compinit
zstyle ':completion:*:*:*:*:*' menu select
zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/zcompcache"
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
zstyle ':completion:*' auto-description 'specify: %d'
zstyle ':completion:*' completer _expand _complete
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s
zstyle ':completion:*' rehash true
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
zstyle ':completion:*' use-compctl false
zstyle ':completion:*' verbose true
# shellcheck disable=SC2016
zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd'
zstyle ':completion:*:git-checkout:*' sort false
zstyle ':completion:*:descriptions' format '[%d]'
if command -v fzf > /dev/null && command -v exa > /dev/null; then
  zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
  zstyle ':fzf-tab:*' switch-group ',' '.'
fi

# Key bindings
bindkey -e
bindkey '^U' backward-kill-line
bindkey '^[[2~' overwrite-mode
bindkey '^[[3~' delete-char
bindkey '^[[H' beginning-of-line
bindkey '^[[1~' beginning-of-line
bindkey '^[[F' end-of-line
bindkey '^[[4~' end-of-line
bindkey '^[[1;5C' forward-word
bindkey '^[[1;5D' backward-word
bindkey '^[[3;5~' kill-word
bindkey '^[[5~' beginning-of-buffer-or-history
bindkey '^[[6~' end-of-buffer-or-history
bindkey '^[[Z' undo
bindkey ' ' magic-space

# ------------------------------- ZSH PLUGINS ---------------------------------
# Plugin source helper
_source_plugin() {
	local plugin_name="$1"
	for basedir in "$HOME/.local/antigen/bundles/zsh-users"; do
		plugin="$basedir/$plugin_name/$plugin_name.zsh"
		[ -f "$plugin" ] && source "$plugin" && return 0
	done
	echo "\033[33m[ ! ]\033[0m ZSH ${plugin_name#zsh-} not installed"
	return 1
}

# ZSH Autosuggestions
_source_plugin zsh-autosuggestions && ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#999'

# ZSH Syntax Highlighting
if _source_plugin zsh-syntax-highlighting; then
	ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern)
	ZSH_HIGHLIGHT_STYLES[default]=none
	ZSH_HIGHLIGHT_STYLES[unknown-token]=fg=white,underline
	ZSH_HIGHLIGHT_STYLES[reserved-word]=fg=cyan,bold
	ZSH_HIGHLIGHT_STYLES[suffix-alias]=fg=green,underline
	ZSH_HIGHLIGHT_STYLES[global-alias]=fg=green,bold
	ZSH_HIGHLIGHT_STYLES[precommand]=fg=green,underline
	ZSH_HIGHLIGHT_STYLES[commandseparator]=fg=blue,bold
	ZSH_HIGHLIGHT_STYLES[autodirectory]=fg=green,underline
	ZSH_HIGHLIGHT_STYLES[path]=bold
	ZSH_HIGHLIGHT_STYLES[path_pathseparator]=
	ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]=
	ZSH_HIGHLIGHT_STYLES[globbing]=fg=blue,bold
	ZSH_HIGHLIGHT_STYLES[history-expansion]=fg=blue,bold
	ZSH_HIGHLIGHT_STYLES[command-substitution]=none
	ZSH_HIGHLIGHT_STYLES[command-substitution-delimiter]=fg=magenta,bold
	ZSH_HIGHLIGHT_STYLES[process-substitution]=none
	ZSH_HIGHLIGHT_STYLES[process-substitution-delimiter]=fg=magenta,bold
	ZSH_HIGHLIGHT_STYLES[single-hyphen-option]=fg=green
	ZSH_HIGHLIGHT_STYLES[double-hyphen-option]=fg=green
	ZSH_HIGHLIGHT_STYLES[back-quoted-argument]=none
	ZSH_HIGHLIGHT_STYLES[back-quoted-argument-delimiter]=fg=blue,bold
	ZSH_HIGHLIGHT_STYLES[single-quoted-argument]=fg=yellow
	ZSH_HIGHLIGHT_STYLES[double-quoted-argument]=fg=yellow
	ZSH_HIGHLIGHT_STYLES[dollar-quoted-argument]=fg=yellow
	ZSH_HIGHLIGHT_STYLES[rc-quote]=fg=magenta
	ZSH_HIGHLIGHT_STYLES[dollar-double-quoted-argument]=fg=magenta,bold
	ZSH_HIGHLIGHT_STYLES[back-double-quoted-argument]=fg=magenta,bold
	ZSH_HIGHLIGHT_STYLES[back-dollar-quoted-argument]=fg=magenta,bold
	ZSH_HIGHLIGHT_STYLES[assign]=none
	ZSH_HIGHLIGHT_STYLES[redirection]=fg=blue,bold
	ZSH_HIGHLIGHT_STYLES[comment]=fg=black,bold
	ZSH_HIGHLIGHT_STYLES[named-fd]=none
	ZSH_HIGHLIGHT_STYLES[numeric-fd]=none
	ZSH_HIGHLIGHT_STYLES[arg0]=fg=cyan
	ZSH_HIGHLIGHT_STYLES[bracket-error]=fg=red,bold
	ZSH_HIGHLIGHT_STYLES[bracket-level-1]=fg=blue,bold
	ZSH_HIGHLIGHT_STYLES[bracket-level-2]=fg=green,bold
	ZSH_HIGHLIGHT_STYLES[bracket-level-3]=fg=magenta,bold
	ZSH_HIGHLIGHT_STYLES[bracket-level-4]=fg=yellow,bold
	ZSH_HIGHLIGHT_STYLES[bracket-level-5]=fg=cyan,bold
	ZSH_HIGHLIGHT_STYLES[cursor-matchingbracket]=standout
fi

unset -f _source_plugin

# POWERLEVEL
if ! [[ $(tty) = /dev/tty* ]]; then
	if source "$HOME/.local/antigen/bundles/romkatv/powerlevel10k/powerlevel10k.zsh-theme" 2> /dev/null; then
		s=' ' # fix too wide icons
		POWERLEVEL9K_MODE=nerdfont-complete
		POWERLEVEL9K_SHORTEN_STRATEGY=truncate_beginning
		POWERLEVEL9K_PROMPT_ADD_NEWLINE=false
		POWERLEVEL9K_PROMPT_ON_NEWLINE=true
		POWERLEVEL9K_RPROMPT_ON_NEWLINE=true
		POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
    	# shellcheck disable=SC2016
		POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='${P9K_CONTENT} $(whoami | grep -v "^root\$")'
		POWERLEVEL9K_OS_ICON_BACKGROUND=red
		POWERLEVEL9K_OS_ICON_FOREGROUND=white
		POWERLEVEL9K_ROOT_INDICATOR_BACKGROUND=black
		POWERLEVEL9K_ROOT_INDICATOR_FOREGROUND=red
		POWERLEVEL9K_SSH_BACKGROUND=white
		POWERLEVEL9K_SSH_FOREGROUND=blue
		POWERLEVEL9K_FOLDER_ICON=
		POWERLEVEL9K_DIR_BACKGROUND=blue
		POWERLEVEL9K_DIR_FOREGROUND=black
		POWERLEVEL9K_DIR_WRITABLE_BACKGROUND=black
		POWERLEVEL9K_DIR_WRITABLE_FOREGROUND=red
		POWERLEVEL9K_VCS_CLEAN_FOREGROUND=black
		POWERLEVEL9K_VCS_CLEAN_BACKGROUND=green
		POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=black
		POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=yellow
		POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=white
		POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=black
		POWERLEVEL9K_VCS_UNTRACKED_ICON=●
		POWERLEVEL9K_VCS_UNSTAGED_ICON=±
		POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON=↓
		POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON=↑
		POWERLEVEL9K_VCS_COMMIT_ICON=$s
		POWERLEVEL9K_STATUS_VERBOSE=false
		POWERLEVEL9K_STATUS_VERBOSE=false
		POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE=true
		POWERLEVEL9K_EXECUTION_TIME_ICON=$s
		POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0
		POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=black
		POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=blue
		POWERLEVEL9K_COMMAND_BACKGROUND_JOBS_BACKGROUND=black
		POWERLEVEL9K_COMMAND_BACKGROUND_JOBS_FOREGROUND=cyan
		POWERLEVEL9K_TIME_ICON=
		POWERLEVEL9K_TIME_FORMAT='%D{%I:%M}'
		POWERLEVEL9K_TIME_BACKGROUND=black
		POWERLEVEL9K_TIME_FOREGROUND=white
		POWERLEVEL9K_RAM_ICON=
		POWERLEVEL9K_RAM_FOREGROUND=black
		POWERLEVEL9K_RAM_BACKGROUND=yellow
		POWERLEVEL9K_VI_MODE_FOREGROUND=black
		POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL
		POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=green
		POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL
		POWERLEVEL9K_VI_MODE_VISUAL_BACKGROUND=blue
		POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE
		POWERLEVEL9K_VI_MODE_OVERWRITE_BACKGROUND=red
		POWERLEVEL9K_VI_INSERT_MODE_STRING=
		POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B2'
		POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B0'
		POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%F{blue}╭─'
		POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%F{blue}╰%f '
		POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon root_indicator ssh dir dir_writable vcs)
		POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(vi_mode status command_execution_time background_jobs time ram)
		unset s
	else
		echo '\033[33m[ ! ]\033[0m ZSH powerlevel10k not installed'
	fi
else
	clear
	echo
	echo
fi

switch_powerlevel_multiline_prompt(){
	[ $POWERLEVEL9K_PROMPT_ON_NEWLINE = true ] \
		&& POWERLEVEL9K_PROMPT_ON_NEWLINE=false \
		|| POWERLEVEL9K_PROMPT_ON_NEWLINE=true

	zle && zle accept-line
}
zle -N switch_powerlevel_multiline_prompt
bindkey ^P switch_powerlevel_multiline_prompt

# ----------------------------------- MISC -----------------------------------
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*|alacritty)
	precmd() {
    	print -Pnr -- $'\e]0;%n@%m: %~\a'
  	}
	;;
esac

### Homebrew ZSH Completions
# Must be sourced before compinit / Oh-My-ZSH inclusion
FPATH="$HOMEBREW_PREFIX/share/zsh/site-functions:${FPATH}"

### Antigen
if [ -f "$HOME/.local/scripts/antigen.zsh" ]; then
  source "$HOME/.local/scripts/antigen.zsh"
fi
if command -v antigen > /dev/null; then
  # Fix for oh-my-zsh overriding exa aliases
  export DISABLE_LS_COLORS=true
  # Official Oh-My-ZSH plugins
  antigen use oh-my-zsh
  antigen bundle adb
  antigen bundle bazel
  antigen bundle codeclimate
  # antigen bundle colored-man-pages
  antigen bundle command-not-found
  antigen bundle copybuffer
  # TODO: Add as an alias available to Bash as well
  antigen bundle encode64
  # antigen bundle fd # Added by bash completions script
  antigen bundle flutter
  # antigen bundle fzf # Added by bash completions script
  # antigen bundle gcloud # Added by bash completions script
  antigen bundle gem
  # antigen bundle gh # Added by bash completions script
  antigen bundle git-auto-fetch
  antigen bundle git-extras
  antigen bundle git-flow
  antigen bundle gitfast
  antigen bundle github
  # antigen bundle gnu-utils
  antigen bundle golang
  # antigen bundle gpg-agent
  # antigen bundle gradle # Added by bash completions script
  # antigen bundle helm # Added by bash completions script
  antigen bundle heroku
  antigen bundle httpie
  antigen bundle ionic
  antigen bundle ipfs
  antigen bundle isodate
  # antigen bundle keychain
  antigen bundle kn
  # antigen bundle kubectl # Added by bash completions script
  antigen bundle kubectx
  antigen bundle last-working-dir
  antigen bundle lxd
  antigen bundle macos
  antigen bundle macports
  antigen bundle magic-enter
  antigen bundle marktext
  antigen bundle microk8s
  antigen bundle minikube
  antigen bundle mongo-atlas
  antigen bundle mongocli
  antigen bundle mosh
  antigen bundle multipass
  antigen bundle ng
  antigen bundle node-docs
  antigen bundle nomad
  # antigen bundle npm # Added by bash completions script
  antigen bundle oc
  antigen bundle pass
  # antigen bundle pep8
  antigen bundle pip
  # antigen bundle pipenv
  antigen bundle pm2
  # antigen bundle poetry # Added by bash completions script
  antigen bundle qrcode
  antigen bundle react-native
  antigen bundle redis-cli
  antigen bundle ripgrep
  antigen bundle rust
  antigen bundle safe-paste
  antigen bundle sdk
  # antigen bundle skaffold
  antigen bundle spring
  # antigen bundle shell-proxy
  antigen bundle sprunge
  # antigen bundle ssh-agent
  antigen bundle sudo
  antigen bundle terraform
  antigen bundle thefuck
  antigen bundle timer
  antigen bundle tmuxinator
  antigen bundle urltools
  antigen bundle ufw
  antigen bundle vagrant
  # antigen bundle volta # Added by bash completions script
  antigen bundle web-search
  # antigen bundle wp-cli # Added by bash completions script
  antigen bundle docker
  antigen bundle docker-compose
  antigen bundle yarn

  # Third-party plugins
  antigen bundle jscutlery/nx-completion
  antigen bundle lukechilds/zsh-better-npm-completion

  antigen bundle zsh-interactive-cd
  # antigen bundle zsh-navigation-tools
  antigen bundle zsh-users/zsh-completions src
  if command -v fzf > /dev/null; then
  	antigen bundle aloxaf/fzf-tab
  fi
  antigen bundle marlonrichert/zsh-autocomplete@main
  antigen bundle zsh-users/zsh-autosuggestions
  antigen bundle zsh-users/zsh-syntax-highlighting
  if [ -d /Applications ] && [ -d /System ]; then
  	antigen bundle zsh-apple-touchbar
  fi
  antigen theme romkatv/powerlevel10k
  antigen apply
fi

### ZSH Autocomplete
zstyle ':autocomplete:*' list-lines 14
zstyle ':autocomplete:history-search:*' list-lines 14
zstyle ':autocomplete:history-incremental-search-*:*' list-lines 14
if command -v fzf > /dev/null; then
	zstyle ':autocomplete:*' fzf-completion yes
fi
if command -v zoxide > /dev/null; then
	zstyle ':autocomplete:recent-dirs' backend zoxide
fi

### Cod
if command -v cod > /dev/null; then
	source <(cod init $$ zsh)
fi

### direnv
if command -v direnv > /dev/null; then
	eval "$(direnv hook zsh)"
fi

### Java (asdf)
if [ -f "$ASDF_DATA_DIR/plugins/java/set-java-home.zsh" ]; then
  # . "$ASDF_DATA_DIR/plugins/java/set-java-home.zsh"
fi

### mcfly
if command -v mcfly > /dev/null; then
	eval "$(mcfly init zsh)"
fi

### Fig
if [ -f "$HOME/.fig/shell/zshrc.post.zsh" ]; then
	source "$HOME/.fig/shell/zshrc.post.zsh"
fi

### Powerline
if [ -f "$HOME/.local/scripts/p10k.zsh" ]; then
	source "$HOME/.local/scripts/p10k.zsh"
fi

### The Fuck
if command -v thefuck > /dev/null; then
	eval "$(thefuck --alias)"
fi

### Bash Completions
autoload -U +X bashcompinit && bashcompinit

### HashiCorp Vault
if command -v vault > /dev/null; then
	complete -o nospace -C vault vault
fi

### zoxide
if command -v zoxide > /dev/null; then
	eval "$(zoxide init --cmd cd zsh)" > /dev/null
fi