# Fix mojibake by enforcing text mode or disabling statusline altogether
case $TERM in
    dumb)
        return
        ;;
    linux|tmux-*|screen)
        _sl_mode=text
        ;;
    *)
        _sl_mode=$PS1_MODE
        ;;
esac

_sl_blocks_left="${PS1_LEFT-host_user,ssh,git_repo,git_tree,build_info,nix_shell,venv}"
_sl_blocks_middle="${PS1_MIDDLE-workdir}"
_sl_blocks_right="${PS1_RIGHT-elapsed,return_code,unseen_mail,jobs,time}"
_sl_blocks_bottom="${PS1_BOTTOM-root_shell}"

exec {_sl_control_fd}<> <(true)

# Disable features that are already covered by statusline and apply compatibility fixes
MAILCHECK=-1
VIRTUAL_ENV_DISABLE_PROMPT=1
export NIX_SHELL_PRESERVE_PROMPT=1

_sl_stamp() { echo "${EPOCHREALTIME/[.,]/}"; }
_sl_start=${ _sl_stamp; }
_sl_elapsed=0

_sl_sem_begin() { printf '\e]133;A;aid=%s\a' "$BASHPID"; }
_sl_sem_return() { printf '\e]133;D;%s;aid=%s\a' "$1" "$BASHPID"; }
_sl_sem_prompt='\e]133;P;k=i\a'
_sl_sem_input='\e]133;B\a'
_sl_sem_output='\e]133;C\a'

_sl_precmd() {
    local retval="$?"
    if [[ -n "$_sl_start" ]]; then
        _sl_elapsed="$((${ _sl_stamp; } - _sl_start))"
        _sl_start=
        _sl_sem_return "$retval"
    else
        _sl_elapsed=0
    fi
    _sl_sem_begin

    jobs -n
}
if [[ -z "$_sl_prompt_command_registered" ]]; then
    PROMPT_COMMAND+=(_sl_precmd)
    _sl_prompt_command_registered=1
fi

_sl_preexec() {
    echo >&$_sl_control_fd # Tell statusline that prompt can no longer be updated
    _sl_start=${ _sl_stamp; }
    printf "$_sl_sem_output"
    __vte_termprop_signal "vte.shell.preexec" 2>/dev/null || true
}
PS0='${ _sl_preexec; }'

_sl_middle='$(@sl@ run \
    --mode "$_sl_mode" \
    --return-code "$?" \
    --jobs-count "\j" \
    --elapsed-time "$_sl_elapsed" \
    --left "$_sl_blocks_left" \
    --middle "$_sl_blocks_middle" \
    --right "$_sl_blocks_right" \
    --bottom "$_sl_blocks_bottom" \
    --control-fd 3 \
    3<&$_sl_control_fd \
&)'
_sl_ps1="\[$_sl_sem_prompt\]$_sl_middle\[$_sl_sem_input\]"
PS1="$_sl_ps1"

# Nice features
alias ssh='WORKGROUP_CHAIN="$(@sl@ chain)" ssh -o "SendEnv=WORKGROUP_CHAIN"'
