#!/usr/bin/env python
usage = """\
Get the relative percentage each signal is being tracked.  For
example, if a satellite tracks 1000 epochs of E1 but 500 epochs of
E5AltBOC, then we'll report 100% E1 and 50% E5AltBOC.
Important: signals with 0 epochs are ignored.

Example:
 ./count_relative_epochs.py "file*.T04"
"""
from mutils import *
from collections import defaultdict
import argparse
from glob import glob
import time
from datetime import timedelta
from colorama import Fore, Style

def parse_viewdat_summary(filename,elev_mask,thresh,verbose):
    data = RunCmdByLine('viewdat -i --elev_mask=%d %s'%
                        (elev_mask,
                         filename
                        ))
    summary = {}
    curr_sat = None
    while(True):
        line = data.readline()
        if line is None:
            break
        if line.startswith("Unknown option"):
            raise RuntimeError("Need newer viewdat?",line)
        if line in ['GPS','GLONASS','GALILEO','BEIDOU','SBAS','QZSS']:
            curr_sat = line
            summary[curr_sat] = defaultdict(list)
            if verbose: print("%s:"%curr_sat)
        elif line == '':
            curr_sat = None
        if curr_sat is None:
            continue
        words = line.split()
        if words[0] == 'SV':
            sv = int(words[1][:-1])
            max_epochs = 0
            epochs = defaultdict(float)
            for i in range(len(words)):
                paren_start = words[i].find('(')
                paren_end = words[i].find(')')
                if paren_start > 0:
                    if paren_end > 0:
                        n_epochs = int(words[i][paren_start+1:paren_end])
                    else:
                        n_epochs = int(words[i+1][:-1])
                    if n_epochs > max_epochs:
                        max_epochs = n_epochs
                    if n_epochs > 0:
                        epochs[words[i][:paren_start]] += n_epochs
            if verbose: print(" %2d: "%sv,end='')
            for k,v in epochs.items():
                summary[curr_sat][k].append([v/max_epochs,max_epochs])
                if verbose:
                    percent = 100*v/max_epochs
                    if percent >= thresh:
                        color = Fore.GREEN
                    else:
                        color = Fore.RED
                    print(" %3s %s%5.1f%s"%(k,color,percent,Style.RESET_ALL),end='')
            if verbose: print("")
    return summary


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=usage,
                                     formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('filename', help='T04 filename/pattern')
    parser.add_argument('--elev_mask',
                        help='Elevation mask [deg] (default 10)',
                        default=10,
                        type=int)
    parser.add_argument('-q','--quiet',
                        help='Hide per-SV info. Only show summary.',
                        action="store_true")
    parser.add_argument('--thresh',
                        help='Color items green above this percent (default 99.5)',
                        default=99.5,
                        type=float)
    args = parser.parse_args()

    if not args.filename.lower().endswith('t04'):
        raise RuntimeError("Only T04 supported for now")

    t1 = time.time()
    print("Processing %d file(s), elev mask %d°"%
          (len(glob(args.filename)),
           args.elev_mask
          ))
    summary = parse_viewdat_summary( args.filename, args.elev_mask,
                                     args.thresh, not args.quiet )

    print("")
    print("Summary:")
    for sat in summary.keys():
        print(" %10s: "%sat,end="")
        for sig in summary[sat].keys():
            sum_w_frac = 0.
            sum_weight = 0.
            for frac,weight in summary[sat][sig]:
                sum_w_frac += frac*weight
                sum_weight += weight
            percent = 100*sum_w_frac/sum_weight
            if percent >= args.thresh:
                color = Fore.GREEN
            else:
                color = Fore.RED
            print(" %3s %s%5.1f%s"%(sig,color,percent,Style.RESET_ALL),end="")
        print("")
    print("Elapsed time:",timedelta(seconds=time.time()-t1))
