#ifndef __CALIB01_H
#define __CALIB01_H

#ifndef __AUTOMASK_H
#include <automask.h>
#endif

#ifndef __MULTIREC_H
#include <multirec.h>
#endif

#ifndef __RELAPP_H
#include <relapp.h>
#endif

#ifndef __CGLIB03_H
class TBill;
#endif

///////////////////////////////////////////////////////////
//  TConfig_anal
///////////////////////////////////////////////////////////

TConfig& ca_config();

///////////////////////////////////////////////////////////
//  TConfig_anal
///////////////////////////////////////////////////////////

class TMultilevel_code_info : public TObject
{
  int _logicnum;               // Logic number of main file
  TString_array _prompt;       // Prompts of mask fields
  TString_array _picture;      // Pictures of mask fields
  TArray _key1_fields;         // TFieldrefs of key 1 mask fields
  TArray _key2_fields;         // TFieldrefs of key 2 mask fields
  int _parentnum;              // Logic number of parent file (LF_FASI only)
  TString8 _editor;            // Riga di comando del programma gestore

protected:
  bool get_cfg_vars(TString& key, TString& des) const;
  const char* get_key_fieldname(int k = 1) const;
  void add_fieldref(int k, int from, int to);

public:
  int levels() const;
  int len(int level) const;
  int total_len(int level) const;
  const TString& picture(int level) const;
  bool is_numeric_picture(int level) const;
  bool is_required(int level) const;
  const TString& prompt(int level) const;
  const TFieldref& fieldref(int level, int key = 1) const;
	int logic() const { return _logicnum; }
  int parent() const { return _parentnum; }
  const TString& editor() const { return _editor; }
  int pack(TString& code) const;    // Toglie i pipe
  int unpack(TString& code) const;  // Aggiunge i pipe

  TMultilevel_code_info(int logicnum);
  virtual ~TMultilevel_code_info() { }
};

const TMultilevel_code_info& ca_multilevel_code_info(int logicnum);
const TMultilevel_code_info* ca_multilevel_code_info_by_index(int level);
bool ca_test_multilevel_field(TEdit_field& fld, int level);
int ca_create_fields(TMask& msk, int page, int logicnum, int x, int y, short key_id, short des_id, 
                     unsigned int mode = 0x0, const char* fieldname = NULL, int from = 0);

///////////////////////////////////////////////////////////
// TSimple_anal_msk
///////////////////////////////////////////////////////////

class TSimple_anal_msk : public TAutomask
{
protected:
  bool test_key_field(short id);
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
  virtual void read(const char* msk);
    
  void append_select_clause(ostream& out, int level) const;
  void create_key_browse(TEdit_field& kfld, int level);
  void create_des_browse(TEdit_field& kfld, int level);
  virtual int create_key_fields();

  virtual short create_tree_field();
  int compute_offset() const;

protected:
  TSimple_anal_msk() { }

public:
  void update_tree_field();

  const TFieldref& fieldref(int n, int key = 1) const;
  int fieldrefs(int key = 1) const;
  
  virtual int get_logicnum() const pure;
  virtual short get_field_id(int n, int key = 1) const;
  
  virtual const TToken_string& get_key_value(const TRectype& rec, int k = 1) const;
  virtual const TToken_string& get_key_value(int k = 1) const;
};

///////////////////////////////////////////////////////////
// TAnal_app
///////////////////////////////////////////////////////////

class TAnal_app : public TRelation_application
{
  TRelation* _rel;
  TSimple_anal_msk* _msk;

  virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM

protected:
  virtual TMask* get_mask(int) { return _msk; }
  virtual TRelation* get_relation() const { return _rel; }
  virtual bool user_create();
  virtual bool user_destroy();
  virtual int write(const TMask& m);
  virtual int rewrite(const TMask& m);
  void init_key_fields(TSimple_anal_msk & m) const;
  virtual void init_query_mode(TMask& mask);
  virtual void init_modify_mode(TMask& mask);
  virtual void init_insert_mode(TMask& mask);

protected:
  virtual TSimple_anal_msk* create_mask() const pure;
  virtual TRelation* create_relation() const;
};


///////////////////////////////////////////////////////////
// TAnal_mov
///////////////////////////////////////////////////////////

class TAnal_mov : public TMultiple_rectype
{
  TAssoc_array _saldi;

protected:
  TImporto& saldo(const TRectype& rec);
  void load_saldi(bool reset);
  void kill_saldi() { _saldi.destroy(); }
  void update_saldi(bool kill);
  bool save_saldi();
  void update_datacomp() const;

public:
  virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop);
  virtual int read(TBaseisamfile& f, word op, word lockop);
  virtual int write(TBaseisamfile& f) const;
  virtual int rewrite(TBaseisamfile& f) const;
  virtual int remove(TBaseisamfile& f) const;
	virtual void zero(char c = '\0');

public:
  int read(long numreg, word lockop = _nolock); // Funzione read di comodo
  TAnal_mov(long numreg = 0);
	TAnal_mov(const TRectype& rec);	//accetta LF_MOVANA,LF_RMOVANA,LF_MOV
};

///////////////////////////////////////////////////////////
// TAnal_rip
///////////////////////////////////////////////////////////

class TAnal_rip : public TMultiple_rectype
{
public:
  TAnal_rip();
};

///////////////////////////////////////////////////////////
//  TCache_ripartizioni
///////////////////////////////////////////////////////////

class TCache_ripartizioni : public TCache
{
protected:
  virtual TObject* key2obj(const char* key);

public:
  const TRecord_array& righe(const char* costo, const char* commessa);
  const TRecord_array& righe(const int gruppo, const int conto, const long sottoconto);
  const TRecord_array& righe(const TBill& bill);
};

#endif