#!/bin/bash

# this script has been written to run on La Palma on the machine data
#   i.e. paths are only working on this machine

source `dirname $0`/../Sourcefile.sh
printprocesslog "INFO starting "$0

logfile=$runlogpath"/ZipRawLP-"$datetime".log"
date >> $logfile

if ! ls /daq/raw >/dev/null 2>&1
then 
   printprocesslog "ERROR /daq/raw is not available."
   finish
fi

# get dates
if [ "$certaindate" != "" ]
then
   getdates $certaindate
else
   # get all night
   #getdates "all"
   # get last 3 nights if hour between 7 and 19h, else only current night
   getdates 3 7 19
fi

# not needed anymore as ftools are not used anymore
## setup to use ftools
#source $HEADAS/headas-init.sh

# files younger than $delaytime are not processed
delaytime=5

# do rsync for rawfiles of these dates
for date in ${dates[@]}
do 
   echo "" >> $logfile 2>&1
   rawdir=/daq/raw/$date
   echo `date`": processing files in "$rawdir >> $logfile 2>&1
   printprocesslog "INFO processing files in "$rawdir
   #echo "INFO processing files in "$rawdir
   # check if data are available from that night
   if ! [ -d $rawdir ]
   then
      echo `date`": no data available in "$rawdir >> $logfile 2>&1
      printprocesslog "INFO no data available in "$rawdir
      continue
   fi

   # find all fits-files starting with the oldest file
   echo `date`": finding files to be zipped in $rawdir..." >> $logfile 2>&1
   printprocesslog "INFO finding files to be zipped in "$rawdir"..."
   fitsfiles=`find $rawdir -type f -regex '.*[.]fits[.]?[g]?[f]?[z]?' | sort `

   if [ ${#fitsfiles[@]} -eq 0 ]
   then
      echo `date`": no files to be zipped in $rawdir..." >> $logfile 2>&1
      printprocesslog "INFO no files to be zipped in "$rawdir"..."
      continue
   fi

   zipdir=/loc_data/zipraw/$date
   # create output directory for zip
   makedir $zipdir >> $logfile 2>&1

   # loop to zip files
   echo `date`": zipping files in $rawdir..." >> $logfile 2>&1
   printprocesslog "INFO zipping files in "$rawdir"..."
   for file in $fitsfiles
   do
      # check if more than ~ 10 GB are left on /loc_data
      diskusage=( `df -P /loc_data | grep /loc_data ` )
      if [ ${diskusage[3]} -lt 10000000 ] 
      then
         echo "WARN less than 10 GB left on /loc_data on data " >> $logfile 2>&1
         printprocesslog "WARN less than 10 GB left on /loc_data on data "
         finish
      fi
      
      # check if raw file was accessed in the last $delaytime minutes
      isnew=`find $file -amin -$delaytime`
      if [ "$isnew" != "" ]
      then
         echo $file" is not older than $delaytime min => continue" >> $logfile 2>&1
         printprocesslog "INFO "$file" is not older than $delaytime min => continue"
         continue
      fi

      iszipped=`echo $file | grep -o fz`
      if [ "$iszipped" == "fz" ]
      then
         # treat already compressed files
         printprocesslog "DEBUG treat compressed file "$file

         # filename for file on data
         zipfile=`echo $file | sed -e 's/daq/loc_data/g' -e 's/raw/zipraw/' `
         zipfiletmp=`echo $file | sed -e 's/daq/loc_data/g' -e 's/raw/zipraw/' -e 's/fits.fz/fits.fz.tmp/'`
         # check if file on data already exists
         if [ -e $zipfile ]
         then
            continue
         fi

         echo `date`": copying "$file" to "$zipfile" ..." >> $logfile 2>&1
         printprocesslog "INFO copying "$file" to "$zipfile" ..."
         #echo "INFO zipping "$file" to "$zipfile" ..."
         # read setup again to allow for updates of variables defining transfer
         source `dirname $0`/../Sourcefile.sh
         # zip file to stdout and pipe it to outputfile
         echo "pv --rate-limit $limitpigz $file > $zipfiletmp" >> $logfile 2>&1
         pv --rate-limit $limitpigz $file > $zipfiletmp
         statuspv=$?
         printprocesslog "DEBUG pvstatus:"$statuspv
         echo " pvstatus:"$statuspv >> $logfile 2>&1
         if [ $statuspv -eq 0 ] 
         then
            # if successful, move temporary to final zipfile
            printprocesslog "INFO move "$zipfiletmp" to "$zipfile" ..."
            mv -v $zipfiletmp $zipfile >> $logfile 2>&1
         else
            # if not successful, remove temporary zipfile
            printprocesslog "WARN pv failed (statuspv:"$statuspv")."
            echo "WARN pv failed (PIPESTATUS:"$statuspv")." >> $logfile 2>&1
            printprocesslog "INFO remove "$zipfiletmp"..."
            rm -v $zipfiletmp >> $logfile 2>&1
            finish
         fi
      else
         # treat uncompressed files
         printprocesslog "DEBUG treat uncompressed file "$file

         # filename for temporary and final zipfile
         zipfile=`echo $file | sed -e 's/daq/loc_data/g' -e 's/raw/zipraw/' -e 's/fits/fits.gz/'`
         zipfiletmp=`echo $file | sed -e 's/daq/loc_data/g' -e 's/raw/zipraw/' -e 's/fits/fits.tmp.gz/'`
         # check if zipped file already exists
         if [ -e $zipfile ]
         then
            continue
         fi

         echo `date`": zipping "$file" to "$zipfile" ..." >> $logfile 2>&1
         printprocesslog "INFO zipping "$file" to "$zipfile" ..."
         #echo "INFO zipping "$file" to "$zipfile" ..."
         # read setup again to allow for updates of variables defining transfer
         source `dirname $0`/../Sourcefile.sh
         # zip file to stdout and pipe it to outputfile
         echo "pv --rate-limit $limitpigz $file | pigz -1 -c -f -p $numprocpigz > $zipfiletmp" >> $logfile 2>&1
         pv --rate-limit $limitpigz $file | pigz -1 -c -f -p $numprocpigz > $zipfiletmp
         statuspigz=( `echo ${PIPESTATUS[@]}` )
         printprocesslog "DEBUG PIPESTATUS:"${statuspigz[@]}
         echo " PIPESTATUS:"${statuspigz[@]} >> $logfile 2>&1
         if [ ${statuspigz[0]} -eq 0 ] && [ ${statuspigz[1]} -eq 0 ]
         then
            # if successful, move temporary to final zipfile
            printprocesslog "INFO move "$zipfiletmp" to "$zipfile" ..."
            mv -v $zipfiletmp $zipfile >> $logfile 2>&1
         else
            # if not successful, remove temporary zipfile
            printprocesslog "WARN pigz or pv failed (PIPESTATUS:"${statuspigz[@]}")."
            echo "WARN pigz or pv failed (PIPESTATUS:"${statuspigz[@]}")." >> $logfile 2>&1
            printprocesslog "INFO remove "$zipfiletmp"..."
            rm -v $zipfiletmp >> $logfile 2>&1
            finish
         fi
      fi
   done
done
echo "finished zipping..." >> $logfile 2>&1
finish
