from glob import glob
from collections import OrderedDict

import math
import datetime

import numpy as np
import xml.etree.cElementTree as ET

dSBAS  = 0
dRTK   = 1
dDGNSS = 2

# This function scans all XML files output by the replay system. The goal is to 
# simply get the data from the latest test. The function is a quick hack from 
# the regression system, it is inefficient and could be vastly simplified by 
# just finding the latest XML files and parsing those!!!!!
def getStats(PVTType):
  datetimeformat = "%Y-%m-%d %H:%M:%S"
  start  = datetime.datetime.strptime("2018-01-01 00:00:00",datetimeformat)

  all_d = []
  request_desc = 'RTK'
  desired_test_type_is_RTK = True
  segment_name = 'All'
  for rx in range(10):
    all_files = glob("/net/fermion/mnt/data_drive/SpirentTest/OutputResults/RX%d-*.xml"%rx)
    if len(all_files) == 0:
      break
    for fileName in all_files:
      d = {}
      d['text'] = []
      d['x'] = []
      x = ET.parse(fileName).getroot()
      d['name'] = x.find('unit_desc').text
      d['test'] = x.find('test_desc').text
      d['file'] = fileName
      d['rxID'] = rx
      tmp = x.find('date').text
      if tmp is None:
        print('Error',fileName)

      testTime  = datetime.datetime.strptime(tmp,'%Y-%m-%d %H:%M:%S')
      delta = ((testTime - start).total_seconds()/86400)
      d['x'].append(delta+1)
      d['text'].append(fileName.split('/')[-1])
      d.setdefault('segments',OrderedDict())
      # Every data set has 'All' - make sure it shows up first
      d['segments'].setdefault('All',{})

      for seg in x.findall('segment'):
        if(seg.find('type').text == 'All'):
          if seg.find('len').text == '0':
            continue
          seg_name = seg.find('type').text
          seg_len = seg.find('len').text
          d['segments'].setdefault(seg_name,{})
          d['segments'][seg_name].setdefault('len',[]).append(seg_len)
          for cdf in seg.findall('cdf'):
            percent = cdf.find('p').text
            e2d = '%.3f' % float(cdf.find('e2d').text)
            e3d = '%.3f' % float(cdf.find('e3d').text)
            d['segments'][seg_name].setdefault('2d',{})
            d['segments'][seg_name].setdefault('3d',{})
            d['segments'][seg_name]['2d'].setdefault(percent,{})
            d['segments'][seg_name]['3d'].setdefault(percent,{})
            d['segments'][seg_name]['2d'][percent].setdefault('y',[]).append(e2d)
            d['segments'][seg_name]['3d'][percent].setdefault('y',[]).append(e3d)
          all_d.append(d)
          break


      # Some receivers also provide DGNSS
      d.setdefault('dgnss',OrderedDict())
      d['dgnss'].setdefault('All',{})

      for seg in x.findall('dgnss_segment'):
        if(seg.find('type').text == 'All'):
          if seg.find('len').text == '0':
            continue
          seg_name = seg.find('type').text
          seg_len = seg.find('len').text
          d['dgnss'].setdefault(seg_name,{})
          d['dgnss'][seg_name].setdefault('len',[]).append(seg_len)
          for cdf in seg.findall('cdf'):
            percent = cdf.find('p').text
            e2d = '%.3f' % float(cdf.find('e2d').text)
            e3d = '%.3f' % float(cdf.find('e3d').text)
            d['dgnss'][seg_name].setdefault('2d',{})
            d['dgnss'][seg_name].setdefault('3d',{})
            d['dgnss'][seg_name]['2d'].setdefault(percent,{})
            d['dgnss'][seg_name]['3d'].setdefault(percent,{})
            d['dgnss'][seg_name]['2d'][percent].setdefault('y',[]).append(e2d)
            d['dgnss'][seg_name]['3d'][percent].setdefault('y',[]).append(e3d)
          all_d.append(d)
          break


  tests = [d['test'] for d in all_d] 
  # Get a unique list of the tests
  dataSets = list(set(tests))
  dataSets.sort()
  #print(dataSets)

  latest = []
  MaxRX = 6
  for rx in range(MaxRX):
    latest.append({})
    latest[rx]['rx'] = [None]*len(dataSets)
    latest[rx]['test'] = [None]*len(dataSets)
    latest[rx]['y2d_95'] = [None]*len(dataSets)
    latest[rx]['y3d_95'] = [None]*len(dataSets)
    latest[rx]['y2d_99'] = [None]*len(dataSets)
    latest[rx]['y3d_99'] = [None]*len(dataSets)
    latest[rx]['y2d_100'] = [None]*len(dataSets)
    latest[rx]['y3d_100'] = [None]*len(dataSets)
    latest[rx]['time'] = [None]*len(dataSets)

  if(PVTType == dDGNSS):
    dataType = 'dgnss'
  else:
    dataType = 'segments'

  for i in range(len(dataSets)):
    for rx in range(MaxRX):
      for j in range(len(all_d)):
        if((all_d[j]['rxID'] == rx) and (all_d[j]['test'] == dataSets[i])):
          dirName  = all_d[j]['test'].split(':')[0]
          rxStr = all_d[j]['name']
          latest[rx]['test'][i] = dirName.split('/')[1][:-4]

          if(all_d[j][dataType]['All']):
            # 95%
            str2D95 = all_d[j][dataType]['All']['2d']['95']['y'][0]
            latest[rx]['y2d_95'][i] = np.float(str2D95)
            str3D95 = all_d[j][dataType]['All']['3d']['95']['y'][0]
            latest[rx]['y3d_95'][i] = np.float(str3D95)
            
            # 99%
            str2D99 = all_d[j][dataType]['All']['2d']['99']['y'][0]
            latest[rx]['y2d_99'][i] = np.float(str2D99)
            str3D99 = all_d[j][dataType]['All']['3d']['99']['y'][0]
            latest[rx]['y3d_99'][i] = np.float(str3D99)
        
            # 100%
            str2D100 = all_d[j][dataType]['All']['2d']['100']['y'][0]
            latest[rx]['y2d_100'][i] = np.float(str2D100)
            str3D100 = all_d[j][dataType]['All']['3d']['100']['y'][0]
            latest[rx]['y3d_100'][i] = np.float(str3D100)
          else:
            latest[rx]['y2d_95'][i]  = 0
            latest[rx]['y3d_95'][i]  = 0
            latest[rx]['y2d_99'][i]  = 0
            latest[rx]['y3d_99'][i]  = 0
            latest[rx]['y2d_100'][i] = 0
            latest[rx]['y3d_100'][i] = 0

          latest[rx]['time'][i] = all_d[j]['x']
          latest[rx]['rx'][i] = rxStr
        else:
         continue


  return(latest)

if __name__ == "__main__":
  print(getStats(dRTK))



