#!/usr/bin/python

# See file COPYING distributed with the one_click package for the copyright
# and license.

import sys
import os
import tempfile
import shutil
import xml.dom.minidom
import subprocess
import traceback
import pyxnat
import one_click

def run_qc(scan, dicom_catalog, tempdir):
    catalog_doc = xml.dom.minidom.parse(dicom_catalog)
    dicom_dir = os.path.dirname(dicom_catalog)
    dicom_files = []
    for entry in catalog_doc.getElementsByTagName('cat:entry'):
        dicom_files.append(entry.getAttribute('URI'))
    xcede_fname = '%s/%s.xcede' % (tempdir, scan.id())
    args = ['/usr/local/bin/dicom2bxh', '--xcede']
    args.extend(dicom_files)
    args.append(xcede_fname)
    print subprocess.check_call(args, cwd=dicom_dir)
    res = scan.resource('XCEDE')
    res.attrs.mset({'format': 'XCEDE'})
    res.file(os.path.basename(xcede_fname)).put(xcede_fname)
    output_dir = '%s/%s' % (tempdir, scan.id())
    args = ['/usr/local/bin/fmriqa_generate.pl', 
            '--verbose', 
            xcede_fname, 
            output_dir]
    print subprocess.check_call(args)
    res = scan.resource('QC')
    for fname in os.listdir(output_dir):
        ffname = '%s/%s' % (output_dir, fname)
        res.file(fname).put(ffname)
    return

def mk_qc_dir(project, experiment):
    path = qc_web_root
    for subdir in (project, experiment):
        path = '%s/%s' % (path, subdir)
        if not os.path.exists(path):
            os.mkdir(path)
    return path

pyxnat_server = 'http://xnat.incf.org/xnat/'
(pyxnat_user, pyxnat_pw) = open('/home/ch/.xnat_pw').read().strip().split(':')
qc_web_root = '/var/www/qc'

progname = os.path.basename(sys.argv[0])

if len(sys.argv) != 3:
    print 'usage: %s <project> <experiment ID>' % progname
    sys.exit(1)

(project_id, experiment_id) = sys.argv[1:]

if not project_id.startswith('u_'):
    msg = '%s: project must be a user project (starting with "u_")\n' % \
          progname
    sys.stderr.write(msg)
    sys.exit(1)
user = project_id[2:]

interface = pyxnat.Interface(server=pyxnat_server, 
                             user=pyxnat_user, 
                             password=pyxnat_pw)

project = interface.select.project(project_id)
if not project.exists():
    sys.stderr.write("%s: can't find project %s\n" % (progname, project_id))
    sys.exit(1)

experiment = None
for s in project.subjects():
    experiments = [ e for e in s.experiments(experiment_id) ]
    if experiments:
        experiment = experiments[0]

if not experiment:
    sys.stderr.write("%s: can't find experiment %s in project %s\n" % \
                     (progname, project_id, experiment_id))
    sys.exit(1)

experiment = None
for s in project.subjects():
    experiments = [ e for e in s.experiments(experiment_id) ]
    if experiments:
        experiment = experiments[0]

complete_scans = []
for scan in experiment.scans():
    print scan
    doc = xml.dom.minidom.parseString(scan.get())
    dicom_catalog = None
    for el in doc.getElementsByTagName('xnat:file'):
        if el.getAttribute('label') == 'DICOM':
            dicom_catalog = el.getAttribute('URI')
            break
    if not dicom_catalog:
        print
        continue
    tempdir = tempfile.mkdtemp()
    try:
        run_qc(scan, dicom_catalog, tempdir)
    except:
        print traceback.print_exc()
        print
        continue
    else:
        pass
    finally:
        shutil.rmtree(tempdir)
    doc = xml.dom.minidom.parseString(scan.get())
    qc_catalog = None
    for el in doc.getElementsByTagName('xnat:file'):
        if el.getAttribute('label') == 'QC':
            qc_catalog = el.getAttribute('URI')
            break
    qc_web_path = mk_qc_dir(project_id, experiment_id)
    qc_dir = os.path.dirname(qc_catalog)
    qc_link = '%s/%s' % (qc_web_path, scan.id())
    print '%s -> %s' % (qc_dir, qc_link)
    os.symlink(qc_dir, qc_link)
    complete_scans.append(scan.id())

email = interface.manage.users.email(user)

template = one_click.template_env.get_template('done.email')
body = template.render(project=project_id, 
                       experiment=experiment_id, 
                       scans=complete_scans)
one_click.send_mail([email], 'QC report from xnat.incf.org', body)

sys.exit(0)

# eof
