"""
    wrappers/ProvideSequence/script/ProvideSequence_gui.py
    Martin Noble
    """

from PyQt4 import QtGui,QtCore
from CCP4TaskWidget import CTaskWidget
import CCP4Widgets
import os

class CTaskProvideSequence(CTaskWidget):
    
    # Subclass CTaskWidget to give specific task window
    TASKNAME = 'ProvideSequence'
    TASKVERSION = 0.0
    TASKMODULE='data_entry'
    TASKTITLE="Import a sequence"
    WHATNEXT = []
    DESCRIPTION = '''Enter a sequence from a sequence file, from a PDB, or by cut and paste'''
    
    def __init__(self,parent):
        CTaskWidget.__init__(self,parent)
        self.becauseSeqSet = False
        self.becauseAlignSet = False
        self.becausePDBSet = False
    
    
    def drawContents(self):
        
        self.setProgramHelpFile('ProvideSequence')
        
        folder = self.openFolder(folderFunction='inputData',title='Optional objects from which to start definition')
        
        self.createLine( [ 'subtitle','Starting from file/object...'] )
        
        self.createLine( [ 'widget', '-browseDb', True, '-enableEdit', False, 'SEQIN', 'tip', 'Sequence object or file' ] )
        self.connect(self.container.inputData.SEQIN,QtCore.SIGNAL('dataChanged'), self.handleSelectSeqin)
        self.createLine( [ 'widget', '-browseDb', True, 'XYZIN', 'tip', 'Alignment object or file' ] )
        self.connect(self.container.inputData.XYZIN,QtCore.SIGNAL('dataChanged'), self.handleSelectXyzin)
        
        self.createLine( [ 'subtitle','Or enter the raw text of the sequence...'] )
        self.createLine( [ 'widget', '-guiMode','multiLine','SEQUENCETEXT' ] )
        self.container.inputData.SEQIN.unSet()

    def handleSelectSeqin(self):
        #Here check to see whether this is a GUI-driven (rather than a programmatic) setting
        #the "self.becauseSeqSet" flag is set only when this is programmatic
        if self.becauseSeqSet: self.becauseSeqSet = False
        elif self.container.inputData.SEQIN.isSet():
            self.becauseSeqSet = True
            if os.path.isfile(self.container.inputData.SEQIN.fullPath.__str__()):
                with open(self.container.inputData.SEQIN.fullPath.__str__(),'r') as myFile:
                    content = myFile.read()
                    self.container.controlParameters.SEQUENCETEXT = content
            self.container.inputData.XYZIN.unSet()
            self.getWidget('SEQUENCETEXT').updateViewFromModel()
            self.getWidget('XYZIN').updateViewFromModel()

    def handleSelectXyzin(self):
        if self.becausePDBSet: self.becausePDBSet = False
        elif self.container.inputData.XYZIN.isSet():
            self.becausePDBSet = True
            sequences  = self.sequencesFromPDB( self.container.inputData.XYZIN.fullPath.__str__() )
            self.container.controlParameters.SEQUENCETEXT = ''
            for sequenceId in sequences:
                if self.container.inputData.XYZIN.annotation.isSet():
                  import re
                  formattedHeader = '>'+ re.sub(' ','_',str(self.container.inputData.XYZIN.annotation))
                else:
                  formattedHeader = '>'+os.path.split(self.container.inputData.XYZIN.fullPath.__str__())[1]
                formattedHeader+=' Chain'+sequenceId + '\n'
                sequence = sequences[sequenceId]
                self.container.controlParameters.SEQUENCETEXT += formattedHeader
                self.container.controlParameters.SEQUENCETEXT += sequence
            self.container.inputData.SEQIN.unSet()
            self.getWidget('SEQUENCETEXT').updateViewFromModel()
            self.getWidget('SEQIN').updateViewFromModel()

    def sequencesFromPDB(self, filePath):
        tlcOlcMap = {'ALA':'A','CYS':'C','ASP':'D','GLU':'E','PHE':'F','GLY':'G','HIS':'H','ILE':'I','LYS':'K','LEU':'L','MET':'M','ASN':'N','PRO':'P','GLN':'Q','ARG':'R','SER':'S','THR':'T','VAL':'V','TRP':'W','TYR':'Y','TPO':'T','TYP':'Y','YPO':'Y'}
        waterNames = ['HOH','SOL','WAT','H2O']
        frequentSolutes = ['EDO','GOL','SUL','SO4','PO4','CL','ATP','PHO']
        sequences = {}
        import mmut
        print filePath
        if os.path.isfile(filePath):
            from CCP4ModelData import CPdbData
            aCPdbData = CPdbData()
            aCPdbData.loadFile(filePath)
            mmdbManager = aCPdbData.mmdbManager
            for peptideChainId in aCPdbData.composition.peptides:
                sequences[peptideChainId] = ''
                peptideChain = mmdbManager.GetChain(1,peptideChainId)
                iOut = 0
                for i in range(peptideChain.GetNumberOfResidues()):
                    residueName = peptideChain.GetResidue(i).GetResName()
                    if residueName in tlcOlcMap:
                        sequences[peptideChainId]+= tlcOlcMap[residueName]
                        iOut += 1
                    elif (residueName in waterNames) or (residueName in frequentSolutes):
                        pass
                    else:
                        print residueName
                        iOut += 1
                    if (iOut+1)%60 == 0 and sequences[peptideChainId][-1] != '\n':
                        sequences[peptideChainId]+= '\n'
                if sequences[peptideChainId][-1] is not '\n': sequences[peptideChainId] += '\n'
        return sequences
    
    def isValid(self):
        #Here override logic of whether this is a valid task
        invalidElements = super(CTaskProvideSequence,self).isValid()
        if self.container.controlParameters.SEQUENCETEXT.isSet():
            if self.container.inputData.SEQIN in invalidElements:
                invalidElements.remove(self.container.inputData.SEQIN)
            if self.container.inputData.XYZIN in invalidElements:
                invalidElements.remove(self.container.inputData.XYZIN)
        return invalidElements

