
import os,sys,time

      
def getCCP4I2Dir(up=1):
	target = os.path.join(os.path.realpath(sys.argv[0]),"..")
	abstarget = os.path.abspath(target)
        splittarget = abstarget.split()
        if splittarget.count('ccp4i2'):
          splittarget.reverse()
          up = splittarget.index('ccp4i2')
        while up>0:
          abstarget = os.path.dirname(abstarget)
          up = up -1
        return abstarget

def quitThread(thread):
  print 'quitThread',thread; sys.stdout.flush()
  #thread.quit()
  #thread.wait()
  import CCP4Modules
  CCP4Modules.QTAPPLICATION(graphical=False).quit()
  sys.exit()


def updateI2():
  import CCP4Update
  version = 'Unknown - update failed'
  try:
    u =CCP4Update.CUpdateForTestSys()
    u.initialise()
    version = str(u._original)+' - update failed'
    u._bzr_run(True)
    version = str(u._current)
    print 'Current version: ',u._current
  except Exception as e:
    print 'ERROR updating CCP4 from bzr'
    print e

  return version
    

if __name__ == '__main__':

    import sys,os
    # Redirect stderr to stdout
    sys.stderr = sys.stdout
    # print 'testi2sys sys.argv',sys.argv
    top_path = getCCP4I2Dir()
    execfile(os.path.join(top_path,'utils','startup.py'))
    graphical = False
    
    if graphical:
      setupPythonpath(mode='qtgui')
    else:
      setupPythonpath(mode='qtcore')
    setupPluginsPath()

    configFile = None
    compressedProjectFile = None
    outputDirectory = None
    help = False
    selectedJobs = None
    update = False
    
    iarg = 1
    while iarg < len(sys.argv):
      if sys.argv[iarg][0:2] == '-u':
        update = True
      elif sys.argv[iarg][0:2] == '-c':
        if iarg+1 <  len(sys.argv):
	      iarg += 1
	      configFile = sys.argv[iarg]
      elif sys.argv[iarg][0:2] == '-o':
        if iarg+1 <  len(sys.argv):
	      iarg += 1
	      outputDirectory = sys.argv[iarg]
      elif sys.argv[iarg][0:2] == '-p':
        if iarg+1 <  len(sys.argv):
	      iarg += 1
	      compressedProjectFile = sys.argv[iarg]
      elif sys.argv[iarg][0:2] == '-j':
        if iarg+1 <  len(sys.argv):
	      iarg += 1
	      selectedJobs = sys.argv[iarg]
      elif sys.argv[iarg][0:2] == '-h':
        help = True	
      iarg += 1

    if help:
      print '''testi2sys - running one or more ccp4i2 compressed project files as test suite
      -p  projectFile - a compressed project file or directory containing these files
      -o  outputDirectory - rerun project and test results will be in a sub-directory of this
      -c  configFile - ccp4i2 config file
      -j  selectedJobs - run just job numbers, input in form '1,2,7-8' with no spaces
      -b  - update ccp4i2 from bzr repository - only works for 'release' not developer version
'''
      sys.exit()

    import CCP4ProjectBasedTesting
    kw = {}
    for name,defn in CCP4ProjectBasedTesting.MODES.items():
      modeArg = '-' + defn.get('argument',name[0])
      iarg = -1
      if sys.argv.count('-'+name):
        iarg = sys.argv.index('-'+name)
      elif sys.argv.count('-'+modeArg):
        iarg = sys.argv.index('-'+modeArg)
      if iarg>=0 and iarg+1<len(sys.argv):
        value = int(sys.argv[iarg+1])
        if value in defn.get('allowed').keys(): kw[name] = value

    # truncating sys.argv to stop the annoying error messages about 'usage'
    # but need to leave something for the CBazaar.initialise to pop()
    del sys.argv[2:]
    if update:
        version = updateI2()
    else:
        version = 'Unknown - no bzr update'

    import CCP4Utils
    source = CCP4Utils.getCCP4I2Dir()
    t = time.localtime()
    startTime = time.strftime('%y-%m-%d-%H-%M',t)
    startTime0 = time.strftime('%H-%M %d %b %y',t)

    if compressedProjectFile is None:
      print "ERROR: no compressed project file"
      sys.exit()
    compressedProjectFile = os.path.abspath(compressedProjectFile)
    if not os.path.exists(compressedProjectFile):
       print "ERROR: compressed project file not found: "+compressedProjectFile
       sys.exit()
    elif os.path.isdir(compressedProjectFile):
      import glob
      import CCP4Export
      compressedProjectFileList = glob.glob(os.path.join(compressedProjectFile,"*."+CCP4Export.COMPRESSED_SUFFIX))
      if len(compressedProjectFileList)<1:
        print "ERROR: no compressed project files found in directory: "+compressedProjectFile
        sys.exit()
    elif os.path.isfile(compressedProjectFile):
      compressedProjectFileList = [compressedProjectFile]
    else:
      print "ERROR: compressed project file recognised as file or directory: "+compressedProjectFile
      sys.exit()

    
	  
    # Use the specified config file or dbFile
    import CCP4Config
    if configFile is not None:
      config = CCP4Config.CONFIG(configFile)
      print 'Running tests using config file:',configFile
    else:
      config = loadConfig()
    config.set('graphical',graphical)

    if outputDirectory is None:
      outputDirectory = os.getcwd()
    else:
      outputDirectory = os.path.abspath(outputDirectory)
    
    if not os.path.exists(outputDirectory):
      try:
        os.makedirs(outputDirectory)
      except:
        print "ERROR: failed to create test directory:",outputDirectory
        sys.exit()
      else:
        print 'Directory for output files: '+outputDirectory
	
    dbFile = os.path.join(outputDirectory,'db-'+startTime+'.sqlite')
    if os.path.exists(dbFile):
      print "ERROR: database file exists:",dbFile
      sys.exit()
	
    config.set('dbFile',dbFile)
    #configFile = os.path.join(outputDirectory,'config-'+startTime+'.xml')
    #config.saveDataToXml(configFile)

    #sys.argv =  [sys.argv[0]]

    import CCP4Modules,startup
    app = CCP4Modules.QTAPPLICATION(graphical=graphical)
    pm = startup.startProjectsManager(dbFileName=dbFile,loadDiagnostic=False)
    pm.startCheckForFinishedJobs()
    jc = startup.startJobController()
    jc.setDiagnostic(False)
    #jc.setConfigFile(configFile)
    if dbFile is not None: jc.setDbFile(dbFile)
    app.connect(pm,QtCore.SIGNAL("doCheckForFinishedJobs"),pm.checkForFinishedJobs)
    import CCP4DataManager
    CCP4DataManager.DATAMANAGER().buildClassLookup()

    print 'Test results will be saved to: '+os.path.join(outputDirectory,'test-'+startTime+'.log')+' and database '+dbFile
    log = CCP4ProjectBasedTesting.Logger(os.path.join(outputDirectory,'test-'+startTime+'.log'))
    log.write('Running CCP4i2 from: '+str(source)+'   Repository version: '+str(version)+'\n')
    log.write('Started: '+startTime0+'\n\n\n')
    testRunner = CCP4ProjectBasedTesting.CProjectBasedTesting(sourceProjectList=compressedProjectFileList,outputDirectory=outputDirectory,parent=app,log=log,selectedJobs=selectedJobs,useCurrentDb=True,**kw)
    testRunner.connect(testRunner,QtCore.SIGNAL('finished'),sys.exit)
    testRunner.runTests()
    #print 'testi2sys from testRunner.runTests()'
    
    
    sys.exit(app.exec_())


