import os as _os
import re as _re
import sys as _sys
#import time
from casac import casac as _casac

_homedir = _os.getenv('HOME')
if _homedir == None :
   print "Environment variable HOME is not set, please set it"
   _sys.exit(1)

#import casadef

##
## first set up CASAPATH
##
if _os.environ.has_key('CASAPATH') :
    __casapath__ = _os.environ['CASAPATH'].split(' ')[0]
    if not _os.path.exists(__casapath__ + "/data") :
        raise RuntimeError, "CASAPATH environment variable is improperly set"
else :
    __casapath__ = _casac.__file__
    while __casapath__ and __casapath__ != "/" :
        if _os.path.exists( __casapath__ + "/data") :
            break
        __casapath__ = _os.path.dirname(__casapath__)
    if __casapath__ and __casapath__ != "/" :
        _os.environ['CASAPATH']=__casapath__ + " linux local host"
    else :
        raise RuntimeError, "CASAPATH environment variable must be set"

#import __casac__
#cu = __casac__.utils.utils()
#xcu = __casac__.utils.utils

# this dict should transition to namespace (as with argparser)
# --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
#from casa_system import casa as config

#casa = { 'build': {
#             'time': casadef.build_time,
#             'version': cu.version_info( ),
#             'number': casadef.subversion_revision
#         },
#         'source': {
#             'url': casadef.subversion_url,
#             'revision': casadef.subversion_revision
#         },
#         'helpers': {
#             'logger': 'casalogger',
#             'viewer': 'casaviewer',
#             'info': None,
#             'dbus': None,
#             'ipcontroller': None,
#             'ipengine': None
#         },
#         'dirs': {
#             'rc': _homedir + '/.casa',
#             'data': __casapath__ + "/data",
#             'recipes': __casapath__ + "/lib/python2.7/recipes",
#             'root': __casapath__,
#             'python':  __casapath__ + "/lib/python2.7",
#             'pipeline': None,
#             'xml': __casapath__ + "/xml"
#         },
#         'flags': { },
#         'files': { 
#             'logfile': _os.getcwd( ) + '/casa-'+time.strftime("%Y%m%d-%H%M%S", time.gmtime())+'.log'
#         },
#         'state' : {
#             'startup': True,
#             'unwritable': set( )
#         }
#       }

##
## next adjust the PYTHONPATH
##
def _adapt_pythonpath(searchroot):
    # tarball location
    guess = _os.path.join(searchroot, 'lib/python2.7/site-packages/numpy')
    if _os.path.isdir(guess):
        _sys.path.append(_os.path.dirname(guess))
    else:
        for root, dirs, files in _os.walk(searchroot):
            # skip data folder which might be a network mount
            if root == searchroot and 'data' in dirs:
                del dirs[dirs.index('data')]
            if root.endswith("/numpy"):
                _sys.path.append(_os.path.dirname(root))
                break

if _re.match( r'.*/\d+\.\d+\.\d+\w*-\d+$', __casapath__ ) :
    _adapt_pythonpath(_os.path.dirname(__casapath__))
else:
    _adapt_pythonpath(__casapath__)

##
## next adjust PATH and LD_LIBRARY_PATH
##
def _setup_path():
    global __ipcontroller__, __ld_library_path__
    _rootdir = None
    if _os.path.exists(_os.path.join(__casapath__, 'bin', 'casapyinfo')):
        _rootdir = _os.path.join(__casapath__, 'bin')
    else:
        for root, dirs, files in _os.walk(__casapath__):
            # skip data folder which might be a network mount
            if root == __casapath__ and 'data' in dirs:
                del dirs[dirs.index('data')]
            if root.endswith("/bin") and "casapyinfo" in files :
                _rootdir = root
                break
    if _rootdir is None:
        return

    __ipcontroller__ = (lambda fd: fd.readline().strip('\n'))(_os.popen(_rootdir + "/casapyinfo --exec 'which ipcontroller'"))
    if _os.path.exists(__ipcontroller__) :
        _os.environ['PATH'] = _os.path.dirname(__ipcontroller__) + ":" + _os.environ['PATH']
    else :
        raise RuntimeError, "cannot configure CASA tasking system"
    __ld_library_path__ = (lambda fd: fd.readline().strip('\n').split(':'))(_os.popen(_rootdir + "/casapyinfo --exec 'echo $LD_LIBRARY_PATH'"))
    map(lambda x: _sys.path.append(x),__ld_library_path__)

_setup_path()

##
## finally load tools
##
imager = _casac.imager
imtool=imager
calibrater = _casac.calibrater
cbtool=calibrater
mstool = _casac.ms
tptool = _casac.tableplot
mptool = _casac.msplot
pmtool = _casac.plotms
cptool = _casac.calplot
qatool = _casac.quanta
tbtool = _casac.table
aftool = _casac.agentflagger
metool = _casac.measures
iatool = _casac.image
potool = _casac.imagepol
lmtool= _casac.linearmosaic
sbstool = _casac.sidebandseparator
smtool = _casac.simulator
cltool = _casac.componentlist
coordsystool = _casac.coordsys
cstool = _casac.coordsys
rgtool = _casac.regionmanager
sltool = _casac.spectralline
dctool = _casac.deconvolver
vptool = _casac.vpmanager
msmdtool = _casac.msmetadata
fitool = _casac.fitter
fntool = _casac.functional
imdtool = _casac.imagemetadata

cutool = _casac.utils
mttool = _casac.mstransformer
sdmstool = _casac.singledishms
catool = _casac.calanalysis
attool = _casac.atmosphere

from applycal import applycal
from asdmsummary import asdmsummary
from bandpass import bandpass
from blcal import  blcal
from browsetable import  browsetable
from calstat import  calstat
from clearcal import  clearcal
from clearstat import  clearstat
from concat import  concat
from conjugatevis import  conjugatevis
from cvel import  cvel
from cvel2 import  cvel2
from deconvolve import  deconvolve
from delmod import  delmod
from exportasdm import  exportasdm
from exportfits import  exportfits
from exportuvfits import  exportuvfits
from feather import  feather
from fixplanets import  fixplanets
from fixvis import  fixvis
from flagcmd import  flagcmd
from flagdata import  flagdata
from flagmanager import  flagmanager
from fluxscale import  fluxscale
from fringefit import  fringefit
from ft import  ft
from gaincal import  gaincal
from gencal import  gencal
from hanningsmooth import  hanningsmooth
from phaseshift import  phaseshift
from imcollapse import  imcollapse
from imcontsub import  imcontsub
from imdev import  imdev
from imfit import  imfit
from imhead import  imhead
from imhistory import  imhistory
from immath import  immath
from immoments import  immoments
from impbcor import  impbcor
from importatca import  importatca
from importasap import  importasap
from importasdm import  importasdm
from importfits import  importfits
from importfitsidi import  importfitsidi
from importgmrt import  importgmrt
from importmiriad import  importmiriad
from importnro import  importnro
from importuvfits import  importuvfits
from importvla import  importvla
from imrebin import  imrebin
from imreframe import  imreframe
from imregrid import  imregrid
from imsmooth import  imsmooth
from imstat import  imstat
from imsubimage import  imsubimage
from imtrans import  imtrans
from imval import  imval
from initweights import  initweights
from listcal import  listcal
from listhistory import  listhistory
from listfits import  listfits
from listobs import  listobs
from listpartition import  listpartition
from listsdm import  listsdm
from listvis import  listvis
from makemask import  makemask
from mstransform import  mstransform
from msuvbin import  msuvbin
from plotants import  plotants
from plotbandpass import  plotbandpass
from plotcal import  plotcal
from plotms import  plotms
from plotweather import  plotweather
from plotprofilemap import  plotprofilemap
from partition import  partition
from polcal import  polcal
from predictcomp import  predictcomp
from impv import  impv
from rmfit import  rmfit
from rmtables import  rmtables
from sdbaseline import  sdbaseline
from sdcal import  sdcal
from sdfit import  sdfit
from sdfixscan import  sdfixscan
from sdgaincal import  sdgaincal
from sdimaging import  sdimaging
from sdsidebandsplit import  sdsidebandsplit
from sdsmooth import  sdsmooth
from setjy import  setjy
from simalma import  simalma
from simobserve import  simobserve
from simanalyze import  simanalyze
from slsearch import  slsearch
from smoothcal import  smoothcal
from specfit import  specfit
from specflux import  specflux
from specsmooth import  specsmooth
from splattotable import  splattotable
from split import  split
#from split2 import split2
from spxfit import  spxfit
from oldstatwt import  oldstatwt
from statwt import  statwt
from tclean import  tclean
from testconcat import  testconcat
from uvcontsub import  uvcontsub
from uvcontsub3 import  uvcontsub3
from uvmodelfit import  uvmodelfit
from uvsub import  uvsub
from wvrgcal import  wvrgcal
from virtualconcat import  virtualconcat
from vishead import  vishead
from visstat import  visstat
from widebandpbcor import  widebandpbcor