#!/usr/bin/env python

# simple script to plot Band/Sub-Band quality from Rec35:28 in a T0x file

import argparse
parser = argparse.ArgumentParser(description='Plot Band/Sub-Band Quality')
parser.add_argument('filename', help='T04 filename')
parser.add_argument('-p','--png',
                    help='Generate PNG files in headless operation',action="store_true")
parser.add_argument('--bands',
                    help='List Bands to process (e.g., 0-11)',
                    default=None)
parser.add_argument('--sub_bands',
                    help='List Sub-Bands to process (e.g., 0-11)',
                    default=None)
parser.add_argument('--viewdat',
                    help='Additional arguments to pass to viewdat (e.g. -s=1000)',
                    default="")
args = parser.parse_args()

do_bands = None
if args.bands is not None:
    do_bands = [int(x) for x in args.bands.split(',')]

do_sub_bands = None
if args.sub_bands is not None:
    do_sub_bands = [int(x) for x in args.sub_bands.split(',')]

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

from mutils import *
from collections import defaultdict

def get_band_info(band,bands):
  if band == 0:
    if 6 in bands:
      info = 'LG1'
    else:
      info = 'LGB1'
  elif band == 1:
    info = 'LG2'
  elif band == 4:
    info = 'LE5'
  elif band == 5:
    info = 'E6'
  elif band == 6:
    info = 'B1'
  elif band == 11:
    info = 'S-band'
  else:
    info = 'Unknown'
  return info

def get_band_from_suband(subband,bands):
  if subband == 0 or subband == 1 or subband == 2:
    info = 0
  elif subband == 3:
    if 6 in bands:
      info = 6
    else:
      info = 0
  elif subband == 4 or subband == 5:
    info = 1
  elif subband == 6 or subband == 7:
    info = 4
  elif subband == 8 or subband == 9:
    info = 5
  elif subband == 10:
    info = 11
  else:
    info = -1
  return info

def get_sub_band_info(subband):
  if subband == 0:
    info = 'GPS L1-C/A'
  elif subband == 1:
    info = 'GPS L1 & Galileo E1'
  elif subband == 2:
    info = 'GLONASS G1 FDMA'
  elif subband == 3:
    info = 'Beidou B1'
  elif subband == 4:
    info = 'GPS L2'
  elif subband == 5:
    info = 'GLONASS G2 FDMA'
  elif subband == 6:
    info = 'GPS L5 & Galileo E5A'
  elif subband == 7:
    info = 'GLONASS G3 & Beidou B2'
  elif subband == 8:
    info = 'Galileo E6'
  elif subband == 9:
    info = 'Beidou B3'
  elif subband == 10:
    info = 'IRNSS S1-C/A'
  else:
    info = 'Unknown';
  return info;

if not 'd' in globals():
    if args.viewdat != "":
        print("Extra viewdat args:" + args.viewdat)
    d = vd2cls(args.filename,rec='-d35:28:3'+args.viewdat)

all_figs = {}
# How many bands & sub-bands
n_bands    = int(d[0][1]);
n_subbands = int(d[0][2]);

if n_bands <= 0 or n_subbands <= 0:
  parser.error("--No Band/Sub-Band to process")

#print(n_bands,n_subbands);

# Extract the RT bands and sub-bands
rt_bands = [0]*n_bands
for i in range(n_bands):
  rt_bands[i] = (int)(d[0][3+i*7])
#print(rt_bands)
sub_bands = [0]*n_subbands
for i in range(n_subbands):
  sub_bands[i] = (int)(d[0][3+n_bands*7+i*7])
#print(sub_bands)
for i in range(n_bands):
  if do_bands is not None and not rt_bands[i] in do_bands:
    continue
  desc = get_band_info(rt_bands[i],rt_bands)
  if desc in all_figs:
    fig1,(ax1,ax2) = all_figs[desc]
  else:
    fig1,(ax1,ax2) = subplots(2,sharex=True)
    fig1.suptitle('Band/Sub-Band Quality: '+desc)
    all_figs[desc] = (fig1,(ax1,ax2))
    ax1.set_ylabel('Band Quality')
    ax1.set_ylim([-1,6])
    ax1.grid();
    ax2.set_ylabel('Sub-Band Quality')
    ax2.set_ylim([-1,6])
    ax2.grid();
  ax1.plot( d[:,0], d[:,3+i*7+6], label=desc )
  ax1.legend(loc="upper right")

for i in range(n_subbands):
  if do_sub_bands is not None and not sub_bands[i] in do_sub_bands:
    continue
  rt_band = get_band_from_suband(sub_bands[i],rt_bands)
  desc = get_band_info(rt_band,rt_bands)
  sub_desc = get_sub_band_info(sub_bands[i])
  if desc in all_figs:
    fig1,(ax1,ax2) = all_figs[desc]
    ax2.plot( d[:,0], d[:,3+n_bands*7+i*7+6], label=sub_desc )
    ax2.legend(loc="upper right")
    ax2.set_xlabel('Time (GPS Sec)')

def finalize_fig(prefix,fig_info):
    for desc,(fig,ax) in fig_info.items():
        figure(fig.number)
        make_legend_interactive(fig)
        if args.png:
            desc = desc.replace(' ','_')
            desc = desc.replace('-','_')
            savefig('%s_%s.png'%(prefix,desc))

finalize_fig('Band_Quality', all_figs)

if not args.png:
    show()
