import callhorizons

from astroquery.vizier import Vizier
from astropy.coordinates import SkyCoord
from astropy import units as u
from astropy.coordinates import Angle
from numpy import asarray, column_stack

def Horizons(julian_date, obj_name):
    asteroid = callhorizons.query(obj_name, cap=False)
    asteroid.set_discreteepochs(julian_date)
    asteroid.get_ephemerides(168)

    return ([[asteroid['RA'][0], asteroid['DEC'][0]]])


def Obj_RaDec(use_horizons, Object, JD, Ra_man, Dec_man):
    if use_horizons == 'yes':
        Object_RA_DEC_Est = Horizons(JD, Object)
    else:
        Object_RA_DEC_Est = [[Ra_man, Dec_man]]

    return Object_RA_DEC_Est

def get_URAT(RA, DEC, R, Max_Length):
    ##make astropy SkyCoord object
    c = SkyCoord(ra=RA*u.degree, dec=DEC*u.degree, frame='icrs')
    ##set search cone
    a = Angle(R * u.deg)    
    ##set columns
    V = Vizier(columns=['_RAJ2000', '_DEJ2000', 'Bmag', 'e_Bmag', 'Vmag', 'e_Vmag', \
                        'gmag', 'e_gmag', 'rmag', 'e_rmag', 'imag', 'e_imag', 'pmRA', 'pmDE'], \
                        column_filters={'Bmag':'>0', 'Vmag':'>0', 'gmag':'>0', 'rmag':'>0', 'imag':'>0',\
                                        'Nn':'>0', 'No':'>0', 'pmRA':'>-20 & <20', 'pmDE':'>-20 & <20'})
    ##set limit of rows, sort by distance default
    V.ROW_LIMIT=Max_Length
    ##get data
    Vizier_result = V.query_region(c, radius=a, catalog=['I/329'])
    Vizier_stars = Vizier_result[0]
    Vizier_stars = asarray(Vizier_stars)
    ##make numpy array with data
    Catalog = column_stack((Vizier_stars['_RAJ2000'], Vizier_stars['_DEJ2000'], \
                                 Vizier_stars['Bmag'], Vizier_stars['e_Bmag'],\
                                 Vizier_stars['Vmag'], Vizier_stars['e_Vmag'],\
                                 Vizier_stars['gmag'], Vizier_stars['e_gmag'],\
                                 Vizier_stars['rmag'], Vizier_stars['e_rmag'],\
                                 Vizier_stars['imag'], Vizier_stars['e_imag'],\
                                 Vizier_stars['pmRA'], Vizier_stars['pmDE']))
    return Catalog

    
