function has_command --wraps=command --description "Exits non-zero if the given command cannot be found"
	command --quiet --search $argv[1]
end

alias ll 'ls -l'
alias la 'll --all'
alias lA 'la --all'

if has_command exa
	alias ls 'exa --group-directories-first --classify'
	alias l ls
	alias tree 'ls --tree --level=3'
	alias lt 'll --sort=modified'
	alias lat 'la --sort=modified'
	alias lc 'lt --sort=accessed'
	alias lT 'lt --reverse'
	alias lC 'lc --reverse'
	alias lD 'la --only-dirs'
end

function scount --wraps=count --description "Silent count exits with a non-zero status if no arguments given to count"
	count $argv > /dev/null
end

function d --wraps=cd --description "Quickly jump to NICE_HOME (or given relative or absolute path) and list files."
	if scount $argv
		cd $argv
	else
		cd $NICE_HOME
	end
	la
end

function c --wraps=cd --description "Quickly jump to a subdirectory of NICE_HOME (or just to NICE_HOME if none given)"
	if scount $argv
		cd $NICE_HOME && d $argv
	else
		d $NICE_HOME
	end
end

alias cd.. "d .."
alias cdd "d $DOTFILES_PATH"
alias cde "d $XDG_CONFIG_HOME/lytedev-env"
alias cdc "d $XDG_CONFIG_HOME"
alias cdn "d $NOTES_PATH"
alias cdl "d $XDG_DOWNLOAD_DIR"
alias cdg "d $XDG_GAMES_DIR"
alias .. "d .."
alias ... "d ../.."
alias .... "d ../../.."
alias ..... "d ../../../.."
alias ...... "d ../../../../.."
alias ....... "d ../../../../../.."
alias ........ "d ../../../../../../.."
alias ......... "d ../../../../../../../.."

has_command tmux && alias t "tmux"
has_command zellij && begin; alias z "zellij"; alias j "zellij"; end
has_command rsync && alias rcp 'rsync -r -ah --progress'
has_command bat && alias cat bat

if has_command git
	function g -w git
		if scount $argv; git $argv
		else; git status; end
	end
end

if has_command docker
	alias dlf "docker logs --tail=500 -f"
	alias ctop "docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock quay.io/vektorlab/ctop:latest"
end

if has_command docker-compose
	alias dclf "docker-compose logs --tail=500 -f"
end

if has_command weechat
	function chat
		set -l pass (pass config/weechat-passphrase | head -n 1)
		env WEECHAT_PASSPHRASE=$pass weechat
	end
end

if has_command rg
	function rgl; rg --color always $argv | less -r; end
	alias rg "rg --text"
	alias gr "rg"
end

if has_command kubectl
	alias k "kubectl"
	alias kg "k get"
end

alias v $EDITOR
alias e $EDITOR
alias sv "sudo -E $EDITOR"
alias se sv

function ltl --wraps=ls --description "Echoes the name of the file most recently modified either in the current directory or in the given path"
	set d $argv[1] .
	set -l l ""
	for f in $d[1]/*
		if test -z $l; set l $f; continue; end
		if command test $f -nt $l; and test ! -d $f
			set l $f
		end
	end
	echo $l
end

function ltld --wraps=ls --description "Echoes the name of the directory most recently modified either in the current directory or in the given path"
	set d $argv[1] .
	set -l l ""
	for f in $d[1]/*
		if test -z $l; set l $f; continue; end
		if command test $f -nt $l; and test -d $f
			set l $f
		end
	end
	echo $l
end

alias vltl "$EDITOR (ltl)"
alias cdltl "cd (ltld)"

function p
	set ip 8.8.8.8
	set -q argv[1] && set ip $argv[1]
	ping $ip $argv[2..]
end
function pp --description "Keeps trying to ping 8.8.8.8 forever"
	while not ping -n 1 -w 5 8.8.8.8
		sleep 1
	end
end

alias C "clear; set -q TMUX && begin; has_command tmux && tmux clear-history; end || true"

if has_command systemctl
	alias sctl "sudo systemctl"
	alias sctlu "systemctl --user"
	alias bt "sctl start bluetooth && sudo bluetoothctl"
	alias btctl "bt"
end

alias resrc "source $XDG_CONFIG_HOME/fish/config.fish; fish_user_key_bindings"
has_command sc && alias scs "sc $NOTES_PATH/_scratch.sc"

alias dd "dd status=progress"
alias year 'cal (date +%Y)'
alias mount 'sudo -E mount'
alias umount 'sudo -E umount'
alias ip 'ip -color'

alias pt 'pass tessen'

has_command xdg-open && alias open xdg-open
has_command docker && begin
	alias dc "docker compose"
	alias dk "docker"
end

function fish_preexec
	test -n $TMUX && begin
		set envlist (tmux show-environment)
		for var in DISPLAY WAYLAND_DISPLAY
			set -gx $var (echo $envlist | rg '^'$var'=(.*)$' -r '$1')
		end
	end
end

# source:
# https://github.com/ivakyb/fish_ssh_agent/blob/master/functions/fish_ssh_agent.fish
function __ssh_agent_is_started -d "check if ssh agent is already started"
   if begin; test -f $SSH_ENV; and test -z "$SSH_AGENT_PID"; end
      source $SSH_ENV > /dev/null
   end

   if test -z "$SSH_AGENT_PID"
      return 1
   end

   ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep -q ssh-agent
   #pgrep ssh-agent
   return $status
end

function __ssh_agent_start -d "start a new ssh agent"
   ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
   chmod 600 $SSH_ENV
   source $SSH_ENV > /dev/null
   true  # suppress errors from setenv, i.e. set -gx
end

function fish_ssh_agent --description "Start ssh-agent if not started yet, or uses already started ssh-agent."
   if test -z "$SSH_ENV"
      set -xg SSH_ENV $HOME/.ssh/environment
   end

   if not __ssh_agent_is_started
      __ssh_agent_start
   end
end