#
#  Copyright (C) 2017 STFC Rutherford Appleton Laboratory, UK.
#
#  Author: David Waterman
#  Acknowledgements: based on ideas and code by Nat Echols and Martin Noble.
#

"""Create xia2_xds.def.xml from PHIL parameters"""

import sys,os
from lxml import etree

CCP4=os.environ['CCP4']
assert CCP4 is not None
sys.path.append(os.path.join(CCP4,'share','ccp4i2','core'))
sys.path.append(os.path.join(CCP4,'share','ccp4i2','report'))
sys.path.append(os.path.join(CCP4,'share','ccp4i2','dbapi'))
sys.path.append(os.path.join(CCP4,'share','ccp4i2','utils'))
import CCP4Container
from phil2etree import Phil2Etree

if __name__ == "__main__":

    # Get the PHIL information as a scope and translate into an etree
    from xia2.Handlers.Phil import master_phil

    p2e = Phil2Etree(master_phil)
    phil_tree = p2e(root_id='controlParameters')

    # Now remove elements related to DIALS and xia2.strategy
    to_remove = []
    for cont in phil_tree.iter():
        if cont.get('id') in ['dials', 'strategy']:
          to_remove.append(cont)
    for cont in to_remove: cont.getparent().remove(cont)

    # Modify the pipeline parameter to only allow XDS versions
    for cont in phil_tree.iter():
        if cont.get('id') == 'xia2__settings__pipeline':
          qual = cont.find('qualifiers')
          qual.find('toolTip').text = ("Select XDS processing pipeline. "
            "3d: XDS, XSCALE, LABELIT   "
            "3di: as 3d, but use 3 wedges for indexing  "
            "3dii: XDS, XSCALE, using all images for autoindexing   "
            "3dd: as 3d, but use DIALS for indexing")
          qual.find('enumerators').text = "3d,3dd,3di,3dii"
          qual.find('default').text = "3dii"
          break

    # DEBUG
    #print etree.tostring(phil_tree, pretty_print=True)

    # Create a new etree with containers for input and output data
    root = etree.Element('container',id='xia2_xds')
    inputDataXML = etree.fromstring(
'''
<dummyRoot>
    <container id="inputData">
      <content id="IMAGE_DIRECTORY">
        <className>CDataFile</className>
        <qualifiers>
          <mustExist>True</mustExist>
          <isDirectory>True</isDirectory>
          <allowUndefined>False</allowUndefined>
          <contentFlag>
            <min>0</min>
          </contentFlag>
        </qualifiers>
      </content>
    </container>
    <container id="outputData">
      <content id="UNMERGEDOUT">
        <className>CList</className>
        <qualifiers/>
        <subItem>
          <className>CUnmergedDataFile</className>
          <qualifiers>
            <contentFlag>
              <min>0</min>
            </contentFlag>
            <baseName>
              <allowedCharacters>*?</allowedCharacters>
            </baseName>
            <relPath>
              <allowedCharacters>*?</allowedCharacters>
            </relPath>
          </qualifiers>
        </subItem>
      </content>
      <content id="HKLOUT">
        <className>CList</className>
        <qualifiers/>
        <subItem>
          <className>CObsDataFile</className>
          <qualifiers>
            <default/>
            <contentFlag>
              <min>0</min>
            </contentFlag>
            <subType>
              <menuText>observed data,derived data,reference data</menuText>
              <onlyEnumerators>True</onlyEnumerators>
              <enumerators>1,2,3</enumerators>
              <default>1</default>
            </subType>
          </qualifiers>
        </subItem>
      </content>
      <content id="FREEROUT">
        <className>CList</className>
        <qualifiers/>
        <subItem>
          <className>CFreeRDataFile</className>
          <qualifiers>
            <contentFlag>
              <min>0</min>
            </contentFlag>
            <subType>
              <onlyEnumerators>True</onlyEnumerators>
            </subType>
          </qualifiers>
        </subItem>
      </content>
      <content id="PERFORMANCE">
        <className>CDataReductionPerformance</className>
        <qualifiers>
          <highResLimit>
            <min>0.0</min>
          </highResLimit>
        </qualifiers>
      </content>
    </container>
</dummyRoot>
        ''')
    for child in inputDataXML: root.append(child)

    # Append the xia2 etree to the input and output containers
    root.append(phil_tree)

    # Create a skeleton CCP4Container
    paramsContainer = CCP4Container.CContainer()
    header = paramsContainer.addHeader()
    header.setCurrent()
    header.function='DEF'
    header.pluginName.set('xia2_xds')
    element, errors = paramsContainer.saveContentsToEtree()

    # Now package into the CCP4Container and write out
    paramsContainer.loadContentsFromEtree(root, overwrite=True)
    paramsContainer.saveContentsToXml(fileName='xia2_xds.def.xml')
