#ifndef __TEXTSET_H
#define __TEXTSET_H

#ifndef __REPORT_H
#include <report.h>
#endif

///////////////////////////////////////////////////////////
// TText_recordset
// Classe virtuale per gestire file di testo generici
///////////////////////////////////////////////////////////

enum TQuery_type { _qt_none, _qt_select, _qt_create };

class TText_recordset : public TRecordset
{
  TRecnotype _curr;
  TString_array _rec;

protected:
  TString _query;
  TRecordset_column_info _info; // Informazioni sull'unica colonna esistente

protected:
  virtual TQuery_type parse_query(const char* query, TFilename& table);
  virtual bool load_file(const TFilename& n);
  TToken_string& row(TRecnotype n = -1) const;

public:
  virtual unsigned int columns() const { return 1; }
  virtual const TRecordset_column_info& column_info(unsigned int) const { return _info; }
  virtual const TRecordset_column_info& column_info(const char* column) const;
  virtual int find_column(const char* column) const;

  virtual TRecnotype items() const;
  virtual bool move_to(TRecnotype pos);
  virtual TRecnotype current_row() const { return _curr; }
  virtual void requery();
  virtual const TVariant& get(unsigned int column) const;

public:
  virtual const TString& query_text() const { return _query; }

  virtual bool destroy(TRecnotype r = -1);
  virtual TRecnotype new_rec(const char* buf = NULL);
  virtual bool set(unsigned int fld, const TVariant& var);
  virtual bool set(const char* fld, const TVariant& var);
  virtual bool exec(const char* query);

  virtual bool save_as_text(const char* path);
  virtual bool save_as(const char* path, TRecordsetExportFormat fmt = fmt_text);

  TText_recordset(const char* query);
};

///////////////////////////////////////////////////////////
// TCSV_recordset
// Classe per file di testo con campi separati da virgola (o altro separatore)
///////////////////////////////////////////////////////////

class TCSV_recordset : public TText_recordset
{
  char _separator;
  TArray _trc;

protected:
  virtual TQuery_type parse_query(const char* query, TFilename& table);

public:
  virtual unsigned int columns() const;
  virtual const TRecordset_column_info& column_info(unsigned int column) const;
  virtual const TVariant& get(unsigned int column) const;
  virtual TRecnotype new_rec(const char* buf = NULL);
  virtual bool set(unsigned int fld, const TVariant& var);
  virtual bool load_file(const TFilename& n);

public:
  TCSV_recordset(const char* query);
};

///////////////////////////////////////////////////////////
// TAS400_recordset
// Classe per file di testo con record a lunghezza fissa
///////////////////////////////////////////////////////////

struct TAS400_column_info : public TRecordset_column_info
{
  TVariant _default;
  bool _required;

  TAS400_column_info() : _required(false) { }
};

class TAS400_recordset : public TText_recordset
{
protected:
  TAS400_column_info _key;
  TAssoc_array _trc;

protected:
  virtual TQuery_type parse_query(const char* query, TFilename& table);
  virtual bool load_file(const TFilename& n);
  virtual int find_column(const char* column) const;

  virtual bool save_as_text(const char* path);

  TAS400_column_info* parse_field(const char* column, int& c, bool create);
  bool set_field(const TAS400_column_info& fi, const TVariant& var);
  
public:
  virtual TRecnotype new_rec(const char* buf = NULL);
  virtual bool set(const char* column, const TVariant& var);
  
  virtual const TRecordset_column_info& column_info(const char* colunmn) const;
  virtual const TVariant& get(const char* colunmn) const;

public:
  bool create_field(const char* name, int pos, int len, TFieldtypes t = _alfafld, 
                    bool required = false, const TVariant& def = NULL_VARIANT);

  int record_length() const { return _info._width; }
  int key_length() const    { return _key._width; }
  int key_position() const  { return _key._pos; }
  virtual const TString& rec_type(TRecnotype r = -1) const;

  TAS400_recordset(const char* query);
};

#endif