# For interactive shells
HISTFILE=~/.zhistory
HISTSIZE=10000
SAVEHIST=10000
setopt \
  ALWAYS_TO_END \
  APPEND_HISTORY \
  AUTO_CD \
  AUTO_LIST \
  AUTO_MENU \
  AUTO_PARAM_SLASH \
  AUTO_PUSHD \
  BANG_HIST \
  C_BASES \
  COMPLETE_IN_WORD \
  EXTENDED_GLOB \
  EXTENDED_HISTORY \
  HIST_EXPIRE_DUPS_FIRST \
  HIST_FIND_NO_DUPS \
  HIST_IGNORE_DUPS \
  HIST_IGNORE_SPACE \
  HIST_LEX_WORDS \
  HIST_SAVE_NO_DUPS \
  HIST_VERIFY \
  INTERACTIVE_COMMENTS \
  LONG_LIST_JOBS \
  MULTIOS \
  NO_CLOBBER \
  NO_HUP \
  NOMATCH \
  NOTIFY \
  PUSHD_IGNORE_DUPS \
  PUSHD_SILENT \
  PUSHD_TO_HOME \
  RC_QUOTES \
  SHARE_HISTORY
unsetopt \
  BEEP \
  CDABLE_VARS \
  HIST_BEEP \
  LIST_BEEP \
  FLOW_CONTROL \
  MAIL_WARNING \
  HUP \
  BG_NICE \
  CHECK_JOBS
# vi keybindings
bindkey -v

# Allow core files
ulimit -c unlimited

DIRSTACKSIZE=16

export OS="$(uname 2>/dev/null || echo "Unknown")"

# Set terminal title
case $TERM in
  xterm*|screen*)
    autoload -U add-zsh-hook
    _term_precmd() {
      emulate -L zsh
      if test -n "${TMUX}" ; then
        print -Pn "\e]2;%16<..<%~\e\\"
      else
        # this will also work in tmux but is not what we want
        print -Pn "\e]0;%n@%m: %~\a"
      fi
    }
    _term_preexec() {
      emulate -L zsh
      setopt LOCAL_OPTIONS
      setopt EXTENDED_GLOB
      # extract the first word of the command that is not a match for the
      # pattern
      # (w) = match word
      # (r) = subscript value, not index
      local cmd=${1[(wr)^(*=*|sudo|ssh|mosh|-*)]:gs/%/%%}
      if test -n "${TMUX}" ; then
        print -Pn "\e]2;${cmd}\e\\"
      else
        # this will also work in tmux but is not what we want
        print -Pn "\e]0;%n@%m: %~ ($cmd)\a"
      fi
    }
    add-zsh-hook precmd _term_precmd
    add-zsh-hook preexec _term_preexec
    ;;
esac

autoload -U colors && colors
PS1="%{$fg[black]%}[%{$fg[yellow]%}%h%{$fg[black]%}] %{%(!.$fg[red].$fg[green])%}%8>..>%n%>>%{$fg[white]%}@%{$fg[blue]%}%12>..>%m%>>%{$fg[white]%}:%{$fg[green]%}%32<...<%~%<<%{$fg[white]%}%#%{$reset_color%} "

zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion::complete:*' use-cache on
zstyle ':completion::complete:*' cache-path "${ZDOTDIR:-$HOME}/.zcompcache"

# .profile is universal
emulate sh -c '. /etc/profile'
emulate sh -c '. ~/.profile'

# Additional Keybindings
bindkey '^[[A' history-search-backward
bindkey '^[[B' history-search-forward
# ctrl-arrow keys
bindkey '^[[1;5C' forward-word
bindkey '^[[1;5D' backward-word
bindkey '^P' up-history
bindkey '^N' down-history
bindkey '^?' backward-delete-char
bindkey '^h' backward-delete-char
# ok, a few emacs convenience bindings
bindkey '^w' backward-kill-word
bindkey '^r' history-incremental-search-backward
# delete really deletes
bindkey "^[[3~" delete-char

source_if_existing() {
  if test -e "${1}" ; then source "${1}" ; else false ; fi
}

source_first_existing() {
  while (($#)); do
    if test -e "${1}" ; then
      source "${1}"
      return
    fi
    shift
  done
  return 1
}

# Source extras and aliases if interactive
if [[ $- == *i* ]] ; then
  source_if_existing $HOME/.aliases
  source_if_existing $HOME/.aliases.local
  # zsh-only-ism to avoid error if glob doesn't expand
  # specifically sets NULLGLOB for this one glob
  for file in $HOME/.zshrc.d/[a-zA-Z0-9]*.zsh(N) ; do
    source "$file"
  done
  # extra completions, prompt
  fpath=(~/.zshrc.completions ~/.zshrc.d/matir_prompt ~/.zshrc.d/agnoster_prompt $fpath)
  # Homebrew on mac
  if test -x /opt/homebrew/bin/brew ; then
    eval $(/opt/homebrew/bin/brew shellenv)
  fi
  # Completion
  zstyle ':compinstall' filename "${HOME}/.zshrc"
  zstyle ':completion:*' users root ${USER}
  # Modules after fpath
  autoload -Uz compinit && compinit -i
  autoload -Uz promptinit && promptinit
  # Virtualenvwrapper
  source_first_existing \
    /usr/share/virtualenvwrapper/virtualenvwrapper_lazy.sh \
    /usr/bin/virtualenvwrapper_lazy.sh \
    /opt/homebrew/bin/virtualenvwrapper_lazy.sh
  if command ls --version >/dev/null 2>&1 ; then
    alias ls="$(whence -p ls) --color=auto"
  fi
  # Syntax highlighting and substring search
  source_first_existing \
    /usr/share/{,zsh/plugins/}zsh-syntax-highlighting/zsh-syntax-highlighting.zsh \
    /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
  if source_if_existing ${HOME}/.zshrc.d/_zsh-history-substring-search.zsh ; then
    bindkey '^[[A' history-substring-search-up
    bindkey '^[[B' history-substring-search-down
    bindkey -M vicmd 'k' history-substring-search-up
    bindkey -M vicmd 'j' history-substring-search-down
  fi
  # Suggestions
  if source_first_existing \
    /usr/share/{,zsh/plugins/}zsh-autosuggestions/zsh-autosuggestions.zsh ; then
    # Works well for solarized
    ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=10"
    # Strategy -- note that 'completion' is slow AF
    ZSH_AUTOSUGGEST_STRATEGY=(history)
  fi
  # History
  alias fullhist="history 1"
  alias longhist="history -1000"
  # direnv if present
  if command -v direnv >/dev/null 2>&1 ; then
    eval "$(direnv hook zsh)"
  fi
  test -e "${HOME}/.iterm2_shell_integration.zsh" && \
    source "${HOME}/.iterm2_shell_integration.zsh" || true
fi  # End interactive-only block

# In case ack is named ack-grep
if [ -x /usr/bin/ack-grep ] ; then
  alias ack='/usr/bin/ack-grep'
fi

# Pip packages and other local resources
if test -d ${HOME}/.local/bin ; then
  PATH="${PATH}:${HOME}/.local/bin"
fi

if test -z "${PAGER}" && command -v less >/dev/null 2>&1; then
  export PAGER="less"
fi

# I want this first always
PATH="${HOME}/bin:${PATH}"

# Load any local settings
source_if_existing $HOME/.zshrc.local

# separate interactive block based on .zshrc.local
if [[ $- == *i* ]] ; then
  # Set prompt based on local settings
  if test -f "${HOME}/.zprompt" ; then
    THEME=${THEME:=$(cat "${HOME}/.zprompt")}
  fi
  if command -v starship >/dev/null 2>&1 ; then
    : ${THEME:=starship}
    if [ "${THEME}" = "starship" ] ; then
      eval "$(starship init zsh)"
    fi
  fi
  prompt "${THEME:-matir}" >/dev/null 2>&1
fi

# Cleanup PATH
typeset -U PATH
