#!python

'''
Usage:
    profilr --config <configfile> --job <job_name> --format <format> --datafile <file> [--params=<name:value>...] [--limit=<limit>]
    profilr --config <configfile> --list
'''

import os, sys
import json
from mercury.utils import parse_cli_params
from snap import snap, common
from mercury import datamap as dmap
from mercury import profiling as prf
import docopt


class Format(object):
    CSV = 'csv'
    JSON = 'json'


def main(args):

    configfile = args['<configfile>']
    if args['--list'] is True:
        yaml_config = common.read_config_file(configfile)
        print('\n'.join([job for job in yaml_config['jobs']]))
        return

    datafile = None
    stream_input = False
    
    datafile = args['<file>']

    if args['<format>'] == 'csv':
        intake_format = Format.CSV
    elif args['<format>'] == 'json':
        intake_format = Format.JSON
    else:
        print('Intake format "%s" not supported.' % args['--format'])
        return

    rec_source = None
    limit = -1
    if args.get('--limit'):
        limit = int(args['--limit'])

    field_delimiter = '|'

    user_params = parse_cli_params(args.get('--params') or [])

    if stream_input: # read input from stdin
        if intake_format == Format.CSV:
            rec_source = dmap.RecordSource(dmap.csvstream_record_generator,
                                           delimiter=field_delimiter,
                                           limit=limit)
        else:
            rec_source = dmap.RecordSource(dmap.json_record_generator,
                                          limit=limit)
    else: # read input from file        
        if intake_format == Format.CSV:
            rec_source = dmap.RecordSource(dmap.csvfile_record_generator,
                                           filename=datafile,                           
                                           delimiter=field_delimiter,
                                           limit=limit)
        elif intake_format == Format.JSON: 
            rec_source = dmap.RecordSource(dmap.json_record_generator,
                                           filename=datafile,
                                           limit=limit)

    target_job = args['<job_name>']
    yaml_config = common.read_config_file(configfile)
    service_registry = snap.initialize_services(yaml_config)

    profiler = prf.ProfilerFactory.create(target_job, yaml_config)
    profile_dict = profiler.profile(rec_source.records(), service_registry, **user_params)
    profile_dict['source_filename'] = datafile
    print(json.dumps(profile_dict))


if __name__ == '__main__':
    args = docopt.docopt(__doc__)
    main(args)