#!/usr/bin/python3 -s
# -*- coding: utf-8 -*-

import sys
import optparse
import jsonschema
import yaml
from ytools import optiondefaults, validate, dump, __version__

def main(argv):
    optparser = optparse.OptionParser(prog = argv[0],
        usage='Usage: %prog [OPTION] -p JSONPATH_EXPRESSION FILE...',
        version='%s %s' % ("%prog", __version__),
        description = "Dumps data from json (or yaml) documents in yaml format. Command line wrapper for jsonpath-ng. Find more information at https://github.com/yaccob/ytools")
    optparser.add_option('-p', '--json-path', dest='path', default='$', help="Syntax for jsonpath expression: https://pypi.python.org/pypi/jsonpath-ng/1.4.2")
    optparser.add_option('-f', '--output-format', metavar='OUTPUTFORMAT', dest='format', choices=['yaml', 'json', 'python'], default='yaml', help='Output format. Can be "yaml", "json" or "python". [default: %default]')
    optparser.add_option('-y', '--yaml-options', dest='yaml_options', default=optiondefaults['yaml'], help="kwargs for yaml.dump (pyYaml) as yaml.mapping (for experts). [default: '%default']")
    optparser.add_option('-j', '--json-options', dest='json_options', default=optiondefaults['json'], help="kwargs for json.dumps as yaml.mapping (for experts). [default: '%default']")
    optparser.add_option('-v', '--validate', metavar='SCHEMA', dest='schema', help="Validate documents against json-schema")
    optparser.add_option('--encoding', dest='encoding', default='utf-8', help="Set encoding of input documents (if different from utf-8)")
    opts, datafiles = optparser.parse_args(argv[1:])
    try:
        if opts.schema:
            validate(opts.schema, datafiles, encoding=opts.encoding)
        del(opts.__dict__["schema"])
        dump(datafiles, **opts.__dict__)
    except jsonschema.exceptions.ValidationError, e:
        sys.stderr.write("%s: %s\n" % (e.filename, e.message))
        sys.stderr.write("  document-path: %s\n" % (list(e.absolute_path)))
        sys.stderr.write("  schema-path:   %s\n" % (list(e.absolute_schema_path)))
        sys.exit(1)
    except yaml.scanner.ScannerError, e:
        sys.stderr.write("%s\n" % e)

if __name__ == '__main__':
    main(sys.argv)
