#!/bin/zsh
zmodload -Fa zsh/files b:zf_mkdir b:zf_rm
zmodload -F zsh/parameter p:functions
zmodload -F zsh/system p:sysparams
zmodload -F zsh/zleparameter p:widgets
zmodload -Fa zsh/zutil b:zstyle
builtin autoload +X -Uz add-zsh-hook zmathfunc
zmathfunc

typeset -ga _autocomplete__ctxt_opts=( completealiases completeinword )

typeset -ga _autocomplete__mods=( compinit config widgets key-bindings recent-dirs async )

typeset -gU FPATH fpath=( ~autocomplete/Completions $fpath[@] )

local -P xdg_data_home=${XDG_DATA_HOME:-$HOME/.local/share}

local -P zsh_data_dir=$xdg_data_home/zsh
[[ -d $zsh_data_dir ]] ||
    zf_mkdir -pm 0700 $zsh_data_dir

local -P old_logdir=$xdg_data_home/zsh-autocomplete/log
[[ -d $old_logdir ]] &&
    zf_rm -fr -- $old_logdir

local -P logdir=${XDG_STATE_HOME:-$HOME/.local/state}/zsh-autocomplete/log

local -P bug=
for bug in ${logdir} ${logdir:h}; do
  [[ -d $bug ]] ||
      zf_rm -f $bug
done

zf_mkdir -p -- $logdir
hash -d autocomplete-log=$logdir

local -Pa older_than_a_week=( $logdir/*(Nmd+7) )
(( $#older_than_a_week[@] )) &&
    zf_rm -f -- $older_than_a_week[@]

typeset -g _autocomplete__log=${logdir}/${(%):-%D{%F}}.log
typeset -g _autocomplete__ps4=$'%D{%T.%.} %e:%N:%I\t%? %(1_,%_ ,)'

local -P zsh_cache_dir=${XDG_CACHE_HOME:-$HOME/.cache}/zsh
[[ -d $zsh_cache_dir ]] ||
    zf_mkdir -pm 0700 $zsh_cache_dir

local -P mod=
for mod in $_autocomplete__mods; do
  builtin zstyle -T ":autocomplete:$mod" enabled &&
      .autocomplete__$mod "$@"
  unfunction .autocomplete__$mod
done

add-zsh-hook precmd ${0}:precmd

# Make sure we always run before Autosuggest, so we don't overwrite its default ignore list.
typeset -gaU precmd_functions=( ${0}:precmd $precmd_functions )

${0}:precmd() {
  # WORKAROUND: For hook functions in Zsh 5.8, $0 can be something else than the function name.
  0=${(%):-%N}

  add-zsh-hook -d precmd $0
  unfunction $0

  () {
    emulate -L zsh \
        # -x
    setopt $_autocomplete__func_opts[@]

    # Workaround for https://www.zsh.org/mla/workers/2021/msg01310.html
    if builtin zstyle -L zle-hook types > /dev/null; then
      local -P hook=
      for hook in \
          zle-{isearch-{exit,update},line-{pre-redraw,init,finish},history-line-set,keymap-select}
      do
        [[ -v widgets[$hook] &&
              $widgets[$hook] == user:_zsh_highlight_widget_orig-s*-r<->-$hook ]] &&
            builtin zle -N $hook azhw:$hook
      done
    fi
  }

  local -P mod=
  for mod in $_autocomplete__mods; do
    mod=.autocomplete__${mod}:precmd
    if [[ -v functions[$mod] ]]; then
      $mod
      unfunction $mod
    fi
  done

  true
}
