#!/usr/bin/env python
"""
Lists XNAT objects.
"""
import os
import sys
import imp
import argparse
from qiutil import command


class SessionNotFoundError(Exception):
    pass


def main(argv=sys.argv):
    # Parse the command line arguments.
    path_str, opts = _parse_arguments()

    # The XNAT configuration.
    config = opts.pop('config', None)

    # Configure the logger.
    command.configure_log('qils', opts)

    # Import the pyxnat and qiutil pipeline module after configuring
    # the logger.
    from pyxnat.core.resources import Reconstruction
    import qiutil
    from qiutil import qixnat

    # Parse the XNAT hierarchy argument.
    path_items = path_str.split('/')
    if len(path_items) < 2:
        raise ValueError('The search path must include at least two items,'
                         ' e.g. Breast003/Session01')
    prj = opts.pop('project', qiutil.project())
    sbj, sess = path_items[0:2]
    child_path = qixnat.helpers.standardize_experiment_child_hierarchy(path_items[2:])
    with qixnat.connection.connect(config) as xnat:
        sess_obj = xnat.get_session(prj, sbj, sess)
        if not xnat.exists(sess_obj):
            raise SessionNotFoundError("No such XNAT session: %s %s %s" %
                                       (prj, sbj, sess))
        for child in xnat.expand_child_hierarchy(sess_obj, child_path):
            if isinstance(child, Reconstruction):
                print child.id()
            else:
                print child.label()

    return 0


def _parse_arguments():
    """Parses the command line arguments."""
    parser = argparse.ArgumentParser()

    # The log options.
    command.add_standard_options(parser)

    # The input XNAT hierarchy path.
    parser.add_argument('path', help='the target XNAT object path')

    args = vars(parser.parse_args())
    nonempty_args = dict((k, v) for k, v in args.iteritems() if v != None)

    return nonempty_args.pop('path'), nonempty_args


if __name__ == '__main__':
    sys.exit(main())
