#!python

import argparse, re, io
import numpy as np
import pynit as pn
import pynsp as pp

__version__ = pp.__version__


def main():
    parser = argparse.ArgumentParser(prog='pynsp',
                                     description="Command-line tool for PyNSP")
    parser.add_argument("-v", "--version", action='version', version ='%(prog)s v{}'.format(__version__))

    subparsers = parser.add_subparsers(title='Sub-commands',
                                       description='Something description',
                                       help='description',
                                       dest='function',
                                       metavar='command')

    seedpc = subparsers.add_parser("seedpc", help='Seed PC brain-wise correlation analysis')
    seedpc.add_argument("-i", "--input", help="input file", type=str, required=True)
    seedpc.add_argument("-t", "--template", help="template file", type=str, required=True)
    seedpc.add_argument("-a", "--atlas", help="atlas file", type=str, required=True)
    seedpc.add_argument("-d", "--indices", metavar='INDICES', nargs='*',
                        help="index of ROI", type=int, required=True)
    seedpc.add_argument("-n", "--n_voxels", metavar='NUM_of_VOXELS', help="number of Voxel to sample",
                        default=100, type=int)
    seedpc.add_argument("-l", "--iters", metavar='NUM_of_ITERATIONS', help="number of iteration",
                        default=1000, type=int)
    seedpc.add_argument("-o", "--output", help="output file", type=str, required=True)

    seed = subparsers.add_parser("seed", help='Seed-based brain-wise correlation analysis')
    seed.add_argument("-i", "--input", help="input file", type=str, required=True)
    seed.add_argument("-t", "--template", help="template file", type=str, required=True)
    seed.add_argument("-a", "--atlas", help="atlas file", type=str, required=True)
    seed.add_argument("-d", "--indices", metavar='INDICES', nargs='*',
                        help="index of ROI", type=int, required=True)
    seed.add_argument("-o", "--output", help="output file", type=str, required=True)
    # subparsers.set_defaults(func=seed)
#
    args = parser.parse_args()
    if args.function == 'seedpc':
        from pynsp.stats import seedpc2brainwise
        from pynsp.tools import io
        tmpobj = pn.Template(args.template, args.atlas)
        matrix = pn.load(args.input).get_data()
        indices = list(set(args.indices))
        for idx in indices:
            R = seedpc2brainwise(matrix, tmpobj, idx, args.n_voxels,
                                 args.iters, c_type=None)
                                 # args.iters, c_type = "Benjamini-Hochberg")
            filename = pn.methods.splitnifti(args.output)
            io.save_as(R, tmpobj, "{}_roi-{}.nii.gz".format(filename, tmpobj.label[idx][0]))
    elif args.function == 'seed':
        from pynsp.stats import seedpc2brainwise
        from pynsp.tools import io
        tmpobj = pn.Template(args.template, args.atlas)
        matrix = pn.load(args.input).get_data()
        indices = list(set(args.indices))
        for idx in indices:
            R = seedpc2brainwise(matrix, tmpobj, idx, n_voxels='Max',
                                 iters=1, n_pc=None, c_type=None)
                                 # iters=1, n_pc=None, c_type = "Benjamini-Hochberg")
            filename = pn.methods.splitnifti(args.output)
            io.save_as(R, tmpobj, "{}_roi-{}.nii.gz".format(filename, tmpobj.label[idx][0]))
    else:
        pass


if __name__ == '__main__':
    main()