import matplotlib
# Allow running headless from the command line
matplotlib.use("agg")

import math
import os
import datetime
import argparse
import sys;
import json;

from pylab import *
import numpy as np
import mutils as m

systems = 20
freqs   = 20
signals = 50
svType  = 2 # Geo / Non-GEO
today = True

def findSysIndex(sysNum):
  for i in range(len(sysType)):
    if(sysType[i] == sysNum):
      return (i)

  return None

sysData = [ {"sysName":"GPS", "sys":0, "start":1, "stop":32},
            {"sysName":"SBAS", "sys":1, "start":120 , "stop":158},
            {"sysName":"GLONASS", "sys":2, "start":1 , "stop":24},
            {"sysName":"GALILEO", "sys":3,"start":1 , "stop":36},
            {"sysName":"QZSS", "sys":4, "start":193 , "stop":202},
            {"sysName":"IRNSS", "sys":9, "start":1 , "stop":14},
            {"sysName":"BDS", "sys":10, "start":1 , "stop":63} ]

sysName = [ key['sysName'] for key in sysData]
sysType = [ key['sys'] for key in sysData]


maxSys = 0
for i in range(len(sysData)):
  if(sysData[i]['sys'] > maxSys):
    maxSys = sysData[i]['sys'] 

maxSys += 1
sysLUT = [0 for x in range(maxSys)]
for i in range(len(sysData)):
  sysLUT[sysData[i]['sys']] = sysData[i]['start']

# Override pylab find() to avoid deprecation warning
# pylint: disable=function-redefined
def find(x):
  return where(x)[0]

MaxNumSVs = 0
for i in range(len(sysData)):
  delta = 1 + sysData[i]['stop'] - sysData[i]['start']

  if(delta > MaxNumSVs):
    MaxNumSVs = delta

print(MaxNumSVs)


######################################################################
# Parse arguments
parser = argparse.ArgumentParser(description='Extracts slip information from a T04 file')
parser.add_argument('-f','--file', help='Parse a single file - provide the filename --file myFile.T04')
parser.add_argument('-d','--date', help='Optional start date year,month,day e.g. --date YYYY,MM,DD')
args = parser.parse_args()
######################################################################

if(args.date):
  if(args.file):
    print("Can't add a date if you provide a file for processing")
    sys.exit(1)
  date = args.date.split(",")
  today = False

if(args.file):
  MaxRX = 1
else:
  # Load the JSON file 
  with open('receivers.json', 'r') as f:
    receivers = json.load(f)

  MaxRX = len(receivers['receivers'])

thisDay = datetime.datetime.now()

for rx in range(MaxRX):
  if(today == True):
    #start  = datetime.datetime.now()
    # The NoPi files aren't available until the following day so get
    # yesterday's date
    start = thisDay - datetime.timedelta(days=1)
    num = 1
  else:
    start = datetime.datetime(int(date[0]),int(date[1]),int(date[2]),0,0,0)
    stop  = datetime.datetime.now()
    delta = ((stop-start).total_seconds()/86400)
    num = int(math.ceil(delta))

  if(args.file):
    RXStr = '.'
    checkExt = False
  else:
    checkExt = True
    RXData = receivers['receivers'][rx]['RXDir']
    RXStr  = receivers['receivers'][rx]['RXStr']
    Ext  = receivers['receivers'][rx]['ext']
    downloadType  = receivers['receivers'][rx]['sys']
    if('oldExt' in receivers['receivers'][rx]):
      OldExt  = receivers['receivers'][rx]['oldExt']
      OldDate = receivers['receivers'][rx]['oldDate']

    if(not os.path.exists(RXStr)):
      os.makedirs(RXStr)

  print(checkExt)
  for index in range(num):
    day   = start.day
    month = start.month
    year  = start.year

    print(checkExt)
    if(checkExt):
      # Some data sets have changed format overtime (e.g. from T02 to T04).
      # If this has occurred there will be an "oldExt" and an "oldDate" 
      # which define what the old file type was and when the transition occurred.
      # Check for this and change the extension time if we are before
      # the transition date.
      if('oldExt' in receivers['receivers'][rx]):
        YearOld  = int(OldDate[0:4])
        MonthOld = int(OldDate[4:6])
        DayOld   = int(OldDate[6:8])
        pivot = datetime.datetime(YearOld,MonthOld,DayOld)
        if((start-pivot).days < 0):
          Ext = OldExt

    start = start + datetime.timedelta(days=1)

    YYYYMMDD =  str(year) + str(month).zfill(2) + str(day).zfill(2) 
    if(args.file):
      filename = args.file
      resPrefix = filename.split('.')[-2]
    else:
      resPrefix = YYYYMMDD
      if(downloadType  == "NoPi"):
        # Get the data from a NoPi directory
        filename  = "/net/daffy/mnt/data_drive/GNSSResults/" + str(year) + "/"
        filename +=  YYYYMMDD + "/" + RXData + "_" + YYYYMMDD + "." + Ext
      elif(downloadType  == "Concat"):
        filename = resPrefix + '.' + Ext
        os.system('rm ' + filename)
        print('cat '+ RXData + '*' + str(year) + str(month).zfill(2) + str(day).zfill(2) + '*.' + Ext + ' >> ' + filename)
        os.system('cat '+ RXData + '*' + str(year) + str(month).zfill(2) + str(day).zfill(2) + '*.' + Ext + ' >> ' + filename)
      elif(downloadType  == "CODownload"):
        RemoteFilename = str(year) + '_' + str(month).zfill(2) + '_' + str(day).zfill(2) + '.' + Ext
        os.system('wget ftp://'+ RXData + str(year) + '/' + str(month).zfill(2) + '/' + RemoteFilename)
        filename = RXStr + '/' + YYYYMMDD + '.' + Ext
        os.system('mv ' + RemoteFilename + ' ' + filename)
      else:
        # Path is absolute
        filename = RXData + "/" + YYYYMMDD + "." + Ext

    print(filename)

    num   = [[[[[0 for t in range(MaxNumSVs)] for s in range(svType)] for x in range(signals)] for y in range(freqs)] for z in range(signals)]
    slips = [[[[[0 for t in range(MaxNumSVs)] for s in range(svType)] for x in range(signals)] for y in range(freqs)] for z in range(signals)]
    num30   = [[[[[0 for t in range(MaxNumSVs)] for s in range(svType)] for x in range(signals)] for y in range(freqs)] for z in range(signals)]
    slips30 = [[[[[0 for t in range(MaxNumSVs)] for s in range(svType)] for x in range(signals)] for y in range(freqs)] for z in range(signals)]

    if(os.path.isfile(filename) and (os.path.getsize(filename) > 0)):
      (ref,k)=m.vd2arr(filename,rec='-d27',opt=['--dec=1000'])

      if((not args.file) and (downloadType  == "Concat")):
        os.system('rm ' + filename)

      # Get the master antenna only
      i = find( ref[:,k.ANTENNA] == 0)
      sys   = ref[i,k.SAT_TYPE]
      freq  = ref[i,k.FREQ]
      sig   = ref[i,k.TRACK]
      sv    = ref[i,k.SV]
      elev  = ref[i,k.EL]
      slip_flg = ref[i,k.SLIP_FLG]

      print(RXStr)

      for i in range(len(sys)):
        x = int(sys[i])
        y = int(freq[i])
        z = int(sig[i])
        thisSV = int(sv[i]) - sysLUT[x]

        # GEO test for BeiDou - ignore the temp GEO at 17 (no longer active)
        if( (x == 10) and ( (sv[i] <= 5) or (sv[i] >= 59))):
          s = 1
        else:
          s = 0
        num[x][y][z][s][thisSV] = num[x][y][z][s][thisSV] + 1
        if(elev[i] > 30):
          num30[x][y][z][s][thisSV] = num30[x][y][z][s][thisSV] + 1

        if(slip_flg[i]):
          slips[x][y][z][s][thisSV] = slips[x][y][z][s][thisSV] + 1
          if(elev[i] > 30):
            slips30[x][y][z][s][thisSV] = slips30[x][y][z][s][thisSV] + 1

      for x in range(systems):
        for y in range(freqs):
          for z in range(signals):
            for s in range(svType):
              slipSum = 0
              slipSum30 = 0
              numSum = 0
              numSum30 = 0
              for t in range(MaxNumSVs):
                slipSum += slips[x][y][z][s][t]
                slipSum30 += slips30[x][y][z][s][t]
                numSum += num[x][y][z][s][t]
                numSum30 += num30[x][y][z][s][t]
                
                if(num[x][y][z][s][t] > 0):
                  # Output per satellite info
                  fid = open(RXStr + "/slips." + str(x) + "." + str(y) + "." + str(z) + "." + str(s) + ".SV" + str(t + sysLUT[x]) + ".txt","a")
                  fid.write("%d %d %d %d %d %d %d %d\n" % (year,month,day,x,y,z,slips[x][y][z][s][t],num[x][y][z][s][t]))
                  fid.close()
                  fid = open(RXStr + "/slips30." + str(x) + "." + str(y) + "." + str(z) + "." + str(s) + ".SV" + str(t + sysLUT[x]) + ".txt","a")
                  fid.write("%d %d %d %d %d %d %d %d\n" % (year,month,day,x,y,z,slips30[x][y][z][s][t],num30[x][y][z][s][t]))
                  fid.close()
              # Now output the sum for this satellite / signal type
              if(numSum > 0):
                fid = open(RXStr + "/slips." + str(x) + "." + str(y) + "." + str(z) + "." + str(s) + ".txt","a")
                fid.write("%d %d %d %d %d %d %d %d\n" % (year,month,day,x,y,z,slipSum,numSum))
                fid.close()
                fid = open(RXStr + "/slips30." + str(x) + "." + str(y) + "." + str(z) + "." + str(s) + ".txt","a")
                fid.write("%d %d %d %d %d %d %d %d\n" % (year,month,day,x,y,z,slipSum30,numSum30))
                fid.close()
      print('Completed ',YYYYMMDD)


