#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""nntoolkit, the neural network toolkit, is a set of executable scripts
   and Python modules that are useful for neural network evaluation.
"""


from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter

import logging
import sys
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
                    level=logging.DEBUG,
                    stream=sys.stdout)

# hwrt modules
# Every nntoolkit subcommand that should be available through
#   nntoolkit SUBCOMMAND
# has to be added to ``get_parser()`` and to ``main``.
import nntoolkit
from nntoolkit import evaluate
from nntoolkit import create
from nntoolkit import train
from nntoolkit import test


def get_parser():
    """Return the parser object for this script."""
    parser = ArgumentParser(description=__doc__,
                            prog='nntoolkit',
                            formatter_class=ArgumentDefaultsHelpFormatter)
    parser.add_argument('--version',
                        action='version',
                        version=('nntoolkit %s' % str(nntoolkit.__version__)))
    subparsers = parser.add_subparsers(dest='cmd')
    subparsers.add_parser('evaluate',
                          add_help=False,
                          parents=[evaluate.get_parser()],
                          help="Evaluate the model for a single recording.")
    subparsers.add_parser('create',
                          add_help=False,
                          parents=[create.get_parser()],
                          help="Create a new model file.")
    subparsers.add_parser('train',
                          add_help=False,
                          parents=[train.get_parser()],
                          help="Train a neural network.")
    subparsers.add_parser('test',
                          add_help=False,
                          parents=[test.get_parser()],
                          help="Test a neural network.")
    return parser


def main(args):
    if args.cmd == 'evaluate':
        evaluate.main_bash(args.modelfile, args.inputvec)
    elif args.cmd in ['create', 'make']:
        create.main(args.type, args.architecture, args.model_file)
    elif args.cmd == 'train':
        train.main(args.model_file,
                   args.model_output_file,
                   args.training_data,
                   args.batch_size,
                   args.learning_rate,
                   args.epochs)
    elif args.cmd == 'test':
        test.main(args.model_file, args.test_data)
    else:
        logging.warning("Subcommand '%s' not implemented.", args.cmds)

if __name__ == '__main__':
    args = get_parser().parse_args()
    main(args)
