from __future__ import absolute_import
import shutil
import os

from casatasks.private.casa_transition import is_CASA6
if is_CASA6:
    from casatools import componentlist, measures, quanta, ms, table
    from casatasks import casalog
    from .setjy_helper import testerrs
    from . import solar_system_setjy as SSSetjy

    _qa = quanta()
else:
    from taskinit import *
    from setjy_helper import *
    import solar_system_setjy as SSSetjy

    # not a local tool
    _qa = qa

def predictSolarObjectCompList(objname, epoch, freqs, prefix):
    """
    predictcomp functionality using the new models
    set flux density of a solar system object using Bryan Butler's new
    python model calculation code.
    """
    retval = True
    cleanupcomps = False # leave genenerated cl files
    nfreqs=-1

    if is_CASA6:
        myms = ms( )
        mytb = table( )
        mycl = componentlist( )
        myme = measures( )
    else:
        (myms, mytb, mycl, myme) = gentools(['ms','tb','cl','me'])

    #freqinc=freqs[0]*1e-6
    if len(freqs) == 1:
      freqinc=freqs[0]*1e-4
    else:
      freqinc=abs(freqs[1]-freqs[0])*1e-2
    freqlist=[]
    for freq in freqs:
      minf = freq-freqinc
      maxf = freq+freqinc
      freqlist.append([minf,maxf]) 
    #mepoch = myme.epoch('UTC', epoch)
    if epoch['m0']['value']==0.0:
        casalog.post('Invalid epoch, '+str(epoch['m0']['value'])+str(epoch['m0']['unit']),'SEVERE');
        raise Exception("Error")
    epochv = epoch['m0']['value'] 


    # turn user input epoch to mjd

    #casalog.post("sending objname={} epochv={} freqlist={}".format(objname, epochv, freqlist)
    observatory='ALMA'
    ss_setjy=SSSetjy.solar_system_setjy()
    (errcodes, fluxes, fluxerrs, sizes, dirs)=\
       ss_setjy.solar_system_fd(source_name=objname, MJDs=[epochv], frequencies=freqlist, observatory=observatory, casalog=casalog)
  
    #casalog.post("fluxes from ss_setjy={}".format(fluxes))
    #if errcodes[0][0] > 0:
    #    raise ValueError("cannot determined flux")
    
    reterr=testerrs(errcodes[0],objname) 
    if reterr == 2: 
        #raise Exception, "Error" 
        casalog.post("Flux densities cannot be determined","SEVERE")
        raise Exception

    dirstring = [dirs[0]['refer'],_qa.tos(dirs[0]['m0']),_qa.tos(dirs[0]['m1'])]
    # setup componentlists
    # need to set per dir
    # if scalebychan=F, len(freqs) corresponds to nspw selected

    #clpath='/tmp/'
    clpath='./'
    # use the first input frequency
    freqlabel = '%.3fGHz' % (freqs[0]/1.e9)
    tmlabel = '%.1fd' % epoch['m0']['value']
    clabel = objname+'_spw0_'+freqlabel+'_'+tmlabel
    clname = clabel+'.cl'
    if prefix: clname=prefix+clname

    if(os.path.exists(clname)):
        casalog.post("Removing previous cl file, {}".format(clname))
        try:
            shutil.rmtree(clname)
        except:
            casalog.post("shutil.rmtree failed")
    index= 2.0
    sptype = 'spectral index'
    #index= 0.0
    #sptype = 'constant'
    
    #casalog.post("fluxes={}".format(fluxes))
    #casalog.post("fluxerrs-={}".format(fluxerrs))
    #casalog.post("sizes={}".format(sizes))
    #casalog.post("dirs={}".format(dirs))
    mycl.addcomponent(flux=fluxes[0][0],fluxunit='Jy', polarization="Stokes", dir=dirs[0],
         shape='disk', majoraxis=str(sizes[0][0])+'arcsec', minoraxis=str(sizes[0][1])+'arcsec',
    #     positionangle=str(sizes[0][2])+'arcsec', freq=['LSRK',str(freqs[0])+'Hz'],
         positionangle=str(sizes[0][2])+'arcsec', freq=['TOPO',str(freqs[0])+'Hz'],
         spectrumtype=sptype, index=index, label=clabel)
    # set tabular, use original input freqs
    if len(freqs)>1:
        mycl.setspectrum(which=0, type='tabular', tabularfreqs=freqs, tabularflux=fluxes[0],
                           tabularframe='TOPO')

    mycl.rename(clname)
    mycl.close(False)
    return (clname)