#!/usr/bin/env python

import sys
import json
import logging
import argparse

from bibframe.reader.marcxml import bfconvert


#PREFIXES = {u'ma': 'http://www.loc.gov/MARC21/slim', u'me': 'http://www.loc.gov/METS/'}

def run(inputs=None, base=None, out=None, limit=None, rdfttl=None, rdfxml=None, config=None, verbose=False, mods=None):
    '''
    Basically takes parameters typical for command line invocation and adapts them for use in the API

    '''
    if config is None:
        config = {}
    else:
        config = json.load(config)

    logger = logging.getLogger('marc2bf')
    if verbose:
        logger.setLevel(logging.DEBUG)

    for mod in mods:
        __import__(mod, globals(), locals(), [])

    bfconvert(inputs=inputs, base=base, out=out, limit=limit, rdfttl=rdfttl, rdfxml=rdfxml, config=config, verbose=verbose, logger=logger)
    return


if __name__ == '__main__':
    #marc2bfrdf -v -o /tmp/lcout.json -s /tmp/lcout.stats.js scratch/unpacked/lc-sample-files-20120725.xml 2> /tmp/lcout.log
    #parser = argparse.ArgumentParser(prog="bootstrap", add_help=False)
    parser = argparse.ArgumentParser()
    parser.add_argument('inputs', type=argparse.FileType('r'), metavar='inputs', nargs='*',
                        help='One or more MARC/XML files to be parsed and converted to BIBFRAME RDF. If omitted use stdin')
    parser.add_argument('-o', '--out', type=argparse.FileType('w'), default=sys.stdout,
        help='File where raw Versa JSON output should be written'
             '(default: write to stdout)')
    parser.add_argument('-p', '--postout', metavar="IRI",
        help='HTTP endpoint for pushing or posting raw Versa JSON output'
             '(default: write to stdout)')
    parser.add_argument('--rdfttl', type=argparse.FileType('wb'),
        help='File where RDF Turtle output should be written')
    parser.add_argument('--rdfxml', type=argparse.FileType('wb'),
        help='File where RDF XML output should be written')
    parser.add_argument('-c', '--config', type=argparse.FileType('r'),
        help='File containing config in JSON format')
    #parser.add_argument('-s', '--stats', type=argparse.FileType('w'),
    #    help='file where statistics output should be written in JSOn format')
    parser.add_argument('-l', '--limit', metavar="NUMBER",
        help='Limit the number of records processed to this number. If omitted, all records will be processed.')
    parser.add_argument('-b', '--base', metavar="IRI", #dest="base",
        help='Base IRI to be used for creating resources.')
    parser.add_argument('--mod', metavar="PYMODULE", nargs="*", action='append',
        help='Python module to be imported in order to register plugins (can be specified multiple times.')
    parser.add_argument('-v', '--verbose', action='store_true',
        help='Whether to show additional messages and information')
    #
    args = parser.parse_args()
    args.mod = [i for items in args.mod or [] for i in items]

    run(inputs=args.inputs or sys.stdin, base=args.base, out=args.out, limit=args.limit, rdfttl=args.rdfttl, rdfxml=args.rdfxml, config=args.config, verbose=args.verbose, mods=args.mod)
    for f in args.inputs: f.close()
    if args.rdfttl: args.rdfttl.close()
    if args.rdfxml: args.rdfxml.close()
    args.out.close()

