#!/usr/bin/env python
'''ipktgen uses traffic model files and a user sessions file to
generate packets on a device, using the device operating system
networking stack.'''

from __future__ import print_function
import os
import datetime
import logging
import argparse
from argparse import SUPPRESS
from ipktgen.genpackets import Genpackets

LOGGER = logging.getLogger()
LOGGER.setLevel(logging.DEBUG)

def parse_args():
    
    parser = argparse.ArgumentParser(add_help=False)
    required = parser.add_argument_group('required arguments')
    optional = parser.add_argument_group('optional arguments')
    optional.add_argument('-h', '--help', action='help', default=SUPPRESS,
                          help='show this help message and exit')
    optional.add_argument("-v", "--verbose", action="store_true")
    required.add_argument("-a", "--appmodel", required=True,
                        help="specify app model file")
    required.add_argument("-u", "--usersessions", required=True,
                        help="specify net model file")
    grp = optional.add_mutually_exclusive_group(required=True)
    grp.add_argument("-c", "--client", action="store_true")
    grp.add_argument("-s", "--server", action="store_false")
    optional.add_argument('-o', '--outdir', default=os.getcwd(),
                        help='specify output directory to save logs')
    optional.add_argument('-m', '--modeltype', dest='modeltype',
                        default='Generic', choices=['Type1', 'Type2',
                                                    'Type3', 'Type4' ],
                        help='modeling method to use for generating'
                              'packets. must be the same as method used'
                              'to create the traffic model file')
    return parser.parse_args()

def setup_logging(verbose, outdir, client):
    '''setup logging for the entire app'''
    # create file handler which logs even debug messages
    if not os.path.exists(outdir):
        os.makedirs(outdir)
    tt = 'client' if client else 'server'
    #logging.basicConfig(filemode='w')
    logfilename = outdir + '/ipktgen-' + tt + '.log'
    if os.path.exists(logfilename):
        os.remove(logfilename)
    f_handler = logging.FileHandler(logfilename)
    f_handler.setLevel(logging.DEBUG)
    # create console handler with a higher log level
    c_handler = logging.StreamHandler()
    c_handler.setLevel(logging.INFO)
    if verbose:
        c_handler.setLevel(logging.DEBUG)
    # create formatter and add it to the handlers
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - '\
                '%(name)s - %(message)s')
    f_handler.setFormatter(formatter)
    c_handler.setFormatter(formatter)
    # add the handlers to the logger
    LOGGER.addHandler(f_handler)
    LOGGER.addHandler(c_handler)
    print('logging to file: {}, log level: {}'.format(logfilename, 
                                                      f_handler.level))

if __name__ == '__main__':
    args = parse_args()
    setup_logging(args.verbose, args.outdir, args.client)
    generator = Genpackets(args.appmodel, args.usersessions, args.client,
                           args.outdir, args.modeltype)
    generator.generate()
