#!python

def one_line_warning(message, category, filename, lineno, line=None):
    return " {}:{}: {}:{}\n".format(filename, lineno, category.__name__, message)

def brief_warning(message, category, filename, lineno, line=None):
    return "*{}\n".format(message)

def main():

    import warnings
    import argparse, platform, sys, signal, importlib
    import threading, time

    import blupants

    # Parse command line
    parser = argparse.ArgumentParser(
        description='blupants (version {})'.format(blupants.version()),
        add_help = False,
        formatter_class = argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('-h', '--help', default=False,
                        action='store_true',
                        help='show this help message and exit')
    parser.add_argument('-m', '--module',
                        type=str, default='blupants_client',
                        help='web client module')
    parser.add_argument('-v', '--verbose',
                        type=int, default=1,
                        help='level of verbosity')

    try:
        args = parser.parse_args()
    except:
        print()
        parser.print_help()
        sys.exit(0)

    # help?
    if args.help:
        parser.print_help()
        sys.exit(0)

    # verbose_level
    verbose_level = args.verbose

    # default module
    module = args.module

    # Modify warnings
    if verbose_level > 2:
        pass # standard formating
    elif verbose_level > 1:
        # one liner
        warnings.formatwarning = one_line_warning
    else:
        # brief
        warnings.formatwarning = brief_warning

    # set verbose level
    blupants.verbose(verbose_level)


    # Initiate
    print('blupants (version {})'.format(blupants.version()))

    if verbose_level > 0:

        print("\nType 'blupants -h' for more options\n")

        print('> Options:')
        print('    Verbose level: {}\n'.format(verbose_level))

    # run server in a separate thread
    thread = threading.Thread(target=blupants.run(args.module))
    thread.start()

    try:

        if verbose_level > 0:
            print(' done')

        print("> Hit Ctrl-C to exit")

        # Wait forever
        thread.join()

    except KeyboardInterrupt:
        # Catch Ctrl-C
        pass

    finally:

        # shutdown server
        blupants.shutdown()
        thread.join()

        # say bye
        print("\n> Goodbye!")

if __name__ == "__main__":

    main()
