#!/bin/sh
# Copyright (C) 2016 Richard Burke, ISC licensed
# shellcheck disable=SC2317
set -e

vc_fatal() {
	echo "$@" >&2
	exit 1
}

vc_usage() {
	vc_fatal "Usage: $(basename "$0") [--selection sel] [--usable|--copy|--paste]

Copy/paste clipboard interface with support on all provided platforms.

Options:
    --copy       copy text from standard input
    --paste      paste text to standard output
    --usable     silently exit with a status code indicating if a supported
                 clipboard implementation was found
    --selection  take input from sel. valid options: clipboard, primary"
}

vc_determine_command() {
	if [ -n "$WAYLAND_DISPLAY" ]; then
		for c in wl-copy wl-paste; do
			if command -v "$c" >/dev/null 2>&1; then
				echo "wlclipboard"
				return 0
			fi
		done

		for c in waycopy waypaste; do
			if command -v "$c" >/dev/null 2>&1; then
				echo "wayclip"
				return 0
			fi
		done
	fi

	if [ -n "$DISPLAY" ]; then
		for c in xclip xsel; do
			if command -v "$c" >/dev/null 2>&1; then
				echo "$c"
				return 0
			fi
		done
	fi

	if command -v pbcopy >/dev/null 2>&1; then
		echo 'mac'
		return 0
	fi

	if command -v wslclip >/dev/null 2>&1; then
		echo 'wsl'
		return 0
	fi

	if [ -c /dev/clipboard ]; then
		echo 'cygwin'
		return 0
	fi

	return 1
}

vc_usable() {
	if vc_determine_command >/dev/null 2>&1; then
		exit 0
	fi

	exit 1
}

vc_copy() {
	COPY_CMD="$(vc_determine_command 2>/dev/null)"

	# shellcheck disable=SC2181
	if [ $? -ne 0 ] || [ -z "$COPY_CMD" ]; then
		vc_fatal 'System clipboard not supported'
	fi

	"vc_${COPY_CMD}_copy"

	exit $?
}

vc_paste() {
	PASTE_CMD="$(vc_determine_command 2>/dev/null)"

	# shellcheck disable=SC2181
	if [ $? -ne 0 ] || [ -z "$PASTE_CMD" ]; then
		vc_fatal 'System clipboard not supported'
	fi

	"vc_${PASTE_CMD}_paste"

	exit $?
}

vc_wlclipboard_copy() {
	if [ "$sel" = "primary" ]; then
		wl-copy --primary -t TEXT 2>/dev/null
	else
		wl-copy -t TEXT 2>/dev/null
	fi
}

vc_wlclipboard_paste() {
	if [ "$sel" = "primary" ]; then
		wl-paste --no-newline --primary -t text
	else
		wl-paste --no-newline -t text
	fi
}

vc_wayclip_copy() {
	if [ "$sel" = "primary" ]; then
		waycopy -p 2>/dev/null
	else
		waycopy 2>/dev/null
	fi
}

vc_wayclip_paste() {
	if [ "$sel" = "primary" ]; then
		waypaste -p
	else
		waypaste
	fi
}

vc_xsel_copy() {
	xsel --"$sel" -i
}

vc_xsel_paste() {
	xsel --"$sel" -o
}

vc_xclip_copy() {
	xclip -selection "$sel" -i >/dev/null 2>&1
}

vc_xclip_paste() {
	xclip -selection "$sel" -o
}

vc_mac_copy() {
	pbcopy
}

vc_mac_paste() {
	pbpaste
}

vc_wsl_copy() {
	wslclip
}

vc_wsl_paste() {
	wslclip -g
}

vc_cygwin_copy() {
	cat >/dev/clipboard
}

vc_cygwin_paste() {
	cat /dev/clipboard
}

while [ $# -gt 0 ]; do
	case "$1" in
		--usable) fn=vc_usable;;
		--copy) fn=vc_copy;;
		--paste) fn=vc_paste;;
		--selection)
			shift
			if [ "$1" != "clipboard" ] && [ "$1" != "primary" ]; then
				vc_fatal "Invalid selection: $1\nValid options are 'clipboard' or 'primary'"
			fi
			sel="$1";;
		*) vc_usage;;
	esac
	shift
done

sel=${sel:-"clipboard"} $fn

vc_usage
