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

import string
import logging

from optparse import OptionParser
from collections import OrderedDict

import pyhrf
import pyhrf.ui.treatment as ptr

from pyhrf import xmlio
from pyhrf.jde.models import availableModels, defaultModel
from pyhrf.ui.jde import JDEMCMCAnalyser, DEFAULT_CFG_FILE
from pyhrf.ui.vb_jde_analyser import JDEVEMAnalyser
from pyhrf.tools._io.spmio import load_contrasts_from_mat


logger = logging.getLogger(__name__)

usage = 'usage: %%prog [options]'

description = 'Manage parametrization of a joint detection-estimation'\
              'treatment of fMRI data: build a template parameter file in ' \
              'xml format.'

if pyhrf.__usemode__ == pyhrf.DEVEL:
    description += 'Several models are available, see --help.'

parser = OptionParser(usage=usage, description=description)

model_choice = []
helpOnModels = ['Available models::']
for modelLabel, modelDef in availableModels.items():
    model_choice.append(modelLabel)
    helpOnModels.append(modelLabel + ': ' + modelDef['doc'])
helpOnModels.append('  ~default~: '+defaultModel)
helpOnModels = string.join(helpOnModels, '  *')

parser.add_option('-l', '--model', type='choice', choices=model_choice,
                  metavar='STRING',
                  default=defaultModel, help=helpOnModels)

parser.add_option('-o', '--output-cfg-file', metavar='XMLFILE', dest='cfgFile',
                  default=DEFAULT_CFG_FILE,
                  help='XML file to store parameters')

parser.add_option('-n', '--nb-iteration', dest='nbIterations', default=None,
                  metavar='INT', type='int',
                  help='Set up the number of iterations')

ptr.append_common_treatment_options(parser)

parser.add_option('-e', '--vem', dest='variational_em', metavar='BOOL',
                  default=False, action='store_true',
                  help='Enable Variational EM approach')

parser.add_option('-j', '--jpde', dest='jpde', metavar='BOOL',
                  default=False, action='store_true',
                  help='Enable joint parcellation estimation (Variational EM approach)')


parser.add_option('-C', '--contrasts', dest='contrasts', metavar='BOOL',
                  default=False, action='store_true',
                  help='Include default contrasts')

parser.add_option('-u', '--output-result-directory', dest='output_directory',
                  default=None, help='Outputs results directory')

(options, args) = parser.parse_args()
#options.contrasts -> value of '--contrast' option
# pyhrf_jde_buildcfg -u ./path/
# (options,args) = parser.parse_args()
# -->
# options.output_directory = './path'

# Treat result of option parsing:

# pyhrf.verbose.set_verbosity(options.verbose)
pyhrf.logger.setLevel(options.verbose)

if options.contrasts:
    contrasts = eval('pyhrf.paradigm.default_contrasts_%s' %options.paradigm)
elif options.spmFile:
    contrasts = load_contrasts_from_mat(options.spmFile)
else:
    contrasts = OrderedDict({'dummy_contrast_example' : '3*audio - video/3'})

if options.jpde:
    options.variational_em = True

if not options.variational_em:
    if pyhrf.__usemode__ == pyhrf.DEVEL:
        currentModel = availableModels[options.model]['class']
    else:
        currentModel = availableModels[defaultModel]['class']
    logger.debug('Instanciating analyser ...')
    analyser = JDEMCMCAnalyser( sampler=currentModel() )

    if options.nbIterations is not None:
        analyser.sampler.set_init_param('nb_iterations', options.nbIterations)
    try:
        analyser.sampler.getVariable('nrl').set_init_param('contrasts',
                                                           contrasts)
    except Exception as e:
        pass
else:
    if options.nbIterations is not None:
        analyser = JDEVEMAnalyser(nItMax=options.nbIterations,
                                  contrasts=contrasts)
    else:
        analyser = JDEVEMAnalyser(contrasts=contrasts)


#print 'options:', options
fdata = ptr.parse_data_options(options) #de treatment.py

if options.output_directory is not None:
    treatment = ptr.FMRITreatment(analyser=analyser, fmri_data=fdata,
                                  output_dir=options.output_directory)
else:
    treatment = ptr.FMRITreatment(analyser=analyser, fmri_data=fdata)

# Save the treatment as an XML file:
sXml = xmlio.to_xml(treatment, label='fMRI_treatment')
fOut = open(options.cfgFile,'w')
fOut.write(sXml)
fOut.close()
