"""
The 'General Time Series Data Format', gtsdf, is a binary hdf5 data format for storing time series data,\n
specified by \n
Mads M. Pedersen (mmpe@dtu.dk), DTU-Wind Energy, Aeroelastic design (AED)

Features:

-    Single file
-    Optional data type, e.g. 16bit integer (compact) or 64 bit floating point (high precision)
-    Precise time representation (including absolute times)
-    Additional data blocks can be appended continuously
-    Optional specification of name and description of dataset
-    Optional specification of name, unit and description of attributes
-    NaN support

This module contains three methods:

- load_
- save_
- append_block_

.. _load: gtsdf.html#gtsdf.load
.. _save: gtsdf.html#gtsdf.save
.. _append_block: gtsdf.html#gtsdf.append_block

"""
from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()

d = None
d = dir()

from .gtsdf import save
from .gtsdf import load
from .gtsdf import append_block
from .gtsdf import load_pandas
from .gtsdf import add_statistic
from .gtsdf import load_statistic
from .gtsdf import compress2statistics

class Dataset(object):
    def __init__(self, filename):
        self.filename = filename
        self.time, self.data, self.info = load(filename)
    def __call__(self, id):
        if isinstance(id, str):
            if id=="Time":
                return self.time
            else:
                return self(self.info['attribute_names'].index(id) + 2)
        if id == 1:
            return self.time
        else:
            return self.data[:, id - 2]
        
    def attribute_names_str(self):
        return "\n".join(["1: Time"]+["%d: %s"%(i,n) for i, n in enumerate(self.info['attribute_names'],2)])
    
    def __getattribute__(self, name):
        try:
            return object.__getattribute__(self, name)
            
        except Exception as e:
            try:
                return self(name)
            except:
#                 for i, n in enumerate(self.info['attribute_names']):
#                     print (i,n)
                raise e
    
    def __contains__(self, name):
        return name in self.info['attribute_names']


__all__ = sorted([m for m in set(dir()) - set(d)])