#!/usr/bin/env zrc
# My personal config (~/.zrc)
# Beware of envvars, stuff that you might not want, etc.
> /dev/tty eval {
	echo "Welcome to Zrc!"
	echo "The time is: `{date}"
}

set __use_unknown = false
fn enable_unknown {
	if {!($__use_unknown)} {
		set __use_unknown = true
		fn unknown {
			expr [arr argv vals]
		}
	} else {
		set __use_unknown = false
		fn unknown
	}
}
enable_unknown

fn title {
	echo -n "\e]0;${argv 1}\a"
}
set __use_title = true
fn enable_title {
	if {!($__use_title)} {
		set __use_title = true
	} else {
		set __use_title = false
		echo "\e]2;\a"
	}
}

set prompt1 = {"`{
	let {green red rbold reset pwd home lpwd lhome s} {
		set s = $status
		set green = "\e\[0;32m" red = "\e\[0;31m" rbold = "\e\[1;31m" reset = "\e\[0m"
		set pwd = `{pwd} home = [glob -t ~]
		set lpwd = [str $pwd len] lhome = [str $home len]

		# Fit ~ to pwd and set terminal window title
		if {$lhome <= $lpwd} {
			if {[str [str $pwd 0 $lhome] == $home]} {
				set pwd = $pwd/
				set pwd = ~[str $pwd $lhome $lpwd-$lhome+1]
				set pwd = [str $pwd 0 [str $pwd len]-1]
			}
		}
		if {$__use_title} {
			title "(zrc) $pwd"
		}

		# Part 1: username@hostname
		echo -n $green`{whoami}$reset@`{hostname}
		echo -n ' '
		
		# Part 2: cwd (git branch) [optional status]>
		echo -n ${green}${pwd}
		echo -n ${reset}"`{
			>&- 2 > /dev/null git tag
			if {!($status)} {
				echo -n " ("
				git branch | grep ^* | colrm 1 2 | tr -d '\n'
				echo -n ")"
			}
		}"
		echo -n "`{
			if {[str $s =~ {^[1-9][0-9]*$}] && ![str $s =~ {^0+$}]} {
				if {[str $last_status != $s]} {
					let {width right pos} {
						set width = `{tput cols}
						set right = :(

						set pos = [expr {$width - [str $right len]}]
						echo -n "\e\[s"                    # Saves cursor position
						echo -n "\e\[${pos}G"              # Move cursor to calculated column
						echo -n "${rbold}${right}${reset}" # Print the frowny
						echo -n "\e\[u"                    # Restore cursor
					}
				}
				echo -n \ $red\[${rbold}${s}${red}\]$reset
			}
		}"'> '
		set last_status = $s
	}
}"}

fn prompt {
	> /dev/tty eval echo -n $prompt1
}

bindkey -c "\cl" {
	> /dev/tty clear
	prompt
}
bindkey -c "\e?" {
	> /dev/tty eval { echo && l }
	prompt
}
bindkey -c "\en" {
	> /dev/tty archey3
	prompt
}
bindkey -c "\cb"  { firefox & }
bindkey -c "\ct"  { $TERMINAL & }
bindkey -c "\cf"  { doublecmd & }
bindkey -c "\cft" { thunar & }

set __use_lsd = false
fn enable_lsd {
	if {!($__use_lsd) && ![>&- 2 >&- which lsd] && [str `{tty} =~ pts]} {
		alias ls "lsd"
		alias l "lsd -hF"
		alias lt "lsd -althrF"
		alias la "lsd -al"
		set __use_lsd = true
	} else {
		alias ls "ls --color"
		alias l "ls --color -hF"
		alias lt "ls --color -altrhF"
		alias la "ls --color -al"
		set __use_lsd = false
	}
}

fn soundchk { timeout 0.15 aplay /dev/random }
fn life { ffplay -f lavfi -i life }
fn xkcd { $BROWSER https://xkcd.com/${argv 1}}
fn cowfort { fortune | cowsay -f `{ls /usr/share/cowsay/cows | shuf -n1} }

# Aliases
enable_lsd
alias c       "clear"
alias mkd     "mkdir -pv"
alias rmd     "rmdir -pv"
alias j       "jobs"
alias p       "ps -l"
alias du      "du -k"
alias ..      "cd .."
alias ...     "cd ../.."
alias ....    "cd ../../.."
alias .....   "cd ../../../.."
alias ......  "cd ../../../../.."
alias sha1    "openssl sha1"
alias ports   "netstat -tulanp"
alias net     "\$AUTH systemctl restart NetworkManager"
alias mkdir   "mkdir -pv"
alias pacman  "\$AUTH pacman"
alias calc    "bc -ql"
alias emacs   "emacs -nw"
alias history "eval \$PAGER \[glob -t ~/.zrc_history]"
alias da      "date '+%Y-%m-%d %A %T %Z'"

# Modify original cmds
alias cp      "cp -i"
alias mv      "mv -i"
alias rm      "rm -iv"
alias mkdir   "mkdir -pv"
alias rmdir   "rmdir -pv"
alias ps      "ps auxf"
alias ping    "ping -c 5"

# Chmod alias
alias mx      "chmod a+x"
alias 000     "chmod 000"
alias 644     "chmod 644"
alias 666     "chmod 666"
alias 755     "chmod 755"
alias 777     "chmod 777"

# Ctrl flow
alias forever "while 1"

fn mkcd { mkdir ${argv 1} && cd ${argv 1} }
fn lcd  { cd ${argv 1} && l }
fn pzf {
	let {al} {
		set al = `{help pacman}
		unalias pacman
		pacman -Slq \
			| fzf --multi --preview 'pacman -Si {1}' \
			| xargs -ro sudo pacman -S
		eval $al
	}
}

# Rot13 is a very common cipher for some reason
fn rot13 {
	if {$argc == 1} {
		tr '\[a-m]\[n-z]\[A-M]\[N-Z]' '\[n-z]\[a-m]\[N-Z]\[A-M]'
	} else let {i} {
		for {set i = 1} {$i < $argc} {inc i} {
			echo ${argv $i}
		} | rot13
	}
}

# go up n times
fn up {
	if {![str $1 =~ {^[1-9][0-9]*$}]} {
		set 1 = 1
	}
	repeat $1 ..
	return 0
}

# laptop
fn battery {
	let {b} {
		foreach b [glob /sys/class/power_supply/BAT*] {
			echo -n `{basename $b}: ''
			echo `{< $b/capacity read} (`{< $b/capacity_level read})
		}
	}
}

# Extract an archive
# (because it's hard to memorise tar commands)
fn extract {
	if {$argc < 2 || [str $1 =~ {^(--help|-h)$}]} {
		>& 1 2 echo usage: $0 <file1> <file2>...
		return 1
	}
	let {i} {
		for {set i = 1} {$i < $argc} {inc i} {
			if {[test -f $$i] != 0} {
				>& 1 2 echo $$i: file not found!
				continue
			}
			switch $$i {
				regex {.*(\.tar\.bz2|\.tbz2|\.tbz)$} { tar xvjf $$i }
				regex {.*\.tgz$}                     { tar zxvf $$i }
				regex {.*\.tar\.gz$}                 { tar xvzf $$i }
				regex {.*\.tar\.xz$}                 { tar xvJf $$i }
				regex {.*\.tar$}                     { tar xvf $$i }
				regex {.*\.rar$}                     { fallthrough }
				regex {.*\.7z$}                      { 7z x $$i }
				regex {.*\.zip$}                     { unzip $$i }
				regex {.*\.lzo$}                     { lzop -d $$i }
				regex {.*\.gz$}                      { gunzip $$i }
				regex {.*\.bz2$}                     { bunzip2 $$i }
				regex {.*\.Z$}                       { uncompress $$i }
				regex {.*(\.xz|\.txz|\.lzma|\.tlz)$} { xz -d $$i }
				default {
					>& 1 2 echo $$i could not be extracted!
					return 1
				}
			}
		}
	}
}

# Function from Xmodulo
fn kernelgraph {
	lsmod | perl -e {
		print "digraph \"lsmod\" {";
		<>;
		while(<>){
			@_=split/\s+/;
			print "\"$_[0]\" -> \"$_\"\n" for split/,/,$_[3]
		}
		print "}"
	} | dot -Tpng | display -;
}

# Helper function
fn expvar {
	set ${argv 1} = ${argv 2}
	export ${argv 1}
}
expvar AUTH    doas
expvar CDPATH  $CDPATH:$HOME
expvar PATH    $HOME/.local/bin:$PATH
expvar PAGER   most
expvar BROWSER firefox
expvar EDITOR  nvim

> /dev/null rehash
set status = 0
