from taskinit import mstool, tbtool, casalog
from mstools import write_history
import flaghelper

def statwt(
    vis, selectdata, field, spw, intent, array, observation, scan,
    combine, timebin, slidetimebin, chanbin, minsamp, statalg,
    fence, center, lside, zscore, maxiter, fitspw, excludechans,
    wtrange, flagbackup, preview, datacolumn
):
    try:
        casalog.origin('statwt')
        casalog.post(
            "vis " + vis + " selectdata " + str(selectdata) + " field " + str(field) + " spw "
            + str(spw), 'NORMAL'
        )
        casalog.post(
            "intent " + intent + " array " + array + " observation " + observation
            + "scan" + scan, 'NORMAL'
        )
        casalog.post("combine " + combine + " timebin " + str(timebin), 'NORMAL')
        if not selectdata:
            # CAS-10761, requirement provided by Urvashi
            if field or spw or intent or array or observation:
                casalog.post(
                    "selectdata=False, any explicitly set data "
                    + "selection parameters will be ignored",
                    "WARN"
                )
            field = ""
            spw = ""
            intent = ""
            array = ""
            observation = ""
            scan = ""
        if (flagbackup):
            if (preview):
                casalog.post(
                    "Running in preview mode. No flags will be "
                    + "modified, so existing flags will not be backed up."
                )
            else:
                casalog.post('Backup original flags before applying new flags')
                flaghelper.backupFlags(aflocal=None, msfile=vis, prename='statwt')
        myms = mstool()
        myms.open(vis, nomodify=preview)
        sel = {}
        sel['spw'] = spw
        #sel['time'] = timerange
        sel['field'] = field
        #sel['baseline'] = antenna
        sel['scan'] = scan
        sel['scanintent'] = intent
        #sel['polarization'] = correlation
        #sel['uvdist'] = uvrange
        sel['observation'] = str(observation)
        sel['array'] = array
        #sel['feed'] = feed
        # Select the data. Only-parse is set to false.
        myms.msselect(sel, False)
        
        rval = None
        rval = myms.statwt(
            combine=combine, timebin=timebin,
            slidetimebin=slidetimebin, chanbin=chanbin,
            minsamp=minsamp, statalg=statalg, fence=fence,
            center=center, lside=lside, zscore=zscore,
            maxiter=maxiter, fitspw=fitspw, excludechans=excludechans,
            wtrange=wtrange, preview=preview, datacolumn=datacolumn
        )
        
        # Write to HISTORY of MS
        if rval != None and preview == False:
            # Write history to MS
            try:
                param_names = statwt.func_code.co_varnames[:statwt.func_code.co_argcount]
                param_vals = [eval(p) for p in param_names]
                write_history(mstool(), vis, 'statwt', param_names,
                              param_vals, casalog)
            except Exception, instance:
                casalog.post("*** Error \'%s\' updating HISTORY" % (instance),
                             'WARN')            
            
        return rval
    except Exception, instance:
        casalog.post( '*** Error ***'+str(instance), 'SEVERE' )
        raise
    finally:
        myms.done()