#include <prefix.h>
#include <relapp.h>

#include <nditte.h>

#include "../cg/cgtbinl.h"

class TIndici_app : public TRelation_application
{ 
  TRelation* _indici;
  TMask* _maschera;
  
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 bool get_next_key(TToken_string& key);
  virtual bool save_and_new() const { return TRUE; } 
  virtual int read(TMask& m);
  virtual void init_query_mode(TMask& m);
  
  static bool ditta_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)
{
  /*
  if (key == K_TAB && f.to_check(key, TRUE) && f.empty())
  {
    TMask& m = f.mask();
    m.reset(F_CODREG);   m.reset(F_DESCREG);
    m.disable(F_CODREG); m.disable(F_DESCREG);
    return TRUE;
  }
  */
  if ((key == K_TAB && f.to_check(key)/*f.focusdirty()*/) || key == K_ENTER)
  {
    const long ditta = atol(f.get());
    if (ditta == 0L) 
      return TRUE;

    TMask& m = f.mask();
    if (prefix().exist(ditta))
    {
      app().set_firm(ditta);
      m.enable(F_CODREG); m.enable(F_DESCREG);
    }
    else
    {
      m.reset(F_CODREG);m.reset(F_DESCREG);
      m.disable(F_CODREG); m.disable(F_DESCREG);
      return f.error_box(FR("La ditta %5ld non e' abilitata in contabilita'"), ditta);
    }
  }
  return TRUE;
}  

void TIndici_app::init_query_mode(TMask& m)
{
  m.enable(F_CODREG);m.enable(F_DESCREG);
}

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

bool TIndici_app::user_create()
{
  if (get_firm() == 0) // Se e' posizionato nel direttorio comune, setta la prima ditta abilitata in contabilita'
  {
    TLocalisamfile ditte(LF_NDITTE);

    bool found = FALSE;
    long ditta = 0L;
    for (ditte.first(); !found && !ditte.eof(); ditte.next())
    {
      ditta = ditte.get_long(NDT_CODDITTA);
      found = prefix().exist(ditta);
    }
    
    if (!found) 
    {
      error_box(TR("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);
  return TRUE;
}                 

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

bool TIndici_app::get_next_key(TToken_string& key)
{                  
  const int anno = _maschera->get_int(F_ANNO);
  const TString16 libro = _maschera->get(F_CODLIB);
  if (anno == 0 || libro.empty())
    return TRUE;

  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)
    key.format("%d|%d|%d|%s|%d|%ld", F_ANNO, anno, F_CODLIB, (const char*)libro, F_INDEX, cod);

  return TRUE;
}



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