import argparse

from . import filelist_from_patterns
from .parproc import processing_loop


def parallel_test_run(parse, options):
    def pysearch(pattern):
        if pattern.endswith('.py'):
            return pattern
        else:
            if not pattern.endswith('/'):
                pattern += '/'
            if '**' not in pattern:
                pattern += '**/'
            return pattern + '*.py'

    try:
        patterns = [pysearch(p) for p in options.patterns]
        filenames = filelist_from_patterns(
            patterns, sizesort=options.sort, ignore=options.ignore,
        )

        kwargs = vars(options)
        kwargs.pop('patterns', None)
        kwargs.pop('sort', None)
        kwargs.pop('ignore', None)
        parallel = not kwargs.pop('serial', False)

        return processing_loop(parse, filenames, parallel=parallel, **kwargs)

    except KeyboardInterrupt:
        if options.verbose:
            raise


def parse_args():
    argparser = argparse.ArgumentParser(
        prog=__package__,
        # description=DESCRIPTION,
        add_help=False,
    )

    argparser.add_argument(
        'patterns', nargs='+', metavar='PATTERNS', help='filename patterns',
    )
    argparser.add_argument(
        '--help', '-h', help='show this help message and exit', action='help',
    )
    argparser.add_argument(
        '--ignore',
        '-i',
        metavar='PATTERN',
        help='ignore these patterns',
        action='append',
    )
    argparser.add_argument(
        '--sort', '-s', help='sort files by size', action='store_true',
    )
    argparser.add_argument(
        '--serial', '-S', help='do not run in parallel', action='store_true',
    )
    argparser.add_argument(
        '--trace',
        '-t',
        help='produce verbose output for a parse',
        action='store_true',
    )
    argparser.add_argument(
        '--verbose',
        '-v',
        help='output exceptions as they happen',
        action='store_true',
    )
    argparser.add_argument(
        '--exitfirst',
        '-x',
        help='output exceptions as they happen',
        action='store_true',
    )
    return argparser.parse_args()


def generic_main(parse):
    return parallel_test_run(parse, parse_args())
