#!/bin/bash
#
# Primitive helper script, scanning for occurences of @string/_<foobar> and R.string._<foobar>, 
# which are translatable strings in RxDroid. All values not defined in res/values/strings.xml will
# be echoed in copy-'n-pastable XML. 
#

source "$(dirname $_)/shared.sh"

require-grep-P

PATTERNS="@string/_\w* R.string._\w*"
TEMP=$(mktempf)

scan_file()
{
	for p in $PATTERNS; do
		for t in $(grep -o -P $p $1 | grep -o -P '_\w*'); do
			echo $t >> $TEMP
		done
	done

}

scan_dir()
{
	for f in $1/*.{java,xml}; do
		if [[ -f "$f" ]]; then
			scan_file $f
		fi
	done

	for d in $1/*; do
		if [[ -d "$d" ]]; then
			scan_dir "$d"
		fi
	done
}

scan_string_xml()
{
	for f in src/main/res/values/strings.xml src/main/res/values-{de,it,el}/strings.xml; do
		[[ -e $f ]] || continue

		echo "-- $f:"

		for t in $(cat $TEMP | sort | uniq); do
			local dir=$(basename $(dirname $f))

			if [[ $dir != "values" ]]; then

				if ! grep -q $t src/main/res/values/strings.xml && grep -q $t "$f"; then
					echo >&2
					echo "!!! Resource R.string.$t exists in $f but not in res/values/strings.xml" >&2
					echo "!!! This is known to cause exceptions in Context.getString()" >&2
					echo "!!! Affected files: "
					echo >&2

					grep --include=*.{xml,java} -R -l "$t" src/main/java src/main/res | grep -v "$f"

					exit 1
				fi
			fi

			if ! grep -q $t $f; then
				if [[ $dir == "values" ]]; then
					echo "<string name=\"$t\"> !!EMPTY!! </string>"
				else
					grep "\"$t\"" src/main/res/values/strings.xml | sed -e 's/^[[:blank:]]*//'
				fi
			fi
		done

		echo
	done
}

scan_dir src/main/java
scan_dir src/main/res
scan_file src/main/AndroidManifest.xml

scan_string_xml

rm $TEMP
