#! /usr/bin/env python3
# -*- coding: iso-8859-15 -*-
from gravi_reduce import (log, ERROR, WARNING, NOTICE, set_verbose_type)
from gravi_reduce import gravi_esorex as ge
import time
import os
import glob
import argparse
import string

usage = """
description:
  Average all P2VMREDUCED file into OIFITS files
"""

examples = """
examples:
 
"""

#
# Implement options
#

parser = argparse.ArgumentParser(description=usage, epilog=examples,formatter_class=argparse.RawDescriptionHelpFormatter)
TrueFalse = ['TRUE','FALSE']
TrueFalseOverwrite = ['TRUE','FALSE','OVERWRITE']

parser.add_argument("--loop", dest="loop",default='FALSE',choices=TrueFalse,
                  help="Run in loop every 10 seconds [FALSE]")

parser.add_argument("--averaged-dir", dest="averageddir", default="averaged",
                  help="Directory for products [averaged/]")


parser.add_argument("--commoncalib-dir", dest="commoncalibdir", default="../../common_calibration",
                  help="Add this directory in the search path for calibration files,"
                  "in addition of current and averaged/   [../../common_calibration]")

parser.add_argument("--vis", dest="vis",default='TRUE',choices=TrueFalse,
                  help="Reduce the object into visibility [TRUE]")

parser.add_argument("--tf", dest="tf",default='FALSE',choices=TrueFalse,
                  help="Compute transfer function [FALSE]")

parser.add_argument("--viscal", dest="viscal",default='FALSE',choices=TrueFalseOverwrite,
                  help="Calibrate vis from tf [FALSE]")

#
# esorex recipe options (minimal support)
#

options =[['gravity_vis.snr-min-ft',None],
          ['gravity_vis.state-min-ft',None],
          ['gravity_vis.tracking-min-sc',None],
          ['gravity_vis.vfactor-min-sc',None],
          ['gravity_vis.vis-correction',None],
          ['esorex.msg-level','info'],
          ['esorex.time','TRUE'],
          ['esorex.recipe-dir',None]]

ge.implement_recipe_options (parser,options)
    
#
# Main program
#

if __name__ == "__main__":
    ##
    # Parse arguments
    argoptions = parser.parse_args()
    
    ##
    # Propagate esorex verbose to python logging system
    msg_level = vars(argoptions)['esorex.msg-level']
    if msg_level == 'error':
        set_verbose_type(ERROR)
    elif msg_level == 'warning':
        set_verbose_type(ERROR+WARNING)
    else:    
        set_verbose_type(ERROR+WARNING+NOTICE)

    ##
    # Load directories
    commoncalibdir = argoptions.commoncalibdir
    averageddir = argoptions.averageddir
    calibrateddir = averageddir+"/calibrated"
        
    # Load the current directory, the averaged and the common
    raw = []
    ge.add_gravity (raw, glob.glob('GRAVI*fits'))
    
    averaged = []
    ge.add_gravity (averaged, glob.glob(averageddir+'/GRAVI*fits'))
    
    common = []
    ge.add_gravity (common, glob.glob(commoncalibdir+'/GRAVI*fits'))

    # Loop every 10s during 24h maximum
    dtime = 10
    if argoptions.loop=='TRUE':
        Nloop = int(24*3600./dtime)
    else:
        Nloop = 1

    # Start loop
    dhash = [0]
    loop_counter = 0
    while loop_counter<Nloop:

        # Check if new file
        if not ge.new_file_in_dir(".", dhash):
            log("wait %d'' for new file"%dtime, 1, NOTICE)
            time.sleep(dtime)
            loop_counter += 1
            continue

        # Load files (will only load new ones)
        ge.add_gravity (raw, glob.glob('GRAVI*fits'))
        
        # Average the OBJECT
        if argoptions.vis=='TRUE':
            ge.add_gravity (averaged, glob.glob(averageddir+'/GRAVI*fits'))
            ge.average_p2vmred (raw, averageddir, options=argoptions)

        # Compute the TF
        if argoptions.tf=='TRUE':
            ge.add_gravity (averaged, glob.glob(averageddir+'/GRAVI*.fits'))
            ge.compute_tf (averaged, common, calibrateddir)
            
        # Calibrate the visibilities (overwrite since new TF may have been created)
        if argoptions.viscal=='TRUE' or argoptions.viscal=='OVERWRITE':
            ge.add_gravity (averaged, glob.glob(averageddir+'/GRAVI*.fits'))
            calibrated = []
            ge.add_gravity (calibrated, glob.glob(calibrateddir+'/GRAVI*.fits'))
            ge.calibrate_vis (averaged, calibrated, calibrateddir, overwrite=True if argoptions.viscal=='OVERWRITE' else False)

        # For the loop        
        loop_counter += 1
