# #############################################################################
# zsh
# #############################################################################

autoload -Uz compinit promptinit
fpath=(~/.zsh/completions $fpath)
compinit -u
compctl -K tln muxa
compdef mosh=ssh
promptinit

HISTFILE=~/.zshistory
HISTSIZE=99999
SAVEHIST=99999
MAILCHECK=0 # uberspace
LISTMAX=0

setopt completealiases
setopt complete_in_word
setopt no_multios
setopt nobgnice
setopt inc_append_history
setopt share_history
setopt no_beep

bindkey -v
bindkey '^R' history-incremental-search-backward
bindkey '^A' vi-beginning-of-line
bindkey '^E' vi-end-of-line

zstyle ':completion:*' completer _complete _ignored
zstyle ':completion:*' menu select=2
zstyle :compinstall filename '~/.zshrc'
zstyle '*' hosts # do not use /etc/hosts

ZDIR=~/.zsh/
_HOST_TYPE=$(uname)

_HOSTNAME=$(timeout --preserve-status 0.1 hostname -f 2>/dev/null)
if [[ $? != 0 ]]; then
  _HOSTNAME=$HOST # $HOST is set by zsh
fi

_USERNAME=$(whoami)

# #############################################################################
# ssh-agent
# #############################################################################

SSH_ENV="$HOME/.ssh/environment"

function start_agent {
  echo "Initialising new SSH agent..."
  /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
  echo succeeded
  chmod 600 "${SSH_ENV}"
  . "${SSH_ENV}" > /dev/null
  /usr/bin/ssh-add
}


if [[ $_USERNAME != "root" ]]; then
  if [[ $_HOST_TYPE != "OpenBSD" ]]; then
    if [ -f "${SSH_ENV}" ]; then
      . "${SSH_ENV}" > /dev/null
      ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
          start_agent
      }
    else
      start_agent;
    fi
  fi
fi

# #############################################################################
# functions
# #############################################################################

diff ()
{
  if [[ -x $(which colordiff 2>/dev/null) ]]; then
    colordiff "$@"
  else
    command diff --color=auto "$@"
  fi
}

irb ()
{
  which pry &>/dev/null
  if [[ $? -eq 0 ]]; then
    pry "$@"
  else
    command irb "$@"
  fi
}

lsof_kill ()
{
  lsof $1 | grep -v COMMAND | cut -d " " -f 2- | strips | cut -d " " -f 1 | xargs kill
}

tln ()
{
  reply=( $(tmux list-sessions | cut -d: -f1) )
}

watch_pdflatex ()
{
  ls $@ | entr pdflatex --interaction=batchmode $1
  echo "tell application \"Preview\" to activate" | osascript -
  echo "tell application \"iTerm2\" to activate" | osascript -
}

pdfprevfile ()
{
  pdftoppm $1 -f 1 -l 1 -singlefile -png
}

getcert ()
{
  openssl s_client -showcerts -connect $1 <dev/null > $2
}

on_gcloud () {
   curl metadata.google.internal -i -m 1 &>/dev/null
   if [[ $? -eq 0 ]]; then
     echo "yes"
   else
     echo "no"
   fi
}

on_aws () {
  if [[ $(echo $_HOSTNAME | cut -d. -f 2) == "ec2" ]]; then
    echo "yes"
  else
    echo "no"
  fi
}

function chpwd
{
  if [[ -e $ZDIR/functions ]] {
    source ~/.zsh/functions/rtab.zsh
    if [[ $(pwd) == $HOME ]]; then
      psvar[1]=$(print -P %~)
    else
      psvar[1]=$(rtab)
    fi
  } else {
    psvar[1]=$(print -P %~)
  }
}
chpwd
zstyle ':prompt:rtab' fish yes
zstyle ':prompt:rtab' nameddirs yes

# #############################################################################
# exports
# #############################################################################

# https://consoledonottrack.com/
export DO_NOT_TRACK=1

if [[ $_USERNAME == "root" ]]; then
  umask 0022
else
  umask 0077
fi

export PATH=~/.local/bin:~/.local/sbin:$PATH
export PATH=/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH

export MANPATH=$MANPATH:$HOME/.local/share/man

export GOPATH=$HOME/.local/lib/pkg/go

function maybe_add_dir_to_path {
  if [[ -d $1 ]]; then
    export PATH=$1:$PATH;
  fi
}

maybe_add_dir_to_path ~/local_bin
maybe_add_dir_to_path /home/pks/local_bin
maybe_add_dir_to_path ~/.sync/local_bin
maybe_add_dir_to_path ~/.sync/sync/local_bin
maybe_add_dir_to_path /home/pks/.sync/local_bin
maybe_add_dir_to_path ~/nlp_scripts
maybe_add_dir_to_path /home/pks/nlp_scripts
maybe_add_dir_to_path ~/.sync/nlp_scripts
maybe_add_dir_to_path /home/pks/.sync/nlp_scripts
maybe_add_dir_to_path /usr/lib/colorgcc/bin
maybe_add_dir_to_path /opt/local/bin
maybe_add_dir_to_path /opt/local/sbin

which R &>/dev/null
if [[ $? == 0 ]]; then
  maybe_add_dir_to_path $HOME/.R
fi

export EDITOR='vim -p'
alias qmv='qmv -evim -fdo'

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

export RUBYOPT=-Ku
export GEM_HOME=$HOME/.local/lib/ruby/
export GEM_PATH=$HOME/.local/lib/ruby/:$GEM_PATH

export PYTHONPATH=$PYTHONPATH:~/.local/lib/python/site-packages:~/.local/lib/python3/site-packages
export PATH=~/.local/lib/python/site-packages:$PATH

export PATH=~/.local/lib/node/bin:$PATH

export TEXMFHOME='~/.texmf'

export CFLAGS="-march=native -mtune=native"
export CXXFLAGS="$CFLAGS"
export CCACHE_PATH=/usr/bin


case $_HOST_TYPE in
  Linux)
    case $_USERNAME in
      root)
        export PATH=/home/pks/.local/bin:$PATH
        ;;
    esac
  ;;
esac

function source_something {
  if [[ -f $1 ]]; then
    source $1;
  fi
}

source_something ~/.zshrc.personal
source_something ~/.zshrc.work
source_something ~/.local/src/zoxide/zoxide.plugin.zsh
export MCFLY_KEY_SCHEME=vim
export MCFLY_FUZZY=true
export MCFLY_RESULTS=48
source_something /usr/share/mcfly/mcfly.zsh

# #############################################################################
# terminal
# #############################################################################

case $TERM in
  screen-256color) ;;
  rxvt)
    TERM=rxvt-256color
  ;;
  *)
    TERM=xterm-256color
  ;;
esac

stty -ixon # enable mapping of C-s in vim..

# #############################################################################
# prompt
# #############################################################################

autoload -U colors && colors

# possible colors: black, white, green, cyan, red, yellow, magenta
case $_HOSTNAME in
  *.home|barkley*|bogues*|carter*|durant*|harden*|james*|ming*|mutombo*|nash*|oneal*|robinson*)
    _HOSTCOLOR_BG=magenta
    _HOSTCOLOR_FG=black
  ;;
  *.uberspace.de|*.in-berlin.de|*-hdh)
    _HOSTCOLOR_BG=green
    _HOSTCOLOR_FG=black
    alias tmux="tmux -f ~/.tmux/uberspace.conf"
  ;;
  *)
    _HOSTCOLOR_BG=black
    _HOSTCOLOR_FG=white
    alias tmux="tmux -f ~/.tmux/default.conf"
    # google cloud
    if [[ $(on_gcloud) == "yes" ]]; then
      _HOSTCOLOR_BG=blue
      _HOSTCOLOR_FG=white
      alias tmux="tmux -f ~/.tmux/gcloud.conf"
    # aws
    elif [[ $(on_aws) == "yes" ]]; then
      _HOSTCOLOR_BG=yellow
      _HOSTCOLOR_FG=black
      alias tmux="tmux -f ~/.tmux/aws.conf"
    fi
  ;;
esac

function chpwd
{
  if [[ -e $ZDIR/functions ]] {
    source ~/.zsh/functions/rtab.zsh
    if [[ $(pwd) == $HOME ]]; then
      psvar[1]=$(print -P %~)
    else
      psvar[1]=$(rtab)
    fi
  } else {
    psvar[1]=$(print -P %~)
  }
}
chpwd
zstyle ':prompt:rtab' fish yes
zstyle ':prompt:rtab' nameddirs yes

case $_USERNAME in
  root)
    PROMPT="%{$bg[red]%}%{$fg[black]%}%m:%1v#%{$reset_color%} "
  ;;
  *)
    PROMPT="%{$bg[$_HOSTCOLOR_BG]%}%{$fg[$_HOSTCOLOR_FG]%}%m%{$reset_color%}:%1v> "
  ;;
esac

case $TERM in
  *256color*)
     precmd () {print -Pn "\e]0;%n@%m%~\a"}
    preexec () {print -Pn "\e]0;%n@%m%~ -- $1\a"}
  ;;
esac

# #############################################################################
# aliases
# #############################################################################

case $_HOST_TYPE in
  OpenBSD)
    alias ls='colorls -G'
  ;;
  Darwin)
    alias ls='ls -h -G'
    alias grep='ggrep'
    export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH
    if [[ -d /Library/TeX/texbin/ ]]; then
      export PATH=/Library/TeX/texbin:$PATH
    fi
    alias afk="/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend"
  ;;
  Linux)
    alias ls='ls -h --color=auto'
    export LD_LIBRARY_PATH=$HOME/.local/lib:$HOME/.local/lib64:$LD_LIBRARY_PATH
  ;;
esac

alias d='z'
alias l='ls'
alias la='ls -lA'
alias ll='ls -l'
alias lla='ls -A'
alias lsc='ls -1 | wc -l'
alias less='less -R'
alias lh='ls --color=always -lasth | less'

alias equery='sudo equery -N'
alias feh='feh -F --auto-rotate'
alias git='git -c color.status=always'
if [[ $_HOST_TYPE != "OpenBSD" ]]; then
  alias grep='grep --color=auto'
fi
alias pdf='zathura'
alias py='bpython'
alias vi=$EDITOR
alias jsonlint='python -mjson.tool'
alias jpegtran='jpegtran -trim'
alias pdfmerge='gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=/tmp/merged.pdf -dBATCH'
alias thumb='convert -resize 200x200'
alias radio='mocp ~/.moc/radio.m3u'

alias muxn='tmux new -s'
alias muxl='tmux list-sessions'
alias muxa='tmux attach -t'

alias easy_install_home='easy_install --install-dir=$HOME/.local/lib/python/site-packages'
alias pip_install_home='pip3 install --prefix $HOME/.local'
alias npm_install_home='npm install -g --prefix ~/.local/lib/node'
alias gem_install_home='gem install --install-dir=$HOME/.local/lib/ruby --bindir=$HOME/.local/bin'

if [[ $_HOST_TYPE == "Linux" ]]; then
  alias cal='while true; do clear; echo; khal calendar; sleep 600; done'
  alias wifi_list='sudo iwlist wlan0 scan'
  alias always_on='xset dpms 0 0 0'
  case $_HOSTNAME in
    bogues*)
      alias vgaoff='xrandr --output VGA1 --off && xrandr --output LVDS1 --mode 1024x768'
      alias vgaclone='xrandr --output VGA1 --mode 1024x768'
      ;;
  esac
  alias vgaext='xrandr --output VGA1 --mode 1024x768 --left-of LVDS1 --rotate right'
  alias vga21='xrandr --output VGA1 --mode 1600x1200 --rate 60 --rotate left && xrandr --output LVDS1 --off'
  alias reboot='sudo shutdown -r now'
  alias halt='sudo shutdown -h now'
  alias lp2p='/usr/bin/lp -o sides=two-sided-long-edge'
  alias lp4p='/usr/bin/lp -o sides=two-sided-short-edge -o number-up=2'
  alias lp8p='/usr/bin/lp -o sides=two-sided-short-edge -o number-up=4 -o landscape'
  alias lpimg='/usr/bin/lp -o fit-to-page'
fi