from __future__ import absolute_import
import os
import re

# get is_CASA6 and is_python3
from casatasks.private.casa_transition import *
if is_CASA6:
    from casatools import singledishms, calibrater, agentflagger, ms
    from casatasks import casalog
    from .mstools import write_history

    mysdms = singledishms( )
    mycb = calibrater( )
    myms = ms( )
else:
    from taskinit import *
    from mstools import write_history
    from casac import casac

    agentflagger = casac.agentflagger

    mysdms, mycb, myms = gentools(['sdms', 'cb', 'ms'])

def importasap(infile=None, outputvis=None, flagbackup=None, overwrite=None, parallel=None):
    """
    """
    casalog.origin('importasap')

    try:
        if infile is None or outputvis is None:
            raise RuntimeError('Error: infile and outputvis must be specified.')

        # default value
        if flagbackup is None:
            flagbackup = True

        if overwrite is None:
            overwrite = False

        # basic check
        if os.path.exists(outputvis) and not overwrite:
            raise RuntimeError('%s exists.'%(outputvis))
        
        if not _is_scantable(infile):
            raise RuntimeError('%s is not a valid Scantable.'%(infile))

        # import
        status = mysdms.importasap(infile, outputvis, parallel)

        if status == True:
            # flagversions file must be deleted 
            flagversions = outputvis.rstrip('/') + '.flagversions'
            if os.path.exists(flagversions):
                os.system('rm -rf %s'%(flagversions))

            # initialize weights using cb tool
            mycb.open(outputvis, compress=False, addcorr=False, addmodel=False)
            mycb.initweights(wtmode='nyq')

            # create flagbackup file if user requests it
            if flagbackup == True:
                aflocal = agentflagger( )
                aflocal.open(outputvis)
                aflocal.saveflagversion('Original',
                                        comment='Original flags at import into CASA using importasap',
                                        merge='save')
                aflocal.done()
        else:
            raise RuntimeError('Failure in importasap')

        # Write history to output MS
        param_names = importasap.__code__.co_varnames[:importasap.__code__.co_argcount]
        if is_python3:
            vars = locals()
            param_vals = [vars[p] for p in param_names]
        else:
            param_vals = [eval(p) for p in param_names]
        write_history(myms, outputvis, 'importasap', param_names,
                      param_vals, casalog)

    finally:
        mycb.close()


def _is_scantable(filename):
    """
    Check if given data is Scantable or not
    """
    ret = False
    if os.path.isdir(filename) and os.path.exists(filename+'/table.info') \
        and os.path.exists(filename+'/table.dat'):
        with open(filename+'/table.info') as f:
            l=f.readline()
            f.close()
        match_pattern = '^Type = (Scantable)? *$'
        ret = re.match(match_pattern, l) is not None
    return ret