//
// C++ Interface: %{MODULE}
//
// Description:
//
//
// Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR}
//
// Copyright: See COPYING file that comes with this distribution
//
//
#ifndef HDF5FILEDATA_H
#define HDF5FILEDATA_H

#include <string.h>
#include <vector>
#include <map>
#include "filedatareader.h"
#include "hdf5.h"

using namespace std;

/**
@author James MANLEY
*/
class HDF5FileData : public FileDataReader{
public:
    HDF5FileData(const string &name = string(""), const string &mode = string("r"));

    virtual ~HDF5FileData();

    virtual void* read_data(void* data,
                            const char* sds_name,
                            int * start=NULL,
                            int * stride=NULL,
                            int *edges=NULL,
                            int rank=-1);

    virtual vector<int> get_dataset_dimension(const string &sds_name);

    virtual void get_dataset_fill_value(const string &sds_name, void* fill_value);

    virtual int get_n_dataset();

    virtual string get_dataset_name(int i);

    virtual int get_dataset_data_type(string sds_name);

    virtual string get_values_attr_dataset(string sds_name,string attr_name);

    virtual bool has_attr_dataset(string sds_name,string attr_name);

    virtual string get_values_attr(string attr_name);

    virtual bool has_attr(string attr_name);

    /**
    * @brief closes the file
    */
    virtual void close_data_file();

    /**
    * @brief open the file
    */
    virtual void open_data_file();

    void get_fillValue(const string &sds_name, void *fillValue);

    void get_scaling(const string &sds_name, float64 &scale, float64 &offset);

protected:
    string name;

    void read_all_dataset();

    hid_t file_id;

    map<string,hid_t> dataset_map;
    vector<string>    dataset_vect;
    vector<hid_t>     attributes;
    map<string,string> attribute;
    bool read_dataset_done;

    void free_read_write_allocations( const bool *are_limits_initialized, int *start, int *stride, int *edges );
    const bool check_read_write_limits(const char* sds_name, int *start, int *stride, int *edges, const int rank);
    void init_read_write_null_input_param(const char* sds_name, int *&start, int *&stride, int *&edges, int &rank, bool * initialized_values);
    void read_line(string line, string &tag, string &value);
    void read_metadata();

    void trim(string &token);
    void split(const string& str, vector<string>& tokens, const string& delimiters );
};
#endif