#include <applicat.h>
#include <tabapp.h>  
#include <strings.h>
#include <stdtypes.h>
#include <tabutil.h>
#include <utility.h>                    
#include <modaut.h>
#include <prefix.h>

#include "batbpdb.h"
#include "batbarb.h"

class Tabanabil_application : public Tab_application
{
private:
  TMask*  _msk;   
  TString _tabname;
  
public:
  bool user_create();
  const char * extra_modules() const { return format("%d",CGAUT); }
  
  static bool giorno_handler(TMask_field& f, KEY k);
  static bool mese_handler  (TMask_field& f, KEY k);
  static bool anni_handler  (TMask_field& f, KEY k);

  Tabanabil_application() {}
  virtual ~Tabanabil_application() {}
};

HIDDEN inline Tabanabil_application& app() {return (Tabanabil_application&) main_app();}

bool Tabanabil_application::giorno_handler(TMask_field& f, KEY k)
{
  if (k == K_TAB && f.mask().is_running())
  {
    const int giorno = atoi(f.get());   
    
    if (giorno > 31)
      return f.warning_box(TR("Valore non valido per il giorno"));

    const int mese   = (f.dlg() == F_GIORNO_INI ? f.mask().get_int(F_MESE_INI) : f.mask().get_int(F_MESE_FINE));
    
    if (mese == 2)
      if (giorno > 29)
        return f.warning_box(TR("Valore non valido per il giorno"));
    
    if (mese == 11 || mese == 4 || mese == 6 || mese == 9)
      if (giorno > 30)
        return f.warning_box(TR("Valore non valido per il giorno"));
  }
  
  return TRUE;
}

bool Tabanabil_application::mese_handler(TMask_field& f, KEY k)
{
  if (k == K_TAB && f.mask().is_running())
  {
    const int mese = atoi(f.get());
    
    if (mese < 1 || mese > 12)
      return f.warning_box(TR("Valore non valido per il mese"));
    
    const int giorno = (f.dlg() == F_MESE_INI ? f.mask().get_int(F_GIORNO_INI) : f.mask().get_int(F_GIORNO_FINE));
    
    if (mese == 2)
      if (giorno > 28)
        return f.warning_box(TR("Valore non valido per il giorno"));
    
    if (mese == 11 || mese == 4 || mese == 6 || mese == 9)
      if (giorno > 30)
        return f.warning_box(TR("Valore non valido per il giorno"));
  }
  
  return TRUE;
}

bool Tabanabil_application::anni_handler(TMask_field& f, KEY k)
{
  if (k == K_ENTER)
  {
    TMask & m=f.mask();
    const TDate inizio(m.get_int(F_GIORNO_INI),m.get_int(F_MESE_INI),1993);
    if (inizio.empty())
      return TRUE;
    const TDate fine(m.get_int(F_GIORNO_FINE),m.get_int(F_MESE_FINE),1993+m.get_int(F_NUM_ANNI));
    if (fine.empty())
      return TRUE;
    if (fine==inizio)
      return f.error_box(TR("Date uguali: specificare il numero di anni"));
    if (fine<inizio)
      return f.error_box(TR("Data finale inferiore alla iniziale: specificare il numero di anni"));
  }
  
  return TRUE;
}



bool Tabanabil_application::user_create()
{ 
  Tab_application::user_create();

  _msk     = get_mask();
  _tabname = get_tabname();

  if (_tabname == "%PDB")         
  {
    _msk->set_handler(F_GIORNO_INI,  giorno_handler);
    _msk->set_handler(F_MESE_INI,    mese_handler);
    _msk->set_handler(F_GIORNO_FINE, giorno_handler);
    _msk->set_handler(F_MESE_FINE,   mese_handler);

    _msk->set_handler(F_NUM_ANNI,  anni_handler);
  }                      
  if (_tabname == "%ARB") 
      set_search_field(F_CODTAB_ESE);
  return TRUE;
}

int ab0100(int argc, char* argv[])
{
  Tabanabil_application a;
  
  a.run(argc,argv, TR("Tabelle"));
  return 0;
}