#include <applicat.h>
#include <mask.h>
#include <msksheet.h>
#include <tabutil.h> 

// IVA a debito da riportare al mese successivo

class TSheet_field;  
class TViswin;

class Visliq_app : public TSkeleton_application
{
  TString   _freqviva;  
  int       _year;                    
  long      _firm;

  TRelation*    _nditte;
  TArray_sheet* _ditte;
  TString_array _nomiditte;
  
  TTable*    _lim;  
  TTable*    _lam;  
  TTable*    _lia;  
  TTable*    _del;  

  TRectype*  _lim_r;
  TRectype*  _lam_r;
  TRectype*  _del_r;
  TRecfield* _del_ditta;
  TRecfield* _del_anno;
  TRecfield* _del_mese;
  TRecfield* _del_tipo;
  TRecfield* _lim_anno;
  TRecfield* _lim_mese;
  TRecfield* _lam_anno;
  TRecfield* _lam_mese;

  TSheet_field* _vers_sheet, *_liq_sheet;
  TArray        _vers_rows,   _liq_rows;
  TMask*        _mask;
  bool _from_one;
  bool _is_annual;
  bool _sh_dirty, _sv_dirty;

  const char* itoname(int m);

  bool is_trim(int x); 
  bool is_month_ok(int x, int month = -1);
  
protected:

  virtual void main_loop();
  virtual bool create(); 
  virtual bool destroy(); 
  
  // handlers             
  static bool set_ditta(TMask_field&, KEY);
  static bool set_ragsoc(TMask_field&, KEY);
  static bool sel_mese_sh1 (TMask_field&, KEY);
  static bool sel_mese_sh2 (TMask_field&, KEY);
  static bool ch_year_handler(TMask_field& f, KEY key);

  static const char* link_handler(TMask&, int, const char*, bool doubleclick);

  static bool sheet_action(TSheet_field& s, int r, KEY k);
  static bool vers_action(TSheet_field& s, int r, KEY k);

public:                                                  
  virtual bool firm_change_enabled() const { return FALSE; }

  static Visliq_app& app() { return (Visliq_app&)main_app(); }
  TArray_sheet* get_ditte_sheet() { return _ditte; }

  void build_ditte_sheet();
  void build_nomiditte();

  bool look_lia(long ditta = 0l, int year = 0);       
  bool look_lim(int m);
  bool look_del(int month, int type, bool create = FALSE);
  
  void read_general(TMask& m);
  void write_general(TMask& m);
  void write_liq();
  void write_del();
  
  void set_freqviva();                          
  void set_freqviva(const char* f) { _freqviva = f; }                          
  void set_mask_freq(TMask&);
  void set_year(const char* y) { _year = atoi(y); }                                                             
  void set_year(int y)         { _year = y; }   
  void reset_fields();

  void set_liq_rows (TSheet_field& s) { _liq_rows  = s.rows_array(); }
  void set_vers_rows(TSheet_field& s) { _vers_rows = s.rows_array(); }
  
  // 2 palle
  TMask* get_main_mask()      { return _mask; }
  bool select_butt(TMask& m);                   
  TTable*  del() { return _del; }
  
  real Visliq_app::min_vers(int anno, int month);
  // riaggiusta la liquidazione del mese dato
  void recalc_liq_data(TViswin* v, real& rimb, real& rett, real& vers, real& acc, 
                       real& varimp, real& impnonver, real& credspec,
                       TString& d1, TString& d2, TString& d3, TDate& date, 
                       TString& abi, TString& cab, TString& con);   

  // Calcolo del credito utilizzato IVA ed F24
  real credito_utilizzato(int year, int month) const;
  
  // riaggiusta le liquidazioni successive se serve                     
  void recalc_next_liq(int start_month, TSheet_field* sl, TSheet_field* sv);
  
  // workhorses
  void vis_liq();
  bool vis_all();
  bool vis_one(int);
  
  Visliq_app() : _vers_sheet(NULL), _liq_sheet(NULL)  {}
  virtual ~Visliq_app() {}
};

inline Visliq_app& app() { return (Visliq_app&) main_app(); }