#!python
import argparse
import json
import sys
import os
import logging
import glob
from ejplugins import load_all_parsers
from jsonextended import plugins

logger = logging.getLogger()


def run(paths=None, outpath=None, extension=None, overwrite=False, log_level="info"):
    """run program"""
    root = logging.getLogger()
    root.handlers = []  # remove any existing handlers
    root.setLevel(logging.DEBUG)
    stream_handler = logging.StreamHandler(sys.stdout)
    stream_handler.setLevel(getattr(logging, log_level.upper()))
    formatter = logging.Formatter('%(levelname)8s: %(module)10s: %(message)s')
    stream_handler.setFormatter(formatter)
    stream_handler.propogate = False
    root.addHandler(stream_handler)

    logger.info("loading plugins")
    plugins.load_builtin_plugins()
    load_all_parsers()

    for path_glob in paths:
        for path in glob.glob(path_glob):
            logger.info("converting: {}".format(path))
            try:
                output = plugins.parse(path)
                basename = os.path.basename(path)
                dirname = os.path.dirname(path) if outpath is None else outpath
                newpath = os.path.join(dirname, basename+"."+extension)
                if not os.path.exists(newpath) or overwrite:
                    if os.path.exists(newpath):
                        logger.info("overwriting: {}".format(newpath))
                    else:
                        logger.info("writing to: {}".format(newpath))
                    with open(newpath, "w") as f:
                        json.dump(output, f, indent=2, default=plugins.encode)
                else:
                    logger.info("skipping (already exists): {}".format(newpath))
            except Exception as err:
                logger.error("{0}".format(path))
                logger.error("{0}".format(err))


class ErrorParser(argparse.ArgumentParser):
    """
    on error; print help string
    """
    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self.print_help()
        sys.exit(2)

if __name__ == "__main__":

    parser = ErrorParser(
        description='convert one or more files using the ejplugins'
    )
    parser.add_argument("paths", type=str, nargs='+',
                        help='paths to convert, can contain wildcards (*, ?, [])', metavar='filepath')
    parser.add_argument("-o", "--outpath", type=str, metavar='str',
                        help='path to output to', default=None)
    parser.add_argument("-ow", "--overwrite", action="store_true",
                        help="whether to overwrite existing files")
    parser.add_argument("-ext", "--extension", type=str, metavar='str',
                        help='new extension for output files', default="json")
    parser.add_argument("-log", "--log-level", type=str, default='info',
                        choices=['debug', 'info', 'warning', 'error'],
                        help='the logging level to output to screen/file')
    args = parser.parse_args()
    options = vars(args)
    run(**options)

