#! /usr/bin/env python3
################################################################################
# Script Name: tcutil_interpolate.py
# Authors: NECP/EMC Hurricane Project Team and UFS Hurricane Application Team
# Abstract:
#   This script can interplate or extrapolate to generate TCvitals at different
#   time levels.
################################################################################
import logging, os, sys, re, functools
import produtil.setup
import tcutil.numerics, tcutil.revital

def main(args):
    """!Set up logging, reads vitals, outputs storm list."""

    # Set up logging, disable dbn alerts:
    produtil.setup.setup(send_dbn=False,ologlevel=99,jloglevel=99,
                         eloglevel=logging.INFO)
    logger=logging.getLogger('tcutil_interpolate.py')
    file_pre=args[1]
    file_aft=args[2]
    option=int(args[3]) # 0 for interpolate, 1 for extrapolate

    lines_pre=list()
    caseid_pre=list()
    lines_aft=list()
    caseid_aft=list()
    with open(file_pre,'rt') as f:
      for line in f.readlines():
        temp = line.split()
        lines_pre.append(temp)
    with open(file_aft,'rt') as f:
      for line in f.readlines():
        temp = line.split()
        lines_aft.append(temp)

    for storms in lines_pre:
      caseid_pre.append(storms[1])
    for storms in lines_aft:
      caseid_aft.append(storms[1])
    count=0
    for sid_pre in caseid_pre:
      for sid_aft in caseid_aft:
        if sid_pre == sid_aft:
          count=count+1
    if count < 1:
      print("FATAL ERROR! No storm is not consistently existing with 6 hours")
      sys.exit(1)
    for sid_pre in range(len(caseid_pre)):
      for sid_aft in range(len(caseid_aft)):
        if caseid_pre[sid_pre] == caseid_aft[sid_aft]:
          item_pre=lines_pre[sid_pre][:]
          item_aft=lines_aft[sid_aft][:]
          fout=list()
          for sid in range(len(item_pre)):
            if item_pre[sid] == item_aft[sid]:
              fout.append(item_pre[sid])
            else:
              if sid == 5 or sid == 6:
                value_pre=item_pre[sid]
                value_aft=item_aft[sid]
                if sid == 5:
                  if option == 0:
                    value=(int(value_pre[:3])+int(value_aft[:3]))/2
                  else:
                    value=(int(value_aft[:3])-int(value_pre[:3]))/2+int(value_aft[:3])
                  fout.append(str('%3.3d'%int(value+0.5))+value_pre[3])
                else:
                  if option == 0:
                    value=(int(value_pre[:4])+int(value_aft[:4]))/2
                  else:
                    value=(int(value_aft[:4])-int(value_pre[:4]))/2+int(value_aft[:4])
                  fout.append(str('%4.4d'%int(value+0.5))+value_pre[4])
              else:
                if sid == 18:
                  if option == 0:
                    fout.append(item_pre[sid])
                  else:
                    fout.append(item_aft[sid])
                else:
                  if option == 0:
                    value=(int(item_pre[sid])+int(item_aft[sid]))/2
                  else:
                    value=(int(item_aft[sid])-int(item_pre[sid]))/2+int(item_aft[sid])
                  fout.append(str(int(value+0.5)))
          print("%-4s %3s %-9s %8s %4s %4s %5s %3.3d %3.3d %4.4d %4.4d %4.4d %2.2d %3.3d %4d %4d %4d %4d %s"%(fout[0],fout[1],fout[2],fout[3],fout[4],fout[5],fout[6],int(fout[7]),int(fout[8]),int(fout[9]),int(fout[10]),int(fout[11]),int(fout[12]),int(fout[13]),int(fout[14]),int(fout[15]),int(fout[16]),int(fout[17]),fout[18]))
    return fout

if __name__=='__main__': main(sys.argv)