#include <automask.h>
#include <applicat.h>
#include <recarray.h>
#include <relation.h>
#include <reprint.h>
#include <reputils.h>
#include <textset.h>
#include "../cg/cg2103.h"

///////////////////////////////////////////////////////////
// TIP_mask
///////////////////////////////////////////////////////////

class TIP_mask : public TAutomask
{
  clock_t _next_update;
  bool _updating;

private:
  bool apply_filter(const TRecordset& righe) const;
  void serialize(bool bSave);

protected:
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);

public:
  TIP_mask(const char * maskname);
  ~TIP_mask();
};

///////////////////////////////////////////////////////////
// TCausali_cache
///////////////////////////////////////////////////////////

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

public:
  const TCausale& causale(const char* codice, int annoiva);
};

///////////////////////////////////////////////////////////
// TRiclassifica_cache
///////////////////////////////////////////////////////////

class TIPRiclassifica_cache : public TCache
{
	TLocalisamfile _multirel;
protected:
  virtual TObject* key2obj(const char* key);
public:
	const char * sdecode(const char* tab, const TString& cod);
	long decode(const char* tab, const TString& cod);
	TIPRiclassifica_cache() : _multirel(LF_MULTIREL) { _multirel.setkey(2);}
};

///////////////////////////////////////////////////////////
// TIP_sender
///////////////////////////////////////////////////////////
const long TSbill2ricl(char & t, int gr, int co, long so);

///////////////////////////////////////////////////////////
// TIP_sender
///////////////////////////////////////////////////////////
class TIP_textset : public TCSV_recordset
{

	TAssoc_array _colnames;

protected:
  void add_field(const char* name = "Filler", int len = 0, const char * tipo = "C");

public:
  virtual bool destroy(TRecnotype r);
  virtual bool set(const char* field, const TVariant& v);
  void set(const char* field, const TString & str) { set(field, TVariant(str)); }
  void set(const char* field, const int n)    { set(field, TVariant((long)n)); }
  void set(const char* field, const char* s)  { set(field, TVariant(s)); }
  void set(const char* field, const TDate& d) { set(field, TVariant(d)); }
  void set(const char* field, const real& v)  { set(field, TVariant(v)); }
	int find_column(const char * name);
  
	TIP_textset(const char* query = "") : TCSV_recordset(TString("CSV(\"\t\")\n") << query) {}
};

class TIP_clienti_textset : public TIP_textset
{
	public:
		TIP_clienti_textset(const char* query = "");
};

class TIP_fornitori_textset : public TIP_textset
{
	public:
		TIP_fornitori_textset(const char* query = "");
};

class TIP_movimenti_textset : public TIP_textset
{
	public:
		TIP_movimenti_textset(const char* query = "");
};

class TIP_scadenze_textset : public TIP_textset
{
	public:
		TIP_scadenze_textset(const char* query = "");
};

class TIP_cespiti_textset : public TIP_textset
{
	public:
		TIP_cespiti_textset(const char* query = "");
};

class TIP_categorie_textset : public TIP_textset
{
	public:
		TIP_categorie_textset(const char* query = "");
};

class TIP_intra_textset : public TIP_textset
{
	public:
		TIP_intra_textset(const char* query = "");
};

class TIP_sender : public TSkeleton_application
{
	TIP_mask * _mask;
	TAssoc_array _caus_regolarizzazione;
	TIPRiclassifica_cache* _tabelle;
	TCausali_cache * _causali;
	TAssoc_array	 _riclassifica;
  bool _errors_logged;
  bool _errors;
  TLog_report*	 _log;
	TReport_book * _book;
	TRecord_cache * _part;
	long _ultscadid;

	bool test_swap(const TRecordset& mov);
	bool mov_regolarizzazione(const TRecordset& mov);
	bool mov_intra(const TRecordset& mov);
	bool mov_reverse_charge(const TRecordset& mov);
	const TString & scod2ricl(const char* tab, const TString& cod);
	const TString & scod2ricl(const char* tab, const TVariant& cod);
	const long cod2ricl(const char* tab, const TString& cod);
  const long cod2ricl(const char* tab, const TVariant& cod);
	const long bill2ricl(char t, int gr, int co, long so);

	const TString & pag2tipo(const TVariant & codpag);
	const TString & row2cauriga(TISAM_recordset& rmov, const TCausale & caus);
	void get_pref(const TVariant & pref, TVariant & pint, TVariant & pnaz);
	const real ind2perc(const TVariant & tipodet);
	void add_cli(TISAM_recordset & cli, TIP_clienti_textset & ipcli);
	void add_forn(TISAM_recordset & forn, TIP_fornitori_textset & ipforn);
	void add_mov_cg(TISAM_recordset & mov, TIP_movimenti_textset & ipmov, const TVariant & reg_regol, const TVariant & prot_regol, const char tipo = ' ');
	void add_mov_iva(TISAM_recordset & mov, TIP_movimenti_textset & ipmov, const TVariant & reg_regol, const TVariant & prot_regol);
	void add_mov(TISAM_recordset & mov, TIP_movimenti_textset & ipmov);
	void add_scad(TISAM_recordset & mov, TIP_scadenze_textset & ipscad);
	void add_intra(TISAM_recordset & mov, TIP_intra_textset & ipintra);
	void transfer_cli(const char * path);
	void transfer_forn(const char * path);
	void transfer_mov(const char * path);
	void transfer_scad(const char * path);
	void transfer_cesp(const char * path);
	void transfer_cat(const char * path);
	void transfer_intra(const char * path);

protected:
	virtual bool find_regolarizzazione(TRecordset& mov);
	virtual TMask & get_mask();

public:
	virtual bool multi_activity() const { return true; }
	TAssoc_array & riclassifica() {return _riclassifica;}
	
	virtual void postprocess_movs(TRecordset & mov);
	virtual void set_parameters();

// qui
  void log(int sev, const char* msg);

	virtual bool create();
  virtual void main_loop();
	virtual bool destroy();

  TIP_sender() : _tabelle(NULL) {}
};