# !/usr/bin/env python

from argparse import ArgumentDefaultsHelpFormatter


def func(args, parser):
    # delay import of the rest of the module to improve `mdentropy -h`
    # performance
    import pickle
    import mdtraj as md
    import pandas as pd
    from ..utils import parse_files
    from ..metrics import DihedralTransferEntropy

    f1, f2 = parse_files(args.current), parse_files(args.past)

    current = md.load(f1, top=args.top, stride=args.stride)
    past = md.load(f2, top=args.top, stride=args.stride)

    tent = DihedralTransferEntropy(n_bins=args.nbins, types=args.types,
                                   method=args.method, threads=args.n_threads,
                                   normed=True)

    T = tent.partial_transform((past, current), shuffle=iter, verbose=True)

    df = pd.DataFrame(T, columns=tent.labels)

    pickle.dump(df, open(args.out, 'wb'))


def configure_parser(sub_parsers):
    help = 'Run a dihedral transfer entropy calculation'
    p = sub_parsers.add_parser('dtent', description=help, help=help,
                               formatter_class=ArgumentDefaultsHelpFormatter)
    p.add_argument('-p', '--past', dest='past',
                   help='File containing past step states.',
                   required=True)
    p.add_argument('-s', '--shuffle-iter', dest='iter',
                   help='Number of shuffle iterations.',
                   default=10, type=int)
    p.add_argument('-r', '--stride', dest='stride',
                   help='Stride to use', default=1, type=int)
    p.add_argument('-t', '--topology',
                   dest='top', help='File containing topology.',
                   default=None)
    p.add_argument('-b', '--n-bins', dest='nbins',
                   help='Number of bins', default=3, type=int)
    p.add_argument('-n', '--n-threads', dest='N',
                   help='Number of threads', default=None, type=int)
    p.add_argument('-o', '--output', dest='out',
                   help='Name of output file.', default='tent.pkl')
    p.add_argument('-m', '--method', dest='method',
                   help='Entropy estimate method.',
                   choices=['chaowangjost', 'grassberger', 'kde',
                            'knn', 'naive'],
                   default='knn')
    p.add_argument('-d', '--dihedrals', dest='dihedrals',
                   help='Dihedral angles to analyze.',
                   nargs='+',
                   choices=['phi', 'psi', 'omega', 'chi1',
                            'chi2', 'chi3', 'chi4'],
                   default=['phi', 'psi'])
    p.set_defaults(func=func)