#!/usr/bin/ksh
. $WFU_PATH/global.site.ksh
#-------------------------------------------------------------------
# Script: wait_for_pfiles 
#
#
# Purpose: Indicate when all pfiles have been reconstructed within wait time frame.
#
# How it works: 
#
#	wait_for_pfiles [datadir] [batchdir] [pfile_success] [wait_hours]
#
#===================================================================
# C H A N G E   L O G
#
# 01/29/07  KLP  If no pfiles in datadir, check State in info files 
#                that match *epiflex*_4D.img files
#
#-------------------------------------------------------------------
#
# set verbose flag to:
#	 1 for feedback
#	 0 for no feedback
#
let verbose=1
#
# set pause interval between checks for reconstruction complete
#
let pause_seconds=60
#
# set input argument defaults
#
datadir=${1:-"."}
batchdir=${2:-"."}
pfile_success=${3:-"pfile_recon_complete"}
let wait_hours=${4:-3}
#
# assume ERROR (1) status
#
let status=1
#
# directories exist?
#
if (test -a $datadir && test -a $batchdir) then
	let waitsec=wait_hours*3600
	let elapsed=0
	while (test elapsed -lt waitsec) do
                ppattern=`echo "*.P?????"`
                ipattern=`echo "*.P?????.info"`
		npfiles=`ls -lst $datadir/$ppattern 2>/dev/null | wc -l`
                if (test $npfiles -eq 0) then
                    ppattern=`echo "*epiflex*_4D.img"`
                    ipattern=`echo "*epiflex*_4D.info"`
		    npfiles=`ls -lst $datadir/$ppattern 2>/dev/null | wc -l`
                fi
		if (test verbose -eq 1) then
			echo "pfiles  = $npfiles"
		fi
#
# at least one pfile in directory?
#
		if (test $npfiles -ge 1) then 
			nifiles=`ls -lst $datadir/$ipattern 2>/dev/null | wc -l`
			if (test verbose -eq 1) then
				echo "*.info  = $nifiles"
			fi
#	
# number of info files = number of pfiles in directory?
#
			if (test $nifiles -eq npfiles) then
				nstate2=`grep State $datadir/$ipattern 2>/dev/null | awk '{print $2}' | grep "2" | wc -l`
				if (test verbose -eq 1) then
					echo "errors  = $nstate2"
				fi
#
# stop whenever any info file reports error state 2
#
				if (test $nstate2 -gt 0) then
					break
				fi
#
				nstate3=`grep State $datadir/$ipattern 2>/dev/null | awk '{print $2}' | grep "3" | wc -l`
				if (test verbose -eq 1) then
					echo "skip    = $nstate3"
				fi
				nstate1=`grep State $datadir/$ipattern 2>/dev/null | awk '{print $2}' | grep "1" | wc -l`
				if (test verbose -eq 1) then
					echo "done    = $nstate1"
				fi
				if (test verbose -eq 1) then
					nstate0=`grep State $datadir/$ipattern 2>/dev/null | awk '{print $2}' | grep "0" | wc -l`
					echo "running = $nstate0"
				fi
#
# assign OKAY (0) exit status when all info files report status of 1 (done) or 3 (skip)
#		
				let nfinish=nstate1+nstate3
				if (test $nfinish -eq $npfiles) then
					let status=0 
				fi
			fi
		fi
#
# if all pfiles are not yet reconstructed,
# wait for the pause interval to expire and then continue checking
# 
		if (test status -eq 0) then
			break
		fi
		if (test verbose -eq 1) then
			echo "*******************" elapsed: $elapsed seconds
		fi
		sleep $pause_seconds
		let elapsed=elapsed+pause_seconds
	done
fi
#
if (test verbose -eq 1) then
	echo "*******************" elapsed: $elapsed seconds
fi
#
# on exit, create a success file if all pfiles have been reconstructed;
# otherwise, create a kill file to indicate either error or time out
#
if (test status -eq 0) then
	echo "Reconstruction complete\nElapsed time = $elapsed seconds" > $batchdir/$pfile_success
	if (test verbose -eq 1) then
		echo "*******************" exit: success
	fi
else
	echo "Reconstruction incomplete\nElapsed time = $elapsed seconds" > $batchdir/kill
	if (test verbose -eq 1) then
		echo "*******************" exit: failure
	fi
fi
exit $status
