#include <tabapp.h>
#include <recset.h>
#include <msksheet.h>

#include <nditte.h>

class TTabelle_770 : public TTable_application
{
protected:
  virtual int read(TMask& m);
  virtual int write(const TMask& m);
  virtual int rewrite(const TMask& m);
  virtual bool remove();

public:
  bool is_ENT() const { return get_tabname() == "%ENT"; }
  TSheet_field* sheet_ENT() const;
  void write_rewrite_ENT() const;
};

TSheet_field* TTabelle_770::sheet_ENT() const
{
  if (is_ENT())
  {
    TMask& m = curr_mask();
    for (int i = m.fields()-1; i > 0; i--)
    {
      TMask_field& f = m.fld(i);
      if (f.is_sheet())
        return (TSheet_field*)&f;
    }
  }
  return NULL;
}


int TTabelle_770::read(TMask& m)
{
  const int err = TTable_application::read(m);

  TSheet_field* se = sheet_ENT();
  if (err == NOERR && se != NULL)
  {
    const TString& ent = m.get_key_field(1, true)->get();
    se->destroy();
    TLocalisamfile mr(LF_MULTIREL);
    TISAM_recordset nditte("USE NDITTE");
    for (bool go = nditte.move_first(); go; go = nditte.move_next())
    {
      TToken_string& r = se->row(-1);
      const long n = nditte.get(NDT_CODDITTA).as_int();
      TString8 cod; cod.format("%05ld", n);
      r = cod;
      r.add(nditte.get(NDT_RAGSOC).as_string());

      mr.put("COD", "77ENT");
      mr.put("FIRST", ent);
      mr.put("SECOND", cod);
      if (mr.read() == NOERR)
        r.add(mr.get("DATA"));
    }
    se->force_update();
  }

  return err;
}

void TTabelle_770::write_rewrite_ENT() const
{
  TSheet_field& s = *sheet_ENT();
  const TString& ent = s.mask().get_key_field(1, true)->get();
  TLocalisamfile mr(LF_MULTIREL);
  TString8 cod; 
  FOR_EACH_SHEET_ROW(s, r, row)
  {
    mr.zero();
    mr.put("COD",    "77ENT");
    mr.put("FIRST",  ent);
    cod.format("%05ld", row->get_long(0));
    mr.put("SECOND", cod);
    const TFixed_string data = row->get(2);
    if (data.full())
    {
      mr.put("DATA",   data);
      mr.rewrite_write();
    }
    else
      mr.remove();
  }
}

int TTabelle_770::write(const TMask& m)
{
  const int err = TTable_application::write(m);
  if (err == NOERR && is_ENT())
    write_rewrite_ENT();
  return err;
}

int TTabelle_770::rewrite(const TMask& m)
{
  const int err = TTable_application::rewrite(m);
  if (err == NOERR && is_ENT())
    write_rewrite_ENT();
  return err;
}

bool TTabelle_770::remove()
{
  const bool done = TTable_application::remove();
  if (done && is_ENT())
  {
    TSheet_field& s = *sheet_ENT();
    FOR_EACH_SHEET_ROW(s, r, row)
      row->add(" ", 2);
    write_rewrite_ENT();
  }
  return done;
}

int TableManager(int argc, char* argv[])
{
  TTabelle_770 a;
  a.run(argc, argv, TR("Tabella 770"));
  return 0;
}