#!/bin/sh -

# Images herein are assumed to be in */*.$sfx{,.gz,.Z}
# where the second "*" alone is a unique name for the image:
dir="${IMGBGDIR-/l/imgbg/default}"
sfx="${IMGBGSFX-`ls "$dir"/*/* | sed 's/.*\///; s/[^.]*.//; s/\..*//' |
		 sort | uniq -c | sort -nr | sed 's/^ *[0-9]* *//; 1q'`}"

rcf="${IMGBGRC-$HOME/.imgbgrc}"
see="${IMGBGVIEW-xv}"

lnk="${IMGBGLNK-$HOME/etc/img/imgbg%}"
case "$lnk" in
"$HOME/l/arc"*)	lnkdir=`echo "$lnk" | sed "s/.*\/l\/arc\///; s/\/[^\/]*$//"`
		lnkdir="$HOME/share/arc/$lnkdir"
		test -d "$lnkdir" || { mkdir -p "$lnkdir"; mkl; };;
esac

# imgbg - output or link to a specified or random background image
# Steve Kinzler, steve@kinzler.com, Sep 99/Apr 05/Jul 2011
# https://kinzler.com/me/home.html#x11

if echo "$sfx" | grep -s '[^a-zA-Z0-9_]' > /dev/null
then
	echo "$0: aborting, invalid suffix ($sfx)" 1>&2
	exit 2
fi

cwd=`pwd` || exit $?
cd "$dir" || exit $?

case "$1" in
-h|'')	cat << EOF 1>&2
usage: $0 { name | RANDOM | LIST | -v | -r } [ sym/link | tag ] ...
EOF
	exit 1;;

-v)	exec "$see" */*.$sfx*;;

-r)	test -f "$rcf" || rcf=/dev/null

	star='chop; s,^,*/, unless m,/,; s,$,.'"$sfx,"
	star="$star"'; $_ = "$_\n$_.Z\n$_.gz\n"'
	strip='s,.*/,,; s,\.'"$sfx"'.*,,'

	tmp=/tmp/ir$$
	tmpE=/tmp/irE$$
	tmpI=/tmp/irI$$
	trap "rm -f $tmp $tmpE $tmpI; exit" 0 1 2 13 15

	sed 's/[ 	]*#.*//; /^[ 	]*$/d;
	     s/^[	]*//; s/[ 	]*$//' "$rcf"	> $tmp
	ls `sed -n 's/^-[   ]*//p' $tmp | perl -pe "$star"`	   \
		2> /dev/null | perl -pe "$strip" | sort	> $tmpE
	ls `sed    '/^-/d'	   $tmp | perl -pe "$star"` NoSuCH \
		2> /dev/null | perl -pe "$strip" | sort	> $tmpI

	ls */*.$sfx */*.$sfx.Z */*.$sfx.gz 2> /dev/null | perl -pe "$strip" | 
	#cat - $tmpI | sort | comm -23 - $tmpE |	# exclude > include
	sort | comm -23 - $tmpE | cat - $tmpI | sort |	# include > exclude
	perl  -e '@_ = <>; print $_[int rand $#_ + 1]'

	exit;;
esac

name="$1"; shift

case "$name" in
LIST)	ls */*.$sfx */*.$sfx.Z */*.$sfx.gz 2> /dev/null |
	perl -pe "s,.*/,,; s,\.$sfx.*,," | sort; exit 0;;

RANDOM) rand=`$0 -r`
	file=`ls */"$rand".$sfx* | sed 1q`; rand=",$rand,";;
*)	file=`ls */"$name".$sfx* | sed 1q`;;
esac

case "$file" in
''|\**)	echo "$0: cannot find imgbg file in $dir ($name)" 1>&2; exit 2;;
esac

case $# in
0)	case "$file" in
	*.Z)	uncompress;;
	*.gz)	gunzip;;
	*)	cat;;
	esac < "$file"
	exit $?;;
esac

cd "$cwd" || exit $?

while :
do
	case $# in
	0)	break;;
	*)	symlink="$1"; shift;;
	esac

	case "$symlink" in
	*/*)	;;
	*)	symlink=`echo "$lnk" | sed "s/%/$symlink/g"`
	esac

	rm -f "$symlink.$sfx"
	echo "ln -s $dir/$file $symlink.$sfx"
	ln -s "$dir/$file" "$symlink.$sfx"

	case "$name,$#" in
	RANDOM,[1-9]*)	cd "$dir"
			while :	# we trust there's enough images to not make
			do	#   this a slow or infinite loop
				file=`$0 -r`
				case "$rand" in
				*,"$file",*)	;;
				*)		rand="$rand$file,"; break;;
				esac
			done
			file=`ls */"$file".$sfx* | sed 1q`
			cd "$cwd";;
	esac
done
