try:
  import sys
  import os
  import os.path
  import copy
  import Cfg
  import Hurricane
  import Viewer
  import CRL
  from   CRL                     import Environment
  from   CRL                     import RoutingLayerGauge
  from   helpers                 import Configuration
  from   helpers.io              import ErrorMessage
  from   helpers.io              import WarningMessage
 #from   helpers                 import Devices
  from   helpers.Configuration   import TypeBool
  from   helpers.Configuration   import TypeInt
  from   helpers.Configuration   import TypeEnumerate
  from   helpers.Configuration   import TypePercentage
  from   helpers.Configuration   import TypeDouble
  from   helpers.Configuration   import TypeString
  from   helpers.Configuration   import TypeTab
  from   helpers.Configuration   import TypeTitle
  from   helpers.Configuration   import TypeSection
  from   helpers.Configuration   import TypeRule
  from   helpers.Configuration   import TypeOption
  from   helpers                 import Patterns
  from   helpers                 import Display
  from   helpers.Display         import Style
  from   helpers.Display         import Inherit
  from   helpers.Display         import Darkening
  from   helpers.Display         import Group
  from   helpers.Display         import Drawing
  from   helpers                 import Alliance
  from   helpers                 import Technology
  from   helpers                 import AnalogTechno
  from   helpers                 import Devices
  import helpers.Display
except ImportError, e:
  serror = str(e)
  if    serror.startswith('No module named') \
     or serror.startswith('cannot import name') :
    module = serror.split()[-1]
    print '[ERROR] The "%s" python module or symbol cannot be loaded.' % module
    print '        Please check the integrity of the Coriolis package.'
  if serror.find('cannot open shared object file') != -1:
    library = serror.split(':')[0]
    print '[ERROR] The "%s" shared library cannot be loaded.' % library
    print '        Under RHEL 6, you must be under devtoolset-2.'
    print '        (scl enable devtoolset-2 bash)'
  sys.exit(1)
except Exception, e:
  print '[ERROR] A strange exception occurred while loading the basic Coriolis/Python'
  print '        modules. Something may be wrong at Python/C API level.\n'
  print '        %s' % e
  sys.exit(2)


helpers.staticInitialization()
moduleGlobals       = globals()

SystemFile          = 0x0001
AllianceHelper      = 0x0002
TechnologyHelper    = 0x0004
PatternsHelper      = 0x0010
DisplayHelper       = 0x0020
ConfigurationHelper = 0x0040
KiteHelper          = 0x0080
HelpersMask         = AllianceHelper      \
                    | TechnologyHelper    \
                    | PatternsHelper      \
                    | DisplayHelper       \
                    | ConfigurationHelper \
                    | KiteHelper

SystemMandatory     = 0x0100


def coriolisConfigure():
  confHelpers  = ( ('allianceConfig'       , Alliance.loadAllianceConfig    , SystemMandatory|AllianceHelper)
                 , ('routingGaugesTable'   , Alliance.loadRoutingGaugesTable, SystemMandatory|KiteHelper)
                 , ('cellGaugesTable'      , Alliance.loadCellGaugesTable   , SystemMandatory|KiteHelper)
                 , ('realLayersTable'      , Technology.loadRealLayers      , SystemMandatory|TechnologyHelper)
                 , ('compositeLayersTable' , Technology.loadCompositeLayers , SystemMandatory|TechnologyHelper)
                 , ('symbolicLayersTable'  , Technology.tagSymbolicLayers   , SystemMandatory|TechnologyHelper)
                 , ('layersExtensionsTable', Technology.loadLayersExtensions, SystemMandatory|TechnologyHelper)
                 , ('gdsLayersTable'       , Technology.loadGdsLayers       , SystemMandatory|TechnologyHelper)
                 , ('patternsTable'        , Patterns.loadPatterns          , SystemMandatory|PatternsHelper)
                 , ('stylesTable'          , Display.loadStyles             , SystemMandatory|DisplayHelper)
                 , ('defaultStyle'         , Display.loadDefaultStyle       , SystemMandatory|DisplayHelper)
                 , ('parametersTable'      , Configuration.loadParameters   , ConfigurationHelper)
                 , ('layoutTable'          , Configuration.loadLayout       , ConfigurationHelper)
                 )

                 # ('technoConfig'         , Technology.loadTechnoConfig    , SystemMandatory|TechnologyHelper)

  print '       o  Running configuration hook: coriolisConfigure().'
 #print '          - sysConfDir: <%s>' % helpers.sysConfDir

  Cfg.Configuration.pushDefaultPriority ( Cfg.Parameter.Priority.ConfigurationFile )

  confFiles = [ (helpers.technoDir+'/technology.conf', SystemFile|TechnologyHelper)
              , (helpers.technoDir+'/alliance.conf'  , SystemFile|AllianceHelper)
              , (helpers.technoDir+'/patterns.conf'  , SystemFile|PatternsHelper)
              , (helpers.technoDir+'/display.conf'   , SystemFile|DisplayHelper)
              , (helpers.technoDir+'/misc.conf'      , SystemFile|ConfigurationHelper)
              , (helpers.technoDir+'/etesian.conf'   , SystemFile|ConfigurationHelper)
              , (helpers.technoDir+'/kite.conf'      , SystemFile|ConfigurationHelper|KiteHelper)
              , (helpers.technoDir+'/stratus1.conf'  , SystemFile|ConfigurationHelper)
              , (helpers.technoDir+'/plugins.conf'   , SystemFile|ConfigurationHelper)
              , (helpers.technoDir+'/analog.conf'    , SystemFile|ConfigurationHelper)
              ]
  if os.getenv('HOME'):
    confFiles   += [ (os.getenv('HOME')+'/.coriolis2/settings.py', 0) ]
  else:
    w = WarningMessage(['The "HOME" environment variable is not defined, this is most unusual.'
                       ,'It prevents the loading of ${HOME}/.coriolis2/settings.py'])
    print w

  confFiles   += [ (os.getcwd()+'/.coriolis2/settings.py', 0) ]

  for confFile, confFlags in confFiles:
    if confFile.endswith('settings.py'):
      Cfg.Configuration.pushDefaultPriority ( Cfg.Parameter.Priority.UserFile )
    try:
      if not os.path.isfile(confFile):
        if confFlags & SystemFile:
          print '[ERROR] Missing mandatory Coriolis2 system file:'
          print '        "%s"' % helpers.truncPath(confFile)
          print '        Your installation may be broken. Trying to continue anyway...'
        continue

      print '          - Loading "%s".' % helpers.truncPath(confFile)
      execfile(confFile,moduleGlobals)
    except Exception, e:
      helpers.showPythonTrace( confFile, e )

    for symbol, loader, loaderFlags in confHelpers:
      if moduleGlobals.has_key(symbol):
        loader( moduleGlobals[symbol], confFile )
        del moduleGlobals[symbol]
      else:
        if confFlags & loaderFlags & HelpersMask:
          if confFlags & SystemFile and loaderFlags & SystemMandatory:
            print '[ERROR] Mandatory symbol "%s" is missing in system configuration file:' % symbol
            print '        "%s"' % helpers.truncPath(confFile)
            print '        Trying to continue anyway...'

    if confFile.endswith('settings.py'):
      Cfg.Configuration.popDefaultPriority ()
  
  Cfg.Configuration.popDefaultPriority ()

 #sys.stdout.write(CRL.AllianceFramework.get().getEnvironment().getPrint())

  if not Cfg.getParamString('stratus1.mappingName').asString():
    vendorTech  = helpers.techno.split('/')[-1]
    mappingFile = os.path.join( helpers.technoDir, 'stratus.xml' )
    if not os.path.isfile(mappingFile): 
      mappingFile = os.path.join( helpers.sysConfDir, 'stratus2sxlib.xml' )

    parameter = Cfg.getParamString('stratus1.mappingName')
    parameter.setString( mappingFile )
    parameter.flags = Cfg.Parameter.Flags.NeedRestart|Cfg.Parameter.Flags.MustExist 

  confFile = None
  if Cfg.hasParameter('analog.techno'):
    confFile = Cfg.getParamString('analog.techno').asString()
    if confFile == 'Analog_technology_has_not_been_set': confFile = None
    if confFile == 'Analog_technology_is_disabled':      return

  if not confFile:
    vendorTech = helpers.techno.split('/')[-1]
    confFile   = os.path.join( helpers.technoDir, 'dtr_%s.py'%vendorTech )
    Cfg.getParamString('analog.techno').setString( confFile )

  if not os.path.isfile(confFile):
    print '[WARNING] Analog technology file (aka DTR) has not been found:'
    print '          "%s"' % helpers.truncPath(confFile)
    print '          Use of Coriolis analog is disabled.'
    return

  try:
    if not helpers.quiet: print '          - Loading \"%s\".' % helpers.truncPath(confFile)
    execfile(confFile,moduleGlobals)
  except Exception, e:
    showPythonTrace( confFile, e )
  
  if moduleGlobals.has_key('analogTechnologyTable'):
    AnalogTechno.loadAnalogTechno( moduleGlobals['analogTechnologyTable'], confFile )
    del moduleGlobals['analogTechnologyTable']
  else:
    print '[ERROR] Mandatory symbol <%s> is missing in technology configuration file:' % 'analogTechnologyTable'
    print '        "%s"' % helpers.truncPath(confFile)
    sys.exit( 1 )

  confFile = Cfg.getParamString('analog.devices').asString()
  if not os.path.isfile(confFile):
    print '[ERROR] Missing mandatory analog devices description file:'
    print '        "%s"' % helpers.truncPath(confFile)
    print '        Please look for the "analog.devices" parameter in configuration files.'
    sys.exit( 1 )
 
  try:
    if not helpers.quiet: print '          - Loading \"%s\".' % helpers.truncPath(confFile)
    execfile(confFile,moduleGlobals)
  except Exception, e:
    showPythonTrace( confFile, e )
  
  if moduleGlobals.has_key('devicesTable'):
    Devices.loadDevices( moduleGlobals['devicesTable'], confFile )
    del moduleGlobals['devicesTable']
  else:
    print '[ERROR] Mandatory symbol "%s" is missing in technology configuration file:' % 'devicesTable'
    print '        "%s"' % helpers.truncPath(confFile)
    sys.exit( 1 )

  return