import threading

from PyQt4 import QtCore
from PyQt4.QtCore import SIGNAL

from schainpy.controller import Project

class ControllerThread(threading.Thread, Project):
    
    def __init__(self, filename):
        
        threading.Thread.__init__(self)
        Project.__init__(self)
        
        self.setDaemon(True)
        
        self.filename = filename
        self.control = {'stop':False, 'pause':False}
    
    def __del__(self):
        
        self.control['stop'] = True
#         self.pause(1)
#         self.wait()
    
    def stop(self):
        self.control['stop'] = True
        
    def pause(self):
        self.control['pause'] = not(self.control['pause'])

    def __run(self):
        
        print
        print "*"*40
        print "   Starting SIGNAL CHAIN PROCESSING  "
        print "*"*40
        print
        
        keyList = self.procUnitConfObjDict.keys()
        keyList.sort()
            
        while(True):
            
            finalSts = False
            #executed proc units
            procUnitExecutedList = []
            
            for procKey in keyList:
#                 print "Running the '%s' process with %s" %(procUnitConfObj.name, procUnitConfObj.id)
                
                procUnitConfObj = self.procUnitConfObjDict[procKey]
                
                inputId = procUnitConfObj.getInputId()
                
                sts = procUnitConfObj.run()
                finalSts = finalSts or sts
                
                procUnitExecutedList.append(procUnitConfObj.id)
            
            #If every process unit finished so end process
            if not(finalSts):
                print "Every process unit have finished"
                break

            if self.control['pause']:
                print "Process suspended"
                
                while True:    
                    sleep(0.1)
                    
                    if not self.control['pause']:
                        break
                    
                    if self.control['stop']:
                        break
                print "Process reinitialized"
            
            if self.control['stop']:
#                 print "Process stopped"
                break
                
        #Closing every process
        for procKey in keyList:
            procUnitConfObj = self.procUnitConfObjDict[procKey]
            procUnitConfObj.close()
            
        print "Process finished"
        
    def run(self):
        self.control['stop'] = False
        self.control['pause'] = False
        
        self.readXml(self.filename)
        self.createObjects()
        self.connectObjects()
        Project.run(self)
        
    def isRunning(self):
        
        return self.is_alive()
    
    def isFinished(self):
        
        return not self.is_alive()
        
class ControllerQThread(QtCore.QThread, Project):
    
    def __init__(self, filename):
        
        QtCore.QThread.__init__(self)
        Project.__init__(self)
        
        self.filename = filename
        self.control = {'stop':False, 'pause':False}
    
    def __del__(self):
        
        self.control['stop'] = True
        self.wait()
        
    def stop(self):
        self.control['stop'] = True
        
    def pause(self):
        self.control['pause'] = not(self.control['pause'])

    def run(self):
        self.control['stop'] = False
        self.control['pause'] = False
        
        self.readXml(self.filename)
        self.createObjects()
        self.connectObjects()
        self.emit( SIGNAL( "jobStarted( PyQt_PyObject )" ), 1)
        Project.run(self)
        self.emit( SIGNAL( "jobFinished( PyQt_PyObject )" ), 1)