#! /usr/bin/env python
from api_wrapper import api_onelevel
from ppclass import separatenames,inspect
from optparse import OptionParser ### TBR by argparse
import numpy as np
# -----------------------------------------------------------------------
# A simple script to call the API program to interpolate mesoscale files
# ... NB: API_WRAPPER necessary with api compiled with f2py
# Author: A. Spiga 04/2013
# -----------------------------------------------------------------------

# default settings
# ---------------- 
defitp = 4
deflvl = "0.1"

# define parser with version and usage 
# ------------------------------------
parser = OptionParser()
parser.version = \
'''***********************************************
******** EXAPI (for help: exapi.py -h) ********
***********************************************'''
parser.usage = \
'''exapi.py [options] netCDF file(s)'''
parser.print_version()

# define options and get options+arguments
# ----------------------------------------
parser.add_option('-v','--var',action='store',dest='var',type="string",default=None,help='Variables processed. Not used means all variables. tk,tpot,uvmet can be requested.')
parser.add_option('-i','--interp',action='store',dest='itp',type="int",default=defitp,help='Mode: 2=press /  3=z-amr / 4=z-als (default)')
parser.add_option('-l','--level',action='store',dest='lvl',type="string",default=deflvl,help='Levels: start[,stop,step] (-i 2: Pa)(-i 3,4: km)')
parser.add_option('-o','--output',action='store',dest='output',type="string",default=None,help="name of output files")
parser.add_option('-d','--directory',action='store',dest='folder',type="string",default=None,help="directory of output files")
(opt,args) = parser.parse_args()

# get variables
# if None, take all!
# ------------------
if opt.var is None: 
  ze_process = "all"
  zevars = None
else: 
  ze_process = "list"
  # (we start by unravelling user input in an array)
  zevars = separatenames(opt.var)
  # (we help a little the user about naming certain variables)
  for i in range(len(zevars)):
    if zevars[i] in ['t','temp','temperature']: zevars[i] = 'tk'
    elif zevars[i] in ['T','temppot','theta']: zevars[i] = 'tpot'
    elif zevars[i] in ['u','v','U','V','Um','Vm','uv','UV','wind']: zevars[i] = 'uvmet'
  # (we recombine them all for call to api)
  list = ""
  for el in zevars: list = list + el + ","
  zevars = list

# get the kind of interpolation
# -----------------------------
inputnvert = separatenames(opt.lvl)

# prepare levels: one-level only
# ------------------------------
if len(inputnvert) == 1:
    zelevel = float(inputnvert[0])
    ze_interp_levels = [-9999.]

# prepare levels: several levels
# ------------------------------
elif len(inputnvert) > 1:
    # initialize. make number of interp levels to 20 if not given.
    zelevel = -99.
    start = float(inputnvert[0])
    stop = float(inputnvert[1])
    if len(inputnvert) == 2:  numsample = 20
    else:                     numsample = float(inputnvert[2])
    # make the interval. either normal -- or log if pressure.
    if stop > start:
        # altitude coordinates
        ze_interp_levels = np.linspace(start,stop,numsample)
    else:
        # pressure coordinates
        ze_interp_levels = np.logspace(np.log10(start),np.log10(stop),numsample)

# main api call
# -------------
for file in args:
    print "EXAPI: working on file",file 
    newname = api_onelevel ( \
        path_to_input = '', \
        path_to_output = None, \
        input_name = file, \
        output_name = opt.output, \
        fields = zevars, \
        interp_method = opt.itp, \
        interp_level = ze_interp_levels, \
        onelevel = zelevel, \
        process = ze_process )
    print "EXAPI: inspect the new file."
    inspect(newname)
    print "EXAPI: OK. done with this file."
    


