#!/usr/bin/python3

# import cProfile

from ektools import actions
from ektools import warn, error, parse, index

def process(df, verbose=False, filters=[], actions=[]):
    '''Process an indexed Simrad RAW file by applying a set of actions'''
    count = 0
    for pos, t, l, bstr in df:
        if verbose:
            print(f'Datagram {count}:\t{pos}\t{l}\t{t}')
        count += 1
        if actions:
            if filters == [] or any(f(pos,t,l) for f in filters):
                try:
                    obj = parse(bstr)
                    for a in actions:
                        a(obj)
                except IOError: # e.g., broken pipe
                    exit(0)
                except Exception as e:
                    warn(f'Don\'t know how/failure to parse datagram of type {t}\n   Exception: {e}')

    # signal end
    for a in actions:
        a(None)

if __name__ == '__main__':

    import argparse

    p = argparse.ArgumentParser(description='Extract information from Simrad RAW files.')
    p.add_argument('-t', '--type',  default=[], action='append', help='only apply to given datagram types')
    p.add_argument('-l', '--list',  action='store_true', help='output datagram contents extensively')
    p.add_argument('-s', '--summarize', action='store_true', help='summarize datagrams')
    p.add_argument('-q', '--quiet', action='store_true', help='produce minimal output')
    p.add_argument('-c', '--check', action='store_true', help='check datagram contents for consistency')
    p.add_argument('-r', '--rawdump', action='store_true', help='dump pickled raw datagrams')
    p.add_argument('FILE', nargs='+', help='input files in RAW format.')
    args = p.parse_args()
    
    myactions = []

    if args.list:
        if args.quiet:
            error('Please specify at most one of -l and -q')
            exit(-1)
        else:
            myactions.append(actions.showdict)
    if args.rawdump:
        myactions = [actions.rawdump()] # override previous
        args.quiet = True
        if args.list: warn("Ignoring '-l' because '-r' was specified.")

    fs = []
    if args.type: fs.append(actions.filtertype(args.type))

    if args.check:     myactions.append(actions.checkdate())
    if args.summarize: myactions.append(actions.summarize())
    
    for f in args.FILE:
        # print(f)
        d = index(f)
        # cProfile.run("process(d, verbose=not args.quiet, actions=actions, filters=fs)")
        process(d, verbose=not args.quiet, actions=myactions, filters=fs)
