#include "ve0.h"

#include <automask.h>
#include <colors.h>
#include <modtbapp.h>
#include <recset.h>
#include <tabmod.h>

#include "../cg/cglib01.h"

///////////////////////////////////////////////////////////
// Applicazione per gestione maschere di modulo
///////////////////////////////////////////////////////////

class TVE_tab_mod_app : public TTable_module_application
{
};

///////////////////////////////////////////////////////////
// Maschera di gestione tabella CVM: 
// Condizioni di vendita per categoria e gruppo merceologico
///////////////////////////////////////////////////////////

#include "vetbcvm.h"

class TCVM_mask : public TAutomask
{
protected:
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);

public:
  TCVM_mask();
};

TCVM_mask::TCVM_mask() : TAutomask("vetbcvm") 
{
  TSheet_field& s = sfield(F_CVM_SHT);
  s.set_nav_column(F_CVM_SOTTOCONTO, F_CVM_DESCONTO);
}

bool TCVM_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
  switch(o.dlg())
  {
  case F_CVM_SHT:
    switch (e)
    {
    case se_query_add:
    case se_query_del: 
      return false; // Non sono ammesse aggiunte o cancellazioni
    case se_notify_modify:
      {
        TSheet_field& s = (TSheet_field&)o;
        TToken_string& row = s.row(jolly);
        const long sc = row.get_long(s.cid2index(F_CVM_SOTTOCONTO));
        if (sc > 0) // Colora le righe valide
          s.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, jolly);
        else
          s.set_back_and_fore_color(COLOR_INVALID, COLOR_INVALID, jolly);
      }
      break;
    default: break;
    }
  default: break;
  }
  return true;
}

class TCVM_tab_app : public TRelation_application
{
  TCVM_mask* _msk;
  TRelation* _rel;

protected:
  int find_cve(TSheet_field& s, const TString& cve) const;

public:
  virtual TMask* get_mask(int) { return _msk; }
  virtual TRelation* get_relation() const { return _rel; }

  virtual bool user_create();
  virtual bool user_destroy();

  virtual void init_query_mode(TMask& m);
  virtual void init_insert_mode(TMask& m);
  virtual void init_modify_mode(TMask& m);

  virtual int read(TMask& m);
  virtual int write(const TMask& m);
  virtual int rewrite(const TMask& m);
  virtual bool remove();
}; 

void TCVM_tab_app::init_query_mode(TMask& m)
{
  m.enable(-2);
  m.hide(-3);
}

void TCVM_tab_app::init_insert_mode(TMask& m)
{
  m.disable(-2);
  m.show(-3);
  read(m);
}

void TCVM_tab_app::init_modify_mode(TMask& m)
{
  m.disable(-2);
  m.show(-3);
}

bool TCVM_tab_app::user_create()
{
  _rel = new TRelation("CRA");
  _msk = new TCVM_mask;
  return true;
}

int TCVM_tab_app::find_cve(TSheet_field& s, const TString& cve) const
{
  int mini = 0, maxi = s.items()-1, midi = 0;

  TString8 code;
  while (mini <= maxi)
  {
    midi = (mini+maxi) / 2;
    s.row(midi).get(0, code);
    const int cmp = code.compare(cve);
    if (cmp == 0)
      break;
    if (cmp > 0)
      maxi = midi-1;
    else
      mini = midi+1;
  }
  return code == cve ? midi : -1;
}

int TCVM_tab_app::read(TMask& m)
{
  TSheet_field& s = m.sfield(F_CVM_SHT);
  s.destroy();

  const TString& code = m.get(F_CVM_COD);
  if (code.full())
  {
    TISAM_recordset gm("USE CVE");
    for (bool ok = gm.move_first(); ok; ok = gm.move_next())
    {
      TToken_string& row = s.row(-1);
      row = gm.get("CODTAB").as_string();
      row.add(gm.get("S0").as_string());
    }
  }
  if (!s.empty())
  {
    TISAM_recordset cvm("USE &CVM\nFROM CODTAB=#COD\nTO CODTAB=#COD");
    cvm.set_var("#COD", code);
    TString8 cve;
    for (bool ok = cvm.move_first(); ok; ok = cvm.move_next())
    {
      cve = cvm.get("CODTAB[4,5]").as_string();
      const int i = find_cve(s, cve);
      if (i >= 0)
      {
        const int gr = cvm.get("I0").as_int();
        const int co = cvm.get("I1").as_int();
        const long so = cvm.get("I2").as_int();
        if (so > 0)
        {
          TBill zio(gr, co, so);
          TToken_string& row = s.row(i);
          zio.add_to(row, 2, 0x2);
          s.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, i);
        }
      }
    }
  }

  return s.empty() ? _iskeynotfound : NOERR;
}

int TCVM_tab_app::write(const TMask& m)
{
  TSheet_field& s = m.sfield(F_CVM_SHT);
  TModule_table cvm("&CVM");
  FOR_EACH_SHEET_ROW(s, i, row)
  {
    const TBill zio(*row, 2);
    TString16 code = m.get(F_CVM_COD);
    code << row->get(0);
    cvm.put("CODTAB", code);
    if (zio.ok())
    {
      cvm.put("I0", zio.gruppo());
      cvm.put("I1", zio.conto());
      cvm.put("I2", zio.sottoconto());
      cvm.rewrite_write();
    }
    else
    {
      cvm.remove();
    }
  }
  return NOERR;
}

int TCVM_tab_app::rewrite(const TMask& m)
{
  return write(m);
}

bool TCVM_tab_app::remove()
{
  const TString4 code = get_relation()->curr().get("CODTAB");
  TISAM_recordset cvm("USE &CVM\nFROM CODTAB=#COD\nTO CODTAB=#COD");
  cvm.set_var("#COD", code);
  TLocalisamfile& f = cvm.cursor()->file();
  for (bool ok = cvm.move_first(); ok; ok = cvm.move_next())
    f.remove();
  return true;
}

bool TCVM_tab_app::user_destroy()
{
  delete _msk;
  delete _rel;
  return true;
}

///////////////////////////////////////////////////////////
// Selettore applicazione per gestione maschere di modulo
///////////////////////////////////////////////////////////

int ve0600(int argc, char* argv[])
{
  TString4 tab = argv[2]; 
  tab.upper(); tab.strip("&");

  if (tab == "CVM")
  {
    TCVM_tab_app a;
    a.run(argc, argv, TR("Conti per categoria e gruppo"));
  }
  else
  {
    TVE_tab_mod_app a;
    a.run(argc, argv, TR("Tabelle module vendite"));
  }
  return 0;
}