# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
# if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
#   source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
# fi

export TERM="xterm-256color"
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Skip oh-my-zsh's completion security audit (compaudit). The completion dirs are
# machine-owned and not group/world-writable, so the per-startup audit only costs time.
export ZSH_DISABLE_COMPFIX=true

# Path to your oh-my-zsh installation.
export ZSH=$HOME/.oh-my-zsh

# Set name of the theme to load. Optionally, if you set this to "random"
# it'll load a random theme each time that oh-my-zsh is loaded.
# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes

# Agent/AI terminals (Cursor's agent sets CURSOR_AGENT) get a light, fast theme;
# interactive shells use powerlevel10k.
if [[ -n "$CURSOR_AGENT" ]]; then
    ZSH_THEME="robbyrussell"
else
    ZSH_THEME="powerlevel10k/powerlevel10k"
fi

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"

# Uncomment the following line to use hyphen-insensitive completion. Case
# sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"

# Uncomment the following line to disable bi-weekly auto-update checks.
# DISABLE_AUTO_UPDATE="true"

# How often to auto-update (days). Replaces the older UPDATE_ZSH_DAYS variable.
zstyle ':omz:update' frequency 30

# Uncomment the following line to change how often to auto-update (in days).
# export UPDATE_ZSH_DAYS=13

# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"

# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"

# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"

# Uncomment the following line to display red dots whilst waiting for completion.
# COMPLETION_WAITING_DOTS="true"

# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"

# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# HIST_STAMPS="mm/dd/yyyy"

# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(
    # zsh-completions   INSTALL METHOD CHANGED https://github.com/zsh-users/zsh-completions/issues/603
    zsh-autosuggestions
    zsh-syntax-highlighting
    history-substring-search
    systemd
    k
    extract
    sudo
    fzf-tab
    poetry
    # web-search
    # httpie
    # git
    # python
    # docker
    # lol
    # pip
    # pyenv
    # redis-cli
    # screen
    # zsh-wakatime          # enable if you use wakatime with 'https://github.com/wbingli/zsh-wakatime'
    )
# Plugins can be added like into your own config file under ~/.config/zshrc/ like this:
#plugins+=(zsh-nvm)

# Remove plugins from the default list above in your own config file using:
# plugins=(${plugins:#pluginname})
# plugins=(${plugins:#zsh-autosuggestions})

# fpath+="${ZSH_CUSTOM:-"$ZSH/custom"}/plugins/zsh-completions/src"   # install zsh-completions, if you need it

# source $ZSH/oh-my-zsh.sh          # This is now run in .zshrc after importing user configs from ~/.config/zshrc/* files 

# User configuration

# export MANPATH="/usr/local/man:$MANPATH"

# You may need to manually set your language environment
# export LANG=en_US.UTF-8

# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
#   export EDITOR='vim'
# else
#   export EDITOR='mvim'
# fi

# Compilation flags
# export ARCHFLAGS="-arch x86_64"

# ssh
# export SSH_KEY_PATH="~/.ssh/rsa_id"

# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"

# ~/.local/bin is added in ~/.zshenv (every zsh, including non-interactive agents).
# Do not re-export it here; keep personal early-env overrides in ~/.config/zshenv.local.

# export PATH=$PATH:~/.config/ezsh/bin

# NPM_PACKAGES="${HOME}/.npm"
# PATH="$NPM_PACKAGES/bin:$PATH"



fpath+=$ZSH/custom/plugins/zsh-completions/src

# Setup Homebrew completions for macOS
if [[ "$OSTYPE" == "darwin"* ]] && command -v brew &> /dev/null; then
    FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"
fi

autoload -U compinit && compinit -C -d ~/.cache/zsh/.zcompdump        # zsh-completions
# autoload bashcompinit                 # bash completions
# bashcompinit


# QuickZsh
SAVEHIST=50000      #save upto 50,000 lines in history. oh-my-zsh default is 10,000
#setopt hist_ignore_all_dups     # dont record duplicated entries in history during a single session

# NOTE: personal aliases that must win over oh-my-zsh are defined AFTER
# `source "$ZSH/oh-my-zsh.sh"` below, because oh-my-zsh's lib/directories.zsh
# re-defines several of them (e.g. `l`) when it loads.

# CUSTOM FUNCTIONS

# cheat sheets (github.com/chubin/cheat.sh), find out how to use commands
# example 'cheat tar'
# for language specific question supply 2 args first for language, second as the question
# eample: cheat python3 execute external program
cheat() {
    if [ "$2" ]; then
        curl "https://cheat.sh/$1/$2+$3+$4+$5+$6+$7+$8+$9+$10"
    else
        curl "https://cheat.sh/$1"
    fi
}

# Matrix screen saver! will run if you have installed "cmatrix"
# TMOUT=900
# TRAPALRM() { if command -v cmatrix &> /dev/null; then cmatrix -sb; fi }

speedtest() {
    setopt localoptions pipefail
    curl -fsSL https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -
}

dadjoke() {
    curl https://icanhazdadjoke.com
}

# Strip macOS junk from a zip (requires `zip`). Usage: cleanzip archive.zip
cleanzip() {
    zip -d "$@" __MACOSX/\* \*/.DS_Store
}

# Find geo info from IP
ipgeo() {
    # Specify ip or your ip will be used
    if [ "$1" ]; then
        curl "https://api.db-ip.com/v2/free/$1"
    else
        curl "https://api.db-ip.com/v2/free/$(myip)"
    fi
}

# To customize prompt look, edit ~/.config/ezsh/p10k.zsh or run `p10k configure`
# [[ ! -f ~/.config/ezsh/p10k.zsh ]] || source ~/.config/ezsh/p10k.zsh  # already in ZSH_CONFIGS_DIR


# Any zshrc configurations under the folder ~/.config/zshrc/ will override the default ezsh configs.
# Place all of your personal configurations over there
ZSH_CONFIGS_DIR="$HOME/.config/zshrc"

for file in "$ZSH_CONFIGS_DIR"/*(DN); do
    # Exclude '.' and '..' from being sourced
    if [ -f "$file" ]; then
        source "$file"
    fi
done

# Now source oh-my-zsh.sh so that any plugins added in ~/.config/zshrc/* files also get loaded
source "$ZSH/oh-my-zsh.sh"

# Configs that can only work after "source $ZSH/oh-my-zsh.sh", such as Aliases that depend oh-my-zsh plugins

# Personal aliases. Defined after oh-my-zsh so they win over oh-my-zsh's own
# aliases (lib/directories.zsh sets `l`, `ll`, etc. when it loads).
alias myip="wget -qO- https://wtfismyip.com/text"	# quickly show external ip address
alias l="eza --hyperlink -lA --sort=modified --reverse --classify"    # show all except . .. , sort by recent, / at the end of folders, clickable
alias e="exit"
alias ip="ip --color=auto"
## EZA - the better ls command
alias a='eza -la --git --colour-scale all -g --smart-group --icons always --hyperlink'  # the new ls; add --hyperlink if you like
alias aa='eza -la --git --colour-scale all -g --smart-group --icons always -s modified -r --hyperlink'  # sort by new

# rm moves files to Trash while tolerating standard rm flags: -f suppresses
# missing-file errors; other flags are no-ops (trash backends are already
# recursive). Files whose names start with "-" still need /bin/rm.
# Shell snapshots (Claude Code etc.) restore functions but not global arrays,
# so rm() re-resolves the backend when _TRASH_CMD is empty at call time.
_resolve_trash_cmd() {
    if [[ "$OSTYPE" == darwin* && -x /usr/bin/trash ]]; then
        typeset -ga _TRASH_CMD=(/usr/bin/trash)
    elif [[ "$OSTYPE" == darwin* ]] && command -v rmtrash &> /dev/null; then
        typeset -ga _TRASH_CMD=(rmtrash)
    elif [[ "$OSTYPE" != darwin* ]] && command -v gio &> /dev/null; then
        typeset -ga _TRASH_CMD=(gio trash)
    elif [[ "$OSTYPE" != darwin* ]] && command -v trash-put &> /dev/null; then
        typeset -ga _TRASH_CMD=(trash-put)
    fi
}
_resolve_trash_cmd
if (( ${#_TRASH_CMD[@]} )); then
    rm() {
        (( ${#_TRASH_CMD[@]} )) || _resolve_trash_cmd
        (( ${#_TRASH_CMD[@]} )) || { command rm "$@"; return }
        local force=0 arg
        local -a paths existing
        for arg in "$@"; do
            case "$arg" in
                --) ;;
                -*f*) force=1 ;;
                -*) ;;
                *) paths+=("$arg") ;;
            esac
        done
        (( ${#paths[@]} )) || return 0
        if (( force )); then
            for arg in "${paths[@]}"; do
                [[ -e "$arg" || -L "$arg" ]] && existing+=("$arg")
            done
            (( ${#existing[@]} )) || return 0
            "${_TRASH_CMD[@]}" "${existing[@]}"
        else
            "${_TRASH_CMD[@]}" "${paths[@]}"
        fi
    }
fi

# Now source fzf.zsh , otherwise Ctr+r is overwritten by ohmyzsh
if [[ -x "$HOME/.fzf/bin/fzf" ]] && ! fzf --zsh >/dev/null 2>&1; then
    path=("$HOME/.fzf/bin" ${path:#$HOME/.fzf/bin})
fi
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
export FZF_DEFAULT_OPS="--extended"

# Initialize zoxide (smarter cd command)
command -v zoxide &> /dev/null && eval "$(zoxide init zsh)"
# Short jump alias; expands at use time after zoxide defines `z`.
alias j="z"

# k plugin ships a `k` function; only alias when it actually loaded.
if (( $+functions[k] )); then
    alias k="k -h"   # human-readable sizes
fi
