export HISTFILE="$HOME/.zsh_history"
export HISTSIZE=1000
export SAVEHIST=5000

local_install_dir="$HOME/.local/install"

# =============================================================================
# Allow for menu-style tab completion.
# =============================================================================
zstyle ':completion:*' menu select

# =============================================================================
# GPG Initialization (Ensure prompts work properly).
# =============================================================================
export GPG_TTY=$(tty)

# =============================================================================
# Personalized Logging for Shell Setup
# =============================================================================
logging_enabled=false
log_dir="$HOME/.local/log/$USER"
log_file="$log_dir/shell.log"

if [ -d "$log_dir" ]; then
    export SHELL_LOG_FILE="$log_file"
    logging_enabled=true
    touch "$SHELL_LOG_FILE"
fi

# =============================================================================
# Common Environment Configuration
# =============================================================================
# Note: use vim here so that if Neovim isn't setup, we gracefully fall back.
export EDITOR=vim

# =============================================================================
# PATH
# =============================================================================
if [ -d "$HOME/.local/bin" ]; then
    export PATH="$HOME/.local/bin:$PATH"
fi

if [ -f "$HOME/.cargo/env" ]; then
    . "$HOME/.cargo/env"
elif [ -d "$HOME/.cargo/bin" ]; then
    export PATH="$HOME/.cargo/bin:$PATH"
fi

if [ -f ~/.fzf.zsh ]; then
    source ~/.fzf.zsh
fi

export JAVA_HOME="$local_install_dir/jdk"
if [ -d "$JAVA_HOME/bin" ]; then
    export PATH="$JAVA_HOME/bin:$PATH"
fi

export COURSIER_HOME="$HOME/.local/share/coursier"
if [ -d "$COURSIER_HOME/bin" ]; then
    export PATH="$COURSIER_HOME/bin:$PATH"
fi

export GO_HOME="$local_install_dir/go"
if [ -d "$GO_HOME/bin" ]; then
    export PATH="$GO_HOME/bin:$PATH"
    export GOPATH="$HOME/.local/go"
    export PATH="$GOPATH/bin:$PATH"
fi

export N_PREFIX="$HOME/.n"
if [ -d "$N_PREFIX/bin" ]; then
    export PATH="$N_PREFIX/bin:$PATH"
fi

# =============================================================================
# SSH Agent Management
# =============================================================================
# Start ssh-agent if it is not already running. If it is running, ensure the
# environment variables are set properly.

ssh_agent_sock_file="$HOME/.ssh-agent-sock"
ssh_agent_pid_file="$HOME/.ssh-agent-pid"

touch $ssh_agent_sock_file
touch $ssh_agent_pid_file

if ps -p $(cat $ssh_agent_pid_file) > /dev/null 2>&1; then
    export SSH_AUTH_SOCK="$(cat $ssh_agent_sock_file)"
    export SSH_AGENT_PID="$(cat $ssh_agent_pid_file)"
else
    # Start a new instance of the SSH agent.
    eval "$(ssh-agent)"

    # Record the new settings in the agent tracking files.
    echo $SSH_AUTH_SOCK > $ssh_agent_sock_file
    echo $SSH_AGENT_PID > $ssh_agent_pid_file
fi

# =============================================================================
# Aliases
# =============================================================================
if command -v exa > /dev/null 2>&1; then
    alias ls='exa'
    alias ll='exa -l'
else
    if $logging_enabled; then
        echo "[warn] exa is not setup! Using the system ls" >> "$log_file"
    fi
fi

if command -v nvim > /dev/null 2>&1; then
    alias vim='nvim'
else
    if $logging_enabled; then
        echo "[warn] Neovim is not setup! Using the system vim" >> "$log_file"
    fi
fi

if command -v podman > /dev/null 2>&1; then
    alias docker='podman'
    export DOCKER_HOST=unix:///run/podman/podman.sock
    export TESTCONTAINERS_RYUK_DISABLED=true
else
    if $logging_enabled; then
        echo "[warn] Podman is not setup! The 'docker' command will not be available." >> "$log_file"
    fi
fi

# =============================================================================
# Scala/SBT Setup
# =============================================================================
if command -v sbt > /dev/null 2>&1; then
    export SBT_OPTS="-XX:+UseG1GC -Xmx2048m"
fi

# =============================================================================
# Git Command Completion
# =============================================================================

zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash
fpath=(~/.zsh $fpath)

autoload -Uz compinit && compinit

# =============================================================================
# OPAM Completion
# =============================================================================
[[ ! -r /home/pfm/.opam/opam-init/init.zsh ]] || source /home/pfm/.opam/opam-init/init.zsh  > /dev/null 2> /dev/null

# =============================================================================
# Haskell Setup
# =============================================================================
[ -f "$HOME/.ghcup/env" ] && source "$HOME/.ghcup/env"

# =============================================================================
# Initialize Starship
# =============================================================================
eval "$(starship init zsh)"

# =============================================================================
# Enable Command Syntax Highlighting
# This must be the last item in this file.
# =============================================================================
source $local_install_dir/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh