#!/bin/bash
#
#-----------------------------------------------------------------------------#
#           Group on Data Assimilation Development - GDAD/CPTEC/INPE          #
#-----------------------------------------------------------------------------#
#
#BOP
#
# !SCRIPT:  
#
# !DESCRIPTION:
#
# !CALLING SEQUENCE:
#     
#      ./runCycleV4.4.sh EXP LABELI LABELF TCIC NCIC 
#
#           o EXP         : Nome do dominio experimental, ex. SA
#           o LABELI      : Data da analise, ex. 201503060000
#           o TCIC        : Numero de minutos do ciclo, ex: 30
#           o NCIC        : Numero de ciclos (incluindo o tempo da análise), ex: 4
#           o FCST        : Tempo de previsao, em horas (ex. 24 [horas])
#
# !REVISION HISTORY:
#
# 30 Sept 2025 - Vendrasco, E. P. - Initial Version based on LMS
# 
# !REMARKS:
#
#EOP
#-----------------------------------------------------------------------------#
#BOC

mostraHelice() {
#   tput civis
   for i in / - \\ \|
   do
      echo -ne "\033[31;1m"
      echo -ne "\033[1D$i"
      echo -ne "\033[m"
      sleep .1
   done
#   tput cnorm
}

function WaitUntil(){
  local file
  local ciclo
  ciclo=${1}
  file=${2}

  echo " "
  echo -en "      > \033[35;1m    Aguardando finalizar o ciclo $ciclo    \033[m"

  while [ ! -e ${file} ] ; do
    sleep 0.33 | mostraHelice;
  done

  echo " "
}

function usage(){
   sed -n '/^# !CALLING SEQUENCE:/,/^# !/{p}' runCycleV4.4.sh | head -n 9
}

function diffdate(){

 di=${1}
 df=${2}

 si=$(date --date "${di:0:8} ${di:8:2}:${di:10:2}:${di:12:2}" +%s)
 sf=$(date --date "${df:0:8} ${df:8:2}:${df:10:2}:${df:12:2}" +%s)

 (( ddhoras = (sf - si )/3600 ))
 (( ddminutos = ( (sf - si ) - horas*3600 )/60 ))
 (( ddsegundos = (sf - si ) - horas*3600 - minutos*60 ))

 if [ $ddhoras    -lt 10 ]; then ddhoras='00'$ddhoras       ; fi
 if [ $ddminutos  -lt 10 ]; then ddminutos='00'$ddminutos   ; fi
 if [ $ddsegundos -lt 10 ]; then ddsegundos='00'$ddsegundos ; fi

 if [ $ddhoras    -ge 10 -a $ddhoras    -lt 100 ]; then ddhoras='0'$ddhoras       ; fi
 if [ $ddminutos  -ge 10 -a $ddminutos  -lt 100 ]; then ddminutos='0'$ddminutos   ; fi
 if [ $ddsegundos -ge 10 -a $ddsegundos -lt 100 ]; then ddsegundos='0'$ddsegundos ; fi

}

if [ $# -ne 5 ]; then
   usage
   exit 1
fi

NETCDF=${HOME}/Packages/netcdf4
HDF5=${HOME}/Packages/hdf5

export LD_LIBRARY_PATH=$NETCDF/lib:$HDF5/lib:$LD_LIBRARY_PATH

EXP=${1}
LABELI=${2}
TCIC=${3}; (( TCICh = TCIC / 60 ))
NCIC=${4}
FCST=${5}; (( FCSTm = FCST * 60 ))

LABELFF=$LABELI

init_off=180 ; (( init_offh = init_off / 60 ))

(( min_off = (NCIC-1) * TCIC ))
(( init = min_off + init_off ))

(( fcst = init_off / 60 ))
(( hor_off = min_off / 60 ))

LABELI=$(date --date "${LABELI:0:8} ${LABELI:8:4} $init       minutes ago" +%Y%m%d%H%M)
LABELF=$(date --date "${LABELI:0:8} ${LABELI:8:4} $init_off   minutes    " +%Y%m%d%H%M)

LABELS=${LABELF}

BASEDIR=${HOMEBE}/Opera
RUNDIR=${BASEDIR}/run
GFSDIR=${BASEDIR}/gfsdata
EXEDIR=${BASEDIR}/bin/V4.4
TBLDIR=${BASEDIR}/tables/V4.4
NMLDIR=${BASEDIR}/namelists
SCRDIR=${BASEDIR}/scripts
GEODIR=${BASEDIR}/geog/V4.4

echo
echo -e "\033[34;1m Ciclo - Inicio: ${LABELI} - Final: ${LABELFF} \033[m"

cic=0
while [ ${LABELI} -le ${LABELFF} ]; do

let cic++

EXPDIR=${RUNDIR}/${EXP}/${LABELI}

if [ $cic -eq 1 ]; then

  echo
  echo -e "   > \033[33;1mExecutando o Ciclo $cic de $NCIC \033[m"
  echo
  
  runstep1=1
  INTSEC=3600
  if [ $runstep1 -eq 1 ]; then
  echo -e "      > \033[32;1mExecutando o pre-processamento \033[m"
  ${SCRDIR}/runPreV4.4.sh $EXP $LABELI $init_off 1 $INTSEC 2>&1 | tee pid.log
  pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
  echo
  echo -e "      > \033[32;1mExecutando o modelo (aguardando o PID: $pid)\033[m"
  ${SCRDIR}/runModelV4.4.sh $EXP $LABELI $init_off 1 no $init_off $INTSEC 0 $pid 2>&1 | tee pid.log
  pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
  fi
  
  LABELI=$(date --date "${LABELI:0:8} ${LABELI:8:4} $init_off minutes" +%Y%m%d%H%M)
  LABELF=$(date --date "${LABELI:0:8} ${LABELI:8:4} $init_off minutes" +%Y%m%d%H%M)
  
  runstep2=1
  INTSEC=1800
  if [ $runstep2 -eq 1 ]; then
  echo
  echo -e "      > \033[32;1mExecutando o pre-processamento (aguardando o PID: $pid) \033[m"
  ${SCRDIR}/runPreV4.4.sh $EXP $LABELI $min_off 1 $INTSEC $pid 2>&1 | tee pid.log
  pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
  echo
  echo -e "      > \033[32;1mExecutando a assimilacao de dados (aguardando o PID: $pid) \033[m"
  ${SCRDIR}/runDAV4.4.sh $EXP $LABELI $LABELS 1 $init_off $pid 2>&1 | tee pid.log
  pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
  echo
  echo -e "      > \033[32;1mExecutando o modelo (aguardando o PID: $pid) \033[m"
  ${SCRDIR}/runModelV4.4.sh $EXP $LABELI $TCIC 1 no $TCIC $INTSEC 1 $pid 2>&1 | tee pid.log
  pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
  fi
  
  LABELI=$(date --date "${LABELI:0:8} ${LABELI:8:4} $TCIC minutes" +%Y%m%d%H%M)
  LABELF=$(date --date "${LABELI:0:8} ${LABELI:8:4} $TCIC minutes" +%Y%m%d%H%M)

 else

  echo
  echo -e "   > \033[33;1mExecutando o Ciclo $cic de $NCIC \033[m"
  echo
  
  if [ $cic -ne $NCIC ]; then
     runstep3=1
     if [ $runstep3 -eq 1 ]; then
     
     if [ -e ${EXPDIR} ]; then rm -rf ${EXPDIR} ; fi
     mkdir -p ${EXPDIR}/{runwps/logs,runwda/logs,runwrf/logs}

     echo -e "      > \033[32;1mExecutando a assimilacao de dados (aguardando o PID: $pid) \033[m"
     ${SCRDIR}/runDAV4.4.sh $EXP $LABELI $LABELS 1 $TCIC $pid 2>&1 | tee pid.log
     pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
     echo
     echo -e "      > \033[32;1mExecutando o modelo (aguardando o PID: $pid) \033[m"
     ${SCRDIR}/runModelV4.4.sh $EXP $LABELI $TCIC 1 no $TCIC $INTSEC 1 $pid 2>&1 | tee pid.log
     pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
     fi
     WaitUntil $cic ${EXPDIR}/runwrf/logs/wrf.ok
   else
     runstep4=1
     if [ $runstep4 -eq 1 ]; then

     if [ -e ${EXPDIR} ]; then rm -rf ${EXPDIR} ; fi
     mkdir -p ${EXPDIR}/{runwps/logs,runwda/logs,runwrf/logs}

     INTSEC=10800
     echo -e "      > \033[32;1mExecutando o pre-processamento (aguardando o PID: $pid) \033[m"
     ${SCRDIR}/runPreV4.4.sh $EXP $LABELI $FCSTm 1 $INTSEC $pid 2>&1 | tee pid.log
     pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
     echo
     echo -e "      > \033[32;1mExecutando a assimilacao de dados (aguardando o PID: $pid) \033[m"
     ${SCRDIR}/runDAV4.4.sh $EXP $LABELI $LABELI 1 $TCIC $pid 2>&1 | tee pid.log
     pid=$(cat pid.log | awk '{print $NF}' | tail  -1)
     echo
     echo -e "      > \033[32;1mExecutando o modelo (aguardando o PID: $pid) \033[m"
     ${SCRDIR}/runModelV4.4.sh $EXP $LABELI $FCSTm 1 no $TCIC $INTSEC 1 $pid 2>&1 | tee pid.log
     fi
  fi

  LABELI=$(date --date "${LABELI:0:8} ${LABELI:8:4} $TCIC minutes" +%Y%m%d%H%M)
  LABELF=$(date --date "${LABELI:0:8} ${LABELI:8:4} $TCIC minutes" +%Y%m%d%H%M)

fi

done
rm -f pid.log
#EOC
