#!/usr/bin/env python
"""
$Id: ebas_read_example.py 1737 2017-07-14 13:36:19Z pe $

Example for reading an EBAS_1.1 NasaAmes datafile.
"""
import sys
import logging
from ebas.commandline import EbasCommandline
from ebas.io.file import nasa_ames

__version__ = '1.00.00'

def add_private_args(parser, cmdline):  # pylint: disable=W0613
    # W0613: Unused argument 'cmdline'
    """
    Callback function for commandline.getargs(). Adds private commandline
    arguments.

    Parameters:
        parser    root parser object from commandline.getargs()
    Returns:
        None
    """
    parser_input_group = parser.add_argument_group('input options')
    parser_input_group.add_argument(
        'filenames', nargs='*', help='input file(s), EBAS NASA-Ames format')

def ebas_read_example(cmdline):
    """
    Main program for ebas_read_example
    Created for lexical scoping.

    Parameters:
        cmdline   EbasCommandline object (wrapper)
    Returns:
        none
    """
    logger = logging.getLogger('ebas_read_example')
    args = cmdline.args

    exitcode = 0 # number of failed files (max 255)
    for filename in args.filenames:
        nas = read_file(cmdline, logger, filename)
        if nas is None:
            exitcode += 1
        else:
            use_file_example(nas, args.time)
    exitcode = min(255, exitcode)
    sys.exit(exitcode)

def read_file(cmdline, logger, filename):
    """
    Reads a single file.
    Parameters:
        cmdline   EbasCommandline object (wrapper)
        logger    logger object
        filename  filename (including path) of file to be read
    Returns:
        EbasNasaAmes file object or None in case of erros.
    """
    nas = nasa_ames.EbasNasaAmes()
    nas_opt = cmdline.get_custom_args('NASA_READ')
    try:
        nas.read(filename, **nas_opt['nas_read'])
    except (IOError, nasa_ames.EbasNasaAmesReadError) as excpt:
        logger.error("file {}: {}".format(filename, str(excpt)))
        return None
    return nas

def use_file_example(nas, time):
    """
    Example for usage of an i/o object after reading it from file.
    Prints some extracted data to stdout.
    Parameters:
        nas    nasa ames i/o object
        time   time interval for printing values
    Returns:
        None
    """
    # print info about the tile axis:
    time_index = nas.find_sample_time_index(time)
    if time_index:
        print(("\nfound {} samples for time criteria ({}):".format(
            (time_index[1]-time_index[0]+1), time)))
        for tim in range(time_index[0], time_index[1]+1):
            print((" {} - {}".format(nas.sample_times[tim][0],
                                     nas.sample_times[tim][1])))
    else:
        print("\nno sample time found for time criteria ({})".format(time))

    # print info about variables:
    for i in range(len(nas.variables)):
        print("\nVariable {}: {}".format(i+1, nas.vname(i)[0]))
        vmeta = nas.metadata.copy()
        vmeta.update(nas.variables[i].metadata)
        print("   all metadata for variable: {}".format(vmeta))

    if nas.variables:
        print("Example data handling, first variable: {}".format(nas.vname(0)[0]))

        if time_index:
            print("\n  example output for time and variable (including flags):")
            for tim in range(time_index[0], time_index[1]+1):
                print(("   {} - {}, value={}, flags={}".format(
                    nas.sample_times[tim][0],
                    nas.sample_times[tim][1],
                    nas.variables[0].values_[tim],
                    nas.variables[0].flags[tim])))
            print ("\n  example output for time and variable (w/o flags - "
                   "valid values only):")
            for tim in range(time_index[0], time_index[1]+1):
                print(("   {} - {}, value={}".format(
                    nas.sample_times[tim][0], nas.sample_times[tim][1],
                    nas.values_without_flags(0)[tim])))

    # look for specific variable
    # PCB_118,Statistics=arithmetic mean
    for i in nas.find_variables({'comp_name': 'PCB_118',
                                 'statistics': 'arithmetic mean'}):
        print(('\n found variable PCB_118, Statistics=arithmetic mean: '
               'var_index={}'.format(i)))

    # look for specific variable
    # ozone, in nmol/mol
    for i in nas.find_variables({'comp_name': 'ozone',
                                 'unit': 'nmol/mol'}):
        print(('\n found variable ozone, nmol/mol: '
               'var_index={}'.format(i)))
    # ozone, in ug/m3
    for i in nas.find_variables({'comp_name': 'ozone',
                                 'unit': 'ug/m3'}):
        print(('\n found variable ozone, ug/m3: '
               'var_index={}'.format(i)))

    # ec/oc find variable witth Fraction=OC2
    for i in nas.find_variables({
            'comp_name': 'organic_carbon',
            'characteristics': {'Fraction': 'OC2'}}):
        print(('\n found variable organic_carbon, Fraction=OC2: '
               'var_index={}'.format(i)))
    # ec/oc find all variable where characteristics Fraction is set
    # (no matter which value)
    for i in nas.find_variables({
            'comp_name': 'organic_carbon',
            'characteristics': {'Fraction': True}}):
        print(('\n found variable organic_carbon, with any Fraction: '
               'var_index={}'.format(i)))
    # ec/oc find variable organic_carbon, arithmetic mean, without a characteristic
    # Fraction or Artifact specified
    for i in nas.find_variables({
            'comp_name': 'organic_carbon',
            'statistics': 'arithmetic mean',
            'characteristics': {'Fraction': False, 'Artifact': False}}):
        print(('\n found variable organic_carbon, arithmetic mean, without '
               'any Fraction or Artifact: var_index={}'.format(i)))

                                 
EbasCommandline(
    ebas_read_example,
    custom_args=['CONFIG', 'LOGGING', 'TIME_CRIT', 'NASA_READ'],
    private_args=add_private_args,
    help_description='%(prog)s example for reading a NasaAmes datafile.',
    version=__version__).run()