#ifndef __RESETFIL_H
#define __RESETFIL_H

#ifndef __ISAM_H
#include <isam.h>  
#include <progind.h>
#endif

///////////////////////////////////////////////////////////
// TResetfile
///////////////////////////////////////////////////////////

// @doc EXTERNAL

// @type VALIDATE_RECORD | Prototipo funzione per validare se un record e' da azzerare.
typedef bool (*VALIDATE_RECORD)(const TRectype& rec);

// @type VALIDATE_FIELD | Prototipo funzione per validare se un campo e' da azzerare.
typedef bool (*VALIDATE_FIELD)(const TRectype& rec, const TString& fld);

// @type BEFORE_RESET | Prototipo funzione richiamata prima dell'azzeramento di un record.
typedef void (*BEFORE_RESET)(TRectype& rec);

// @type AFTER_RESET | Prototipo funzione richiamata dopo l'azzeramento di un record.
typedef void (*AFTER_RESET)(TRectype& rec);

// @class TResetfile | Classe per l'azzeramento di un file
//
// @base public | TObject
class TResetfile : public TObject

// @author:(INTERNAL) Luciano

// @access:(INTERNAL) Private Member
{ 
  // @cmember:(INTERNAL) numero logico del file da azzerare
  int _file_num;                                           
  // @cmember:(INTERNAL) stato file : TRUE azzerato,FALSE non azzerato
  bool _is_reseted;                                           
  // @cmember:(INTERNAL) file da azzerare
  TSystemisamfile* _file;
  // @cmember:(INTERNAL) effettuare remove dei record (default FALSE)
  bool _removerec;                                                   
  // @cmember:(INTERNAL) funzione di validate per azzerare un record
  VALIDATE_RECORD _validate_record_function;                        
  // @cmember:(INTERNAL) funzione di validate per azzerare un campo
  VALIDATE_FIELD _validate_field_function;                                 
  // @cmember:(INTERNAL) funzione richiamata prima dell'azzeramento di un record
  BEFORE_RESET _before_reset_function;
  // @cmember:(INTERNAL) funzione richiamata dopo l'azzeramento di un record
  AFTER_RESET _after_reset_function;
  // @cmember:(INTERNAL) ritorna se il campo <p fd> � un campo chiave    
  bool iskeyfield(const RecDes& recd, const int fd) const;               
  // @cmember:(INTERNAL) ritorna e carica il numero campi da azzerare    
  int TResetfile::load_resetable_fields(const RecDes& recd,TString_array& resetable_fields);

// @access Public Member
public:                                     
  // @cmember setta la funzione di validate se record da azzerare 
  void set_validate_record_function(VALIDATE_RECORD fun)
  {_validate_record_function = fun;}                              
  // @cmember setta la funzione di validate se campo da azzerare 
  void set_validate_field_function(VALIDATE_FIELD fun)
  {_validate_field_function = fun;}                               
  // @cmember setta la funzione richiamata prima dell'azzeramento di un record 
  void set_before_reset_function(BEFORE_RESET fun)
  {_before_reset_function = fun;}
  // @cmember setta la funzione richiamata dopo l'azzeramento di un record 
  void set_after_reset_function(AFTER_RESET fun)
  {_after_reset_function = fun;}
  // @cmember esegue l'azzeramento del file 
  int run();

  // @cmember Costruttore
  TResetfile(int logicnum, bool remove = FALSE);
  // @cmember Distruttore
  virtual ~TResetfile();
};

#endif