#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import argparse
import os
from astropy import log
from astroquery.eso import Eso
import numpy as np


if __name__ == '__main__':
    
    parser = argparse.ArgumentParser(description='Get Gravity data from specified night')
    parser.add_argument('-q', '--queryonly', action='store_true', help='Only print out the datasets for the given night')
    parser.add_argument('username', type=str, help='User name to access the ESO archive')
    parser.add_argument('night', type=str, help='night with format "YYYY-MM-DD"')
    parser.add_argument('--start', type=str, default='1970-01-01T00:00:00', help='start time within the night')
    parser.add_argument('--stop', type=str, default='2100-01-01T00:00:00', help='stop time within the night')
    args = parser.parse_args()
    
    eso = Eso()
    
    eso.ROW_LIMIT = -1
    eso.QUERY_INSTRUMENT_URL = 'http://archive.eso.org/wdb/wdb/cas'
    
    eso.login(args.username)
    
    log.info('Querying night {0}...'.format(args.night))
    table = eso.query_instrument('gravity', night=args.night.replace('-',' '), order='dp_id', columns=['ins_sobj_name','night'], cache=False)
    
    date_obs = np.array([d.strip().replace(' ','T') for d in table['DATE OBS']], dtype='M8[s]')
    mask = (date_obs >= np.datetime64(args.start, dtype='M8[s]')) & (date_obs <= np.datetime64(args.stop , dtype='M8[s]'))
    table = table[mask]
    
    if args.queryonly:
        table.remove_columns(['Object',
                              'OBS.TARG.NAME',
                              'Target l b',
                              'Target Ra Dec',
                              'RA', 'DEC',
                              'OB.ID',
                              'TPL.START',
                              'INS.POLA.MODE',
                              'ISS.CONF.STATION1',
                              'ISS.CONF.STATION2',
                              'ISS.CONF.STATION3',
                              'ISS.CONF.STATION4',
                              'DIMM Seeing-avg'])
        table.pprint(max_lines=-1, max_width=-1)
    else:
        log.info('Retrieveing data from archive...')
        destination = os.path.join(os.getcwd(), args.night)
        print(destination)
        if not os.path.exists(destination):
            os.makedirs(destination)
        eso.retrieve_data(table['DP.ID'], destination=destination)
    
    log.info('Done!')
