#include <relapp.h>
#include <nditte.h>
#include <prefix.h>
#include "batbinl.h"

class TIndici_app : public TRelation_application
{ 
  TRelation* _indici;
  TMask* _maschera;
  
  TString80 _tmp;
  
protected:  
  virtual bool user_create();
  virtual bool user_destroy();
  
  virtual bool changing_mask(int) { return FALSE; }
  virtual TMask* get_mask(int) { return _maschera; }
  virtual TRelation* get_relation() const { return _indici; }

  virtual const char* get_next_key();
  virtual bool save_and_new() const { return TRUE; } 
  virtual int read(TMask& m);
  
  static bool ditta_handler(TMask_field& f, KEY key);  
  static bool annullapagine_handler(TMask_field& f, KEY key);  
  static TIndici_app& app() { return (TIndici_app&) main_app(); }

public:
  TIndici_app() {}
  virtual ~TIndici_app() {}  
};
  
bool TIndici_app::ditta_handler(TMask_field& f, KEY key)
{
  TMask& m = f.mask();
  if (key == K_TAB && m.is_running())
  {
    const long ditta = atol(f.get());
    if (ditta == 0L && m.is_running())
    {
      m.reset(F_CODREG);m.reset(F_DESCREG);
      m.disable(F_CODREG); m.disable(F_DESCREG);
      return TRUE;
    }
  }
  
  if ((key == K_TAB && f.focusdirty()) || key == K_ENTER)
  {
    const long ditta = atol(f.get());
    if (ditta == 0L) return TRUE;
    if (prefix().exist(ditta))
    {
      app().set_firm(ditta);
      m.enable(F_CODREG); m.enable(F_DESCREG);
    }
    else
    {
      f.error_box("Ditta %5ld non abilitata in contabilita'",ditta);
      m.reset(F_CODREG);m.reset(F_DESCREG);
      m.disable(F_CODREG); m.disable(F_DESCREG);
      return FALSE;
    }
  }
  return TRUE;
}  

bool TIndici_app::annullapagine_handler(TMask_field& f, KEY key)
{
  if (key == K_SPACE && f.focusdirty())
  {
    TMask& m = f.mask();
    m.set(F_DESCREG,"");
  }
  return TRUE;
}

int TIndici_app::read(TMask& m)
{
  int r = TRelation_application::read(m);
  long ditta = m.get_long(F_DITTA);
  if (ditta > 0L)
    if (prefix().exist(ditta))
      set_firm(ditta);
    else
      warning_box("Ditta %5ld non abilitata in contabilita'",ditta);
  return r;
}

bool TIndici_app::user_create()
{
  if (get_firm() == 0) // Se e' posizionato nel direttorio comune, setta la prima ditta abilitata in contabilita'
  {
    bool found = FALSE;
    TLocalisamfile ditte(LF_NDITTE);
    const long items = ditte.items();
    long ditta = 0L;
    for (ditte.first(); !found && !ditte.eof(); ditte.next())
    {
      ditta = ditte.get_long(NDT_CODDITTA);
      if (prefix().exist(ditta)) found = TRUE;
    }
    
    if (!found) 
    {
      error_box("Abilitare almeno una ditta in contabilita'.");
      return FALSE;
    } 
    else
      set_firm(ditta);
  }
  _indici = new TRelation(LF_INDLIB);
  _maschera = new TMask("batbinl");
  _maschera->set_handler(F_DITTA, ditta_handler);
  _maschera->set_handler(F_PANN_LU, annullapagine_handler);
  return TRUE;
}                 

bool TIndici_app::user_destroy()
{
  delete _maschera;
  delete _indici;
  return TRUE;
}

const char* TIndici_app::get_next_key()
{                  
  const int anno = _maschera->get_int(F_ANNO);
  const TString16 libro = _maschera->get(F_CODLIB);
  if (anno == 0 || libro.empty())
    return "";

  TLocalisamfile index(LF_INDLIB);
  index.zero();
  index.put("ANNO", anno);
  index.put("CODLIB", libro);
  index.put("NUMREG", 9999999L);
  
  long cod = 0;
  int err = index.read(_isgteq);
  switch (err)
  {
  case _iseof:
    index.last();
    err = NOERR;
    break;
  case NOERR:  
    index.prev();
    break;  
  default:
    break;
  }      
  
  if (err == NOERR)
  {
    if (index.get_int("ANNO") == anno && index.get("CODLIB") == libro)
      cod = index.get_long("NUMREG") + 1;    
  }
  
  if (cod > 0)
    _tmp.format("%d|%d|%d|%s|%d|%ld", F_ANNO, anno, F_CODLIB, (const char*)libro, F_INDEX, cod);
  else
    _tmp.cut(0);  

  return _tmp;
}



int ba3900(int argc, char* argv[])
{
  TIndici_app app;
  app.run(argc, argv, "Indici libro unico");
  return 0;
}
