#!/bin/sh

browser_cmd="brave-browser"
browser_new_cmd="brave-browser --new-window"

launch() {
	app=$(printf "Notes
	Files
	Edit
	Editor
	Terminal
	Multiplexer
	LBRY
	Chat
	Music
	Browser
	Hidden browser
	Manual
	Email
	Page
	Define
	Package search
	Package info
	Play clipboard
	Play downloads
	Processes" | tr -d '\t' |
		dmenu -i -p "Launcher")

	case $app in 
		Notes) st -t "Notes" -e vim "+cd ~/Notes/text" "+CtrlP";;
		Files) st -t "Files" -e sh -lc nnn;;
		Edit) editor;;
		Editor) st -t "Editor" -e vim;;
		Terminal) st -t "Terminal";;
		Page) pages pager "$(printf "1\n2\n3\n" | dmenu -p 'page')";;
		Manual) p=$(printf '' | dmenu -p 'man'); st -t "Manual $p" -e man "$p";;
		Multiplexer) st -t "Multiplexer" -e tmux attach-session -t 0 || st -t "Multiplexer" -e tmux new-session -s 0;;
		LBRY) lbry;;
		Chat) element-desktop;;
		Music) st -t "Music" -e ncmpcpp;;
		Browser) $browser_cmd;;
		'Hidden browser') $browser_cmd --incognito;;
		Email) $browser_cmd mail.protonmail.com/login;;
	'Play clipboard') mpv "$(xclip -o -selection clipboard)";;
	'Play downloads') mpv "$HOME/Downloads/tmp/$(ls ~/Downloads/tmp/ | dmenu -i -l 10 -p 'play')";;
		'Define') word=$(printf '' | dmenu -p 'word'); st -e sh -lc "dict \"$word\" | less";;
		'Package search')s=$(printf '' | dmenu -p 'name'); if [ -z "$s" ]; then exit; fi; st -t "Package $s" -e sh -lc "apt search $s | less";;
		'Package info')s=$(printf '' | dmenu -p 'name'); if [ -z "$s" ]; then exit; fi; st -t "Package $s" -e sh -lc "apt show $s | less";;
		Processes) st -t "Processes" -e htop;;
	esac
}

editor() {
	file=$(mru list | dmenu -i -l 10 -p 'edit what?')
	st -t 'Editor' -e vim "$file"
}

#Opening all mru files, not just for editing
opener() {
	sdfs
}

action() {
	action=$(printf "Toggle Music
	Pause Music
	Play Music
	Go page
	Command
	Command to clipboard
	Search github
	Search ddg
	Search godoc
	Select VPN
	Disable VPN
	Enable VPN
	VPN Status
	Rebind Keys
	Show calender
	Disable Bar
	Password
	Username
	Alternate password
	Download
	Enable Bar" | tr -d '\t' |
		dmenu -i -p "Actions")

case $action in
	'Play Music') mpc play ;;
	'Pause Music') mpc pause ;;
	'Toggle Music') mpc toggle ;;
	'Rebind Keys') setup-xbindkeys;;
	'Disable Bar') tmux set -g status off;;
	'Enable Bar') tmux set -g status on;;
	'Search github') github;;
	'Search godoc') godoc;;
	'Search ddg') ddg;;
	'Command') cmd;;
	'Command to clipboard') cmd_clip;;
	'Username') username;;
	'Password') password;;
	'Alternate password') other_password;;
	'Show calender') notify-send 'Calender' "\n\n$(cal)";;
	#This should check for an error code and confirm that download has started
	'Download') youtube-dl --no-progress -o "$HOME/Downloads/tmp/%(title)s.%(ext)s" "$(xclip -selection clipboard -o)"; notify-send -u low -t 3000 "Download complete";;
	'Go page') num=$(go_page); pages pager $num;;
esac
}

screenshot() {
	method=$(printf "clipboard
file
both" |
	dmenu -i -p "Screenshot")

	if [ $method = "file" ]; then
		scrot --note "-f 'LiterationSans Nerd Font Book/11' -x 10 -y 20 -c 255,0,0,255 -t 'Hi'"\
			-s ~/Pictures/screenshots/screenshot-%Y-%m-%d_$wx$h.png 
	fi

	if [ $method = "clipboard" ]; then
		scrot --note "-f 'LiterationSans Nerd Font Book/11' -x 10 -y 20 -c 255,0,0,255 -t 'Hi'"\
			-s ~/Pictures/screenshots/screenshot-%Y-%m-%d_$wx$h.png\
			-e "xclip $f; rm $f"
	fi

	if [ $method = "both" ]; then
		scrot --note "-f 'LiterationSans Nerd Font Book/11' -x 10 -y 20 -c 255,0,0,255 -t 'Hi'"\
			-s ~/Pictures/screenshots/screenshot-%Y-%m-%d_$wx$h.png\
			-e "xclip $f;"
	fi
}

search_type() {
	search_string="$(printf "New window\nBookmarks\nHistory" | dmenu -p "$1")"
	search_mode='tab'

	case "$search_string" in
		'New window') search_mode='window'; search_string=$(printf '' | dmenu -p "new $1");;
		'Bookmarks');;
		'History') ;;
		# *) printf "Invalid argument";;
	esac
	printf "$search_string|$search_mode"
}

brave_search() {
	search_prefix="$1"
	search_info="$(search_type "$2")"
	search_string=$(printf "$search_info" | cut -d'|' -f1)
	search_mode=$(printf "$search_info" | cut -d'|' -f2)
	if [ -z "$search_string" ]; then exit; fi
	new_string=$(rawurlencode "$search_string")
	search="$search_prefix$new_string"
	case "$search_mode" in 
		tab) $browser_cmd "$search";;
		window) $browser_new_cmd "$search";;
	esac
}

rawurlencode() {
	#Takes the first argument and encodes it
	search_string="$1"
	string_length=$(expr length "$search_string")
	char=''; new_string=''; 

	i=1
	while [ $i -le $string_length ]
	do
		char=$(expr substr "$search_string" $i 1)
		# new_string="$new_string$(rawurlencode "$char")"
		case "$char" in
			[-_.~a-zA-Z0-9] ) new_string="$new_string$char";;
				* ) new_string="$new_string%$(printf '%%%02x' "'$char")";;
		esac
		i=$(expr $i + 1)
	done
	printf "$new_string"
}

ddg() {
	brave_search "https://duckduckgo.com/?q=" "ddg"
}

github() {
	brave_search "https://github.com/search?q=" "github"
}

godoc() {
	brave_search "https://golang.org/pkg/" "godoc"
}

manual() {
	search=$(printf '' | dmenu -p 'manual')
	result=$(man "$search")
	printf "$result" | enscript -p - | ps2pdf - | zathura -
}

goinfo() {
	#Maybe this can also show recent searches
	search=$(printf "Window\nNotify" | dmenu -p 'goinfo')
	case $search in
		Window) search=$(printf '' | dmenu -p 'goinfo'); result=$(go doc "$search"); infowindow "$result"; exit;;
		Notify) search=$(printf '' | dmenu -p 'goinfo'); result=$(go doc "$search"); notify-send -u low -t 0 "Go documentation" "$result"; exit;;
	esac
	result=$(go doc "$search"); notify-send -u low -t 0 "Go documentation" "$result";
}

go_page() {
	name=$(printf "1\n2\n3\n4" | dmenu -p "page name")
	go doc "$(printf "" | dmenu -p 'go doc search')" > /tmp/pages-$name
	printf "$name"
}

infowindow() {
	printf "$1" | enscript -p - | ps2pdf - | zathura -
}

cmd() {
	c="$(printf '' | dmenu -i -p 'cmd')"
	output=$( $c )
	notify-send -u low 'command output' "$output"
}

cmd_clip() {
	value=$(cmd)
	show_value="$(expr substr "$value" 1 200)\n..."
	notify-send -u low -t 2000 "Items cliped" "$show_value"
	printf "%s" "$value" | xclip -selection clipboard
}

username() {
	account=$(find ~/.password-store/[!\.]* -type f |
		sed -e "s:$HOME/.password-store/::" -e "s:\.gpg::" |
		dmenu -p 'account')
	if [ -z "$account" ]; then exit; fi
	name=$(pass show "$account" | sed -n -e "s/^username: //p" |
		dmenu -p 'which username' | xclip -f -selection clipboard)
	if [ -z "$name" ]; then exit; fi
	notify-send -u low -t 2000 "username copied" "$account: $name"
}

password() {
	account=$(find ~/.password-store/[!\.]* -type f |
		sed -e "s:$HOME/.password-store/::" -e "s:\.gpg::" |
		dmenu -p 'which service')
	pass -c $account
	notify-send -u low -t 1000 'password copied' "Copied $account"

}

other_password() {
	account=$(find ~/.password-store/[!\.]* -type f |
		sed -e "s:$HOME/.password-store/::" -e "s:\.gpg::" |
		dmenu -p 'service')
	if [ -z "$account" ]; then exit; fi
	name=$(pass show "$account" | sed -n -e "s/^username: //p" |
		dmenu -p 'which user password')
	if [ -z "$name" ]; then exit; fi
	notify-send -u low -t 2000 "password copied" "$account: $name"

	#figure out range selections
	sed -n -e ""
}

edit_password() {
	account=$(find ~/.password-store/[!\.]* -type f |
		sed -e "s:$HOME/.password-store/::" -e "s:\.gpg::" |
		dmenu -p 'which service')
	if [ -z "$account" ]; then exit; fi
	error=$(st -e pass edit "$account" 2>&1)
	if [ -n "$error" ]; then notify-send -u low -t 3000 "password edit error" "$error"; fi
}

case $1 in
	launch) launch;;
	action) action;;
	cmd) action;;
	cmd_clip) cmd_clip;;
	ddg) ddg;;
	github) github;;
	godoc) godoc;;
	goinfo) goinfo;;
	username) username;;
	password) password;;
	other_password) other_password;;
	edit_password) edit_password;;
	*) printf "Invalid argument";;
esac