#!/bin/bash
#   Calculates statistics for po files/branches
#   Copyright (C) 2005 Greek KDE l10n Team.
#   Written by Spiros Georgaras <sngeorgaras@otenet.gr>, 2005.
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2, or (at your option)
#   any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software Foundation,
#   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#

function statPO(){
msgfmt --statistics "$1" -o /dev/null 2>~/trans.tmp
TRANSLATED=`sed 's|^\(.*\) translated.*|\1|' ~/trans.tmp`
FUZZY=`sed 's|^.*, \(.*\) fuzzy.*|\1|' ~/trans.tmp`
UNTRANSLATED=`sed 's|^.*, \(.*\) untranslated.*|\1|' ~/trans.tmp`
if [ ${#TRANSLATED} -gt 5 ];then TRANSLATED=0;fi
if [ ${#FUZZY} -gt 5 ];then FUZZY=0;fi
if [ ${#UNTRANSLATED} -gt 5 ];then UNTRANSLATED=0;fi
rm ~/trans.tmp
TOTAL=$TRANSLATED
TOTAL=$((TOTAL + $FUZZY))
TOTAL=$((TOTAL   + $UNTRANSLATED ))
if [ $TOTAL -eq 0 ];then ERROR='true';fi
}

function statPOT(){
msgfmt --statistics "$1" -o /dev/null 2>~/trans.tmp
UNTRANSLATED=`sed 's|^.*, \(.*\) untranslated.*|\1|' ~/trans.tmp`
if [ ${#UNTRANSLATED} -gt 5 ];then UNTRANSLATED=0;fi
rm ~/trans.tmp
TRANSLATED=0
FUZZY=0
TOTAL=$UNTRANSLATED
}

function printFileStats(){
printf "%5d" $TOTAL
echo -n " total, "
printf "%5d" $TRANSLATED
echo -n " translated, "
printf "%5d" $FUZZY
echo -n " fuzzy, "
printf "%5d" $UNTRANSLATED
echo -n " untranslated - "
echo $(basename "$1")
}

function printFilesStats(){
if [ "$ERROR" = "true" ];then
	printf "%6s  " '-'
	printf "%7s  " '-'
	printf "%7s  " '-'
	printf "%7s   " '-'
	echo -n $(basename "$1")
	echo " (file has errors!!!)"
	ERROR=''
else
	printf "%6d  " $TOTAL
	printf "%7d  " $TRANSLATED
	printf "%7d  " $FUZZY
	printf "%7d   " $UNTRANSLATED
	if [ "$2" = "y" ];then
		if [ "$TOTAL" = "$TRANSLATED" ];then
			echo -n "* "
		fi
	fi
	echo $(basename "$1")
fi
}

function printTotalStats(){
if [ "$PERCENT" = "no" ];then
echo "----------------------------------"
printf "%6d  " $TTOTAL
printf "%7d  " $TTRANSLATED
printf "%7d  " $TFUZZY
printf "%7d  " $TUNTRANSLATED
echo " $(basename "$1")"
fi
PTRANSLATED=`echo "scale=2; 100 * $TTRANSLATED / $TTOTAL" | bc`
PFUZZY=`echo "scale=2; 100 * $TFUZZY / $TTOTAL" | bc`
PUNTRANSLATED=`echo "scale=2; 100 * $TUNTRANSLATED / $TTOTAL" | bc`


if [ "$PERCENT" = "no" ];then
	printf "%6s  %7s  %7s  %7s   (%%)\n\n" "100.00" $PTRANSLATED $PFUZZY $PUNTRANSLATED
else
	if [ "$ERROR" = "true" ];then
		printf "%7s  %7s  %7s   %s (module has errors!!!)\n" $PTRANSLATED $PFUZZY $PUNTRANSLATED $(basename "$1")
		ERROR=''
	else
		if [ "$WHOLE_NAME" = "true" ];then
			printf "%7s  %7s  %7s   %s\n" $PTRANSLATED $PFUZZY $PUNTRANSLATED $(echo "$1" | sed 's|^\./||')
		else
			printf "%7s  %7s  %7s   %s\n" $PTRANSLATED $PFUZZY $PUNTRANSLATED $(basename "$1")
		fi
	fi
fi
}

function folderStats(){
	if [ "$1" = "." ];then
		FOLDER="$PWD"
	else
		FOLDER="$1"
		cd "$FOLDER"
	fi
	dummy=$(ls *.po 2>/dev/null)
	if [ -z "$dummy" ];then
		if [ -z "$MODE" ];then
			echo "The folder \"$FOLDER\" contains no po files..."
			echo
			exit 1
		else
			cd "$POS"
			return
		fi
	fi
	if [ "$PERCENT" = "no" ];then
	echo "Statistics of $(echo $FOLDER | sed 's|/./|/|')

 Total    Trans    Fuzzy     Untr   File name"
	fi
	TTOTAL=0
	TTRANSLATED=0
	TFUZZY=0
	TUNTRANSLATED=0
	POS="$PWD"
	MODULE=`basename "$POS"`
	
	if `isInStable "$POS"`
	then
		cd "$POT_STABLE"
	else
		cd "$POT_TRUNK"
	fi
	if [ -d "$MODULE" ];then
	cd "$MODULE"
	
	for n in *pot
	do
		po=`echo "$n" | sed 's/t$//'`
		if [ -e "$POS"/"$po" ];then
# 			statPO "$n"
			statPO "$POS"/"$po"
			TTRANSLATED=$((TTRANSLATED + $TRANSLATED))
			TFUZZY=$((TFUZZY + $FUZZY))
			TUNTRANSLATED=$((TUNTRANSLATED + $UNTRANSLATED))
			if [ "$PERCENT" = "no" ];then printFilesStats "$POS"/"$po" "$SHOW_ASTRIX";fi
		else
			statPOT "$n"
			TUNTRANSLATED=$((TUNTRANSLATED + $UNTRANSLATED))
			if [ "$PERCENT" = "no" ];then printFilesStats "$n" "$SHOW_ASTRIX";fi
		fi
	done
		TTOTAL=$((TTOTAL + $TTRANSLATED))
		TTOTAL=$((TTOTAL + $TFUZZY))
		TTOTAL=$((TTOTAL + $TUNTRANSLATED))
		printTotalStats "$FOLDER"
	else
	        printf "%7s  " '0'
		printf "%7s  " '0'
	        printf "%7s   " '0'
	        echo $(basename "$1")
	fi
	cd "$POS"
}


function help(){
echo "A script to display po file statistics"
echo -n "Usage: "
echo -n "$(basename "$0") <po file>    or
       $(basename "$0") [options] <po folder>

Valid options are:
"
echo "  -a<branch>  print statistics for a whole branch"
echo "  -f          force execution. No checks will be executed"
echo "  -h          print this help screen and exit"
echo "  -p          print only percentage"
echo "  -x          don't display asterisc for translated files"
echo "  -n          execute no sanity checks"
echo "  -h          display this screen and exit"
echo
echo "Valid options for the <branch> parameter:
head/trunk -- Display statistics for trunk
stable     -- Display statistics for stable
kstable    -- Display stable branch statistics only for the modules that
              are shown in the stable statistics page of i18n server
2stable    -- Display trunk branch statistics only for the modules that
              are shown in the stable statistics page of i18n server
t2s        -- Display trunk branch statistics only for the modules
              that exist in the stable branch
"
}
#############   Script starts here   #############
#
# Copy this to all scripts
if [ -e "$HOME"/.l10n.conf ];then
	. "$HOME"/.l10n.conf
	if [ -z "$installFolder" ];then
		echo `basename "$0"`"> Error: parameter installFolder not set..."
		echo `basename "$0"`"> Please edit ~/.l10n.conf"
		echo
		exit 1
	fi
	if [ ! -d "$installFolder" ];then
		echo `basename "$0"`"> Error: $installFolder (parameter installFolder)"
		echo  `basename "$0"`"         Does not exist or is not a folder"	
		echo `basename "$0"`"> Please edit ~/.l10n.conf"
		echo
		exit 1
	fi
	if [ ! -r "$installFolder" ];then
		echo `basename "$0"`"> Error: $installFolder (parameter installFolder)"
		echo `basename "$0"`"          No read permission to this folder"
		echo `basename "$0"`"> Please edit ~/.l10n.conf"
		echo
		exit 1
	fi
	. "$installFolder"/l10n-common
	parceConfig
	errorDetected=$?
else
	echo `basename "$0"`"> Error: ~/.l10n.conf - Not found"
	echo "A sample l10n.conf file can be found at
ftp://ftp.i18n.kde.org/teams/el/scripts"
	echo
	exit 1
fi
# End copy
#


SHOW_ASTRIX="y"
PERCENT="no"
MODE=''
while getopts ":hxpva:fwn" Option
do
	case $Option in
			h ) # Show help
			#man gfl
			help
			exit 0;;
			x )
				SHOW_ASTRIX='';;
			n) # run no checks
				runCheck=false;;
			a )
				MODE="$OPTARG"
				if [ "$MODE" = "head" ] || [ "$MODE" = "trunk" ] || [ "$MODE" = "stable" ] || [ "$MODE" = "kstable" ] || [ "$MODE" = "t2s" ] || [ "$MODE" = "2stable" ] || [ -d "$MODE" ];then
					PERCENT="yes"
					if [ "$MODE" = "t2s" ];then T2S='yes';fi
					if [ "$MODE" = "2stable" ];then ToStable='yes';fi
				else
						help
						exit 0
				fi;;
			f )
				NOCHECK='y';;
			p )
				PERCENT="yes";;
			w)
				WHOLE_NAME="true";;
			v) # show version
			showVersion 'S. Georgaras <sngeorgaras@otenet.gr>'
			echo
			exit 0
	esac
done
shift $(($OPTIND - 1))

# check that bc is installed
if [ -z "$NOCHECK" ];then
	CHECK=`bc --version 2>/dev/null| wc -l`
	if [ $CHECK -ne 2 ];then
		echo "You don't seem to have bc installed."
		echo "Install the package bc and try again."
		echo
		echo "If you are sure bc is installed,"
		echo "try using the -f option"
		exit 1
	fi
fi
if [ "$1" = "." ];then MODE='';fi
if [ "$MODE" = '' ];then
	if [ $# -eq 0 ];then
		help
		exit 1
	fi
	if [ -d "$1" ];then
		folderStats "$1"
	else
		num=$(echo "$1" |grep -e 'po$')
		if [ -z "$num" ];then
			echo "\"$1\" is not a po file..."
			echo
			exit 1
		fi
		statPO "$1"
		echo " Total    Trans     Fuzzy    Untr   File name"
		printFilesStats "$1"
		if [ $TOTAL -gt 0 ];then
			PERCENT="yes"
			TTOTAL=$TOTAL
			TTRANSLATED=$TRANSLATED
			TFUZZY=$FUZZY
			TUNTRANSLATED=$UNTRANSLATED
			echo -n "100.00  "
			printTotalStats '(%)'
		fi
	fi
else

	if [ "$MODE" = "head" ] || [ "$MODE" = "trunk" ] || [ "$MODE" = "t2s" ] || [ "$MODE" = "2stable" ];then
		cd "$PO_TRUNK"
	elif [ "$MODE" = "stable" ] || [ "$MODE" = "kstable" ];then
		cd "$PO_STABLE"
		if [ "$MODE" = "kstable" ];then KSTABLE='yes';fi
	else
		for k in "$MODE"/*;do
  		if [ -d "$k" ];then
  			FOLDER_FOUND='y'
				dummy=$(ls "$k"/*.po 2>/dev/null)
				if [ $? -eq 1 ];then
					echo "All folders under $MODE"
					echo "must contain po files..."
					exit 1
				fi
			fi
		done
		if [ -z "$FOLDER_FOUND" ];then
			echo "No po folders found under $MODE"
			exit 1
		fi
		cd "$MODE"
	fi
	echo "  Trans     Untr    Fuzzy   Module"
	if [ "$T2S" = "yes" ];then
	# find stable modules and calculate them in trunk
		for k in "$PO_STABLE"/*;do
			if [ -d "$k" ];then
				z=`basename "$k"`
				if [ -d "$z" ];then
					folderStats "$PWD"/"$z"
					ATRANSLATED=$((ATRANSLATED + $TTRANSLATED))
					AFUZZY=$((AFUZZY + $TFUZZY))
					AUNTRANSLATED=$((AUNTRANSLATED + $TUNTRANSLATED))
					cd ..
				fi
			fi
		done
	elif [ "$ToStable" = "yes" ] || [ "$KSTABLE" = "yes" ];then
		for n in `echo "$kdeModules"`;do
					folderStats "$n"
					ATRANSLATED=$((ATRANSLATED + $TTRANSLATED))
					AFUZZY=$((AFUZZY + $TFUZZY))
					AUNTRANSLATED=$((AUNTRANSLATED + $TUNTRANSLATED))
					cd ..
		done
	else
		for z in *
		do
			if [ -d "$z" ];then
				folderStats "$z"
				ATRANSLATED=$((ATRANSLATED + $TTRANSLATED))
				AFUZZY=$((AFUZZY + $TFUZZY))
				AUNTRANSLATED=$((AUNTRANSLATED + $TUNTRANSLATED))
				cd ..
			fi
		done
	fi
	ATOTAL=$((ATOTAL + $ATRANSLATED))
	ATOTAL=$((ATOTAL + $AFUZZY))
	ATOTAL=$((ATOTAL + $AUNTRANSLATED))
	PTRANSLATED=`echo "scale=2; 100 * $ATRANSLATED / $ATOTAL" | bc`
	PFUZZY=`echo "scale=2; 100 * $AFUZZY / $ATOTAL" | bc`
	PUNTRANSLATED=`echo "scale=2; 100 * $AUNTRANSLATED / $ATOTAL" | bc`
	echo "-------------------------"
	printf "%7s  %7s  %7s   Total\n\n" $PTRANSLATED $PFUZZY $PUNTRANSLATED
fi
