from __future__ import absolute_import
from __future__ import print_function
import os
import sys
import shutil
import stat

from casatasks.private.casa_transition import *
if is_CASA6:
    from casatasks import casalog
    from casatools import ms as mstool
    from casatools import table as tbtool
else:
    from taskinit import casalog
    from taskinit import mstool
    from taskinit import tbtool

def testconcat(vislist,testconcatvis,freqtol,dirtol,copypointing):
        """
        The list of data sets given in the vis argument are concatenated into an output
        data set in concatvis without copying the bulk data of the main table.
        This is useful for obtaining the information in the merged subtables without
        actually performing a time-consuming concatenation disk.

        Keyword arguments:
        vis -- Name of input visibility files for which the subtables are to be combined
        default: none; example: vis = 'mydata.ms',
        example: vis=['src2.ms','ngc5921.ms','ngc315.ms']
        
        testconcatvis -- Name of MS that will contain the concatenated subtables
        default: none; example: testconcatvis='test.ms'
        
        freqtol -- Frequency shift tolerance for considering data to be in the same
        spwid.  The number of channels must also be the same.
        default: ''  do not combine unless frequencies are equal
        example: freqtol='10MHz' will not combine spwid unless they are
        within 10 MHz.
        Note: This option is useful to conbine spectral windows with very slight
        frequency differences caused by Doppler tracking, for example.
        
        dirtol -- Direction shift tolerance for considering data as the same field
        default: '' means always combine.
        example: dirtol='1.arcsec' will not combine data for a field unless
        their phase center differ by less than 1 arcsec.  If the field names
        are different in the input data sets, the name in the output data
        set will be the first relevant data set in the list.

        copypointing -- copy all rows of the pointing table
        default: True
        """

        ###
        #Python script
        try:
                casalog.origin('testconcat')
                t = tbtool()
                tb = tbtool()
                m = mstool()
                #break the reference between vis and vislist as we modify vis
                if(type(vislist)==str):
                        vis=[vislist]
                else:
                        vis=list(vislist)
                if((type(testconcatvis)!=str) or (len(testconcatvis.split()) < 1)):
                        raise Exception('parameter testconcatvis is invalid')
                if(vis.count(testconcatvis) > 0):
                        vis.remove(testconcatvis)

                if(os.path.exists(testconcatvis)):
                        raise Exception('Visibility data set '+testconcatvis+' exists. Will not overwrite.')
                else:
                        if(len(vis) >0): 
                                casalog.post('copying structure of '+vis[0]+' to '+testconcatvis , 'INFO')
                                # Copy procedure which does not copy the bulk data of the main table
                                t.open(vis[0])
                                tmptb = t.copy(newtablename=testconcatvis, deep=True, valuecopy=True, norows=True) # copy only table structure
                                tmptb.close()
                                t.close()
                                # copy content of subtables
                                thesubtables = [f.name for f in os.scandir(vis[0]) if f.is_dir()]
                                for subt in thesubtables:
                                        if not (subt[0]=='.'):
                                                tb.open(os.path.join(vis[0],subt))
                                                no_rows = False
                                                if (subt=='POINTING' and not copypointing):
                                                        casalog.post('*** copypointing==False: resulting MS will have empty POINTING table', 'INFO')
                                                        no_rows = True
                                                tmptb = tb.copy(os.path.join(testconcatvis,subt), deep=False, valuecopy=True, norows=no_rows)
                                                tmptb.close()
                                                tb.close()
                                vis.remove(vis[0])
                # determine handling switch value
                handlingswitch = 1
                if not copypointing:
                        handlingswitch = 3
        
                m.open(testconcatvis,False) # nomodify=False to enable writing
        
                for elvis in vis : 
                        casalog.post('concatenating subtables from '+elvis+' into '+testconcatvis , 'INFO')

                        m.concatenate(msfile=elvis,freqtol=freqtol,dirtol=dirtol,handling=handlingswitch)

                        m.writehistory(message='taskname=testconcat',origin='testconcat')
                        m.writehistory(message='vis         = "'+str(testconcatvis)+'"',origin='testconcat')
                        m.writehistory(message='concatvis   = "'+str(elvis)+'"',origin='testconcat')
                        m.writehistory(message='freqtol     = "'+str(freqtol)+'"',origin='testconcat')
                        m.writehistory(message='dirtol      = "'+str(dirtol)+'"',origin='testconcat')
                        m.writehistory(message='copypointing = "'+str(copypointing)+'"',origin='concat')

                m.close()

        except Exception as instance:
                print('*** Error ***',instance)
                raise Exception(instance)