#include <applicat.h>
#include <mask.h>
#include <maskfld.h>
#include <sheet.h>
#include <msksheet.h>
#include <urldefid.h>
#include <lffiles.h>
#include <clifo.h>
#include "effetti.h"
#include "ef0.h"
#include "ef0200.h"

class Creazione_Effetti_da_EC : public TApplication
{
  TMask * _msk;
  TArray_sheet * _Partite_aperte;
  real _residuo;

  void          Load_Partite_Aperte(const long cli);
  static  bool  Gen_Handler(TMask_field& f, KEY k);
  static  bool  Gen_Notify(TSheet_field& sheet, int r, KEY k);                               
  static  bool  Cli_Handler(TMask_field& f, KEY k);
  virtual bool  create();
  virtual bool  destroy();
  virtual bool  menu(MENU_TAG m);
public:
  real get_res() {return _residuo;}
  void set_res(const real& a) {_residuo = a;}
  TMask* get_msk() {return _msk;}
  Creazione_Effetti_da_EC() : _residuo(0.0) {}
};

inline Creazione_Effetti_da_EC& app() {return (Creazione_Effetti_da_EC&)main_app();}

void Creazione_Effetti_da_EC::Load_Partite_Aperte(const long cli)
{
  /*
     Caricamento partite aperte da E.C.

     Questo che segue e' pseudo-codice; andra' verificato non appena 
     sara' completato lo scadenziario.

     TLocalisamfile Ec(LF_........);

     * Carica tutte le partite aperte del cliente *

     Ec.zero();
     Ec.put(EC_CODCLI,cli);
     Ec.read();

     Finche' si tratta dello stesso cliente...

     while (Ec.good() && Ec.get_long(EC_CODCLI) == cli) 
     {

     Controlla se la partita esaminata e' aperta...

     if (Ec.get(EC_APERTA)) 
     {
     Con questo le carica tutte nello sheet...

     TToken_string riga(80);
     riga.cut(0);
     riga.add(Ec.get(EC_ANNO));
     riga.add(Ec.get(EC_NUMERO));
     riga.add(Ec.get(EC_DATADOC));
     riga.add(Ec.get(EC_SALDO));
     _Partite_aperte->add(riga);
     }

     Legge il prossimo record

     Ec.next()
     }
     */
  TToken_string riga(80);
  riga.cut(0);
  riga.add("");
  riga.add("1994");
  riga.add("1");
  riga.add("10-11-94");
  riga.add("19000000");
  _Partite_aperte->add(riga);
  riga.cut(0);
  riga.add("");
  riga.add("1994");
  riga.add("2");
  riga.add("11-11-94");
  riga.add("18000000");
  _Partite_aperte->add(riga);
  riga.cut(0);
  riga.add("");
  riga.add("1994");
  riga.add("3");
  riga.add("16-11-94");
  riga.add("23009000");
  _Partite_aperte->add(riga);
  riga.cut(0);
  riga.add("");
  riga.add("1994");
  riga.add("4");
  riga.add("19-11-94");
  riga.add("450600");
  _Partite_aperte->add(riga);
}

bool Creazione_Effetti_da_EC::Gen_Handler(TMask_field& f, KEY k)
{
  if (k==K_TAB && f.focusdirty())
  {
    real importo=(real)(const char*)f.mask().get(F_RATA);
    importo+=(real)(const char*)f.mask().get(F_SPESE);
    importo+=(real)(const char*)f.mask().get(F_BOLLI);
    f.mask().set(F_IMPEFF,importo.string("."));
    f.set_focusdirty(FALSE);
  }
  return TRUE;
}

bool Creazione_Effetti_da_EC::Gen_Notify(TSheet_field& sheet, int r, KEY k)
{
  if (k == K_CTRL + K_DEL)
    return TRUE;
  if (k == K_INS)
  {
    if (app().get_res().is_zero())
    {
      warning_box("Residuo da ripartire gia' annullato");
      return FALSE;
    }
    else
      return TRUE;
  }
  
  TToken_string & row = sheet.row(r);
  const real importo(row.get(1));
  static real old_rata;

  switch (k)
  {
  case K_SPACE:
    old_rata = importo;
    break;
  case K_DEL:       
    {      
      const real new_res = app().get_res() + importo;

      app().set_res(new_res);
    }
    break;
  case K_ENTER:
    {
      const real new_res = app().get_res() - importo + old_rata;
      if (new_res < ZERO)
      {
        warning_box("Non e' possibile superare l'importo da ripartire");
        if (old_rata.is_zero()) 
        {
          row.add(app().get_res().string(),1);
          app().set_res(ZERO);
        }
        else
          row.add(old_rata.string(),1);
      }      
      else
        app().set_res(new_res);
      real totale = importo;   
      
      totale+= real(row.get(2));
      totale+= real(row.get(3));
      row.add(totale.string(),4);
    }
    break;
  default:
    break;
  }
  sheet.mask().set(F_RESIDUO,app().get_res().string("."));
  return TRUE;
}

bool Creazione_Effetti_da_EC::Cli_Handler(TMask_field&f, KEY k)
{
  if (f.focusdirty())
  {
    TSheet_field& sheet =(TSheet_field&)f.mask().field(F_SHEET_EFF);
    sheet.reset();
    sheet.force_update();
  }
  return TRUE;
}

bool Creazione_Effetti_da_EC::create()
{
  _msk = new TMask("ef0200a");
  TSheet_field& sheet = (TSheet_field&) _msk->field(F_SHEET_EFF);
  sheet.set_notify(Gen_Notify);
  sheet.enable_column(4,FALSE);
  TMask& mask= sheet.sheet_mask();
  mask.set_handler(F_RATA,Gen_Handler);
  mask.set_handler(F_SPESE,Gen_Handler);
  mask.set_handler(F_BOLLI,Gen_Handler);
  _msk->set_handler(F_CODCF,Cli_Handler);
  dispatch_e_menu(BAR_ITEM(1));
  return TRUE;
}

bool Creazione_Effetti_da_EC::destroy()
{
  if (_msk != NULL) delete _msk;
  return TRUE;
}

bool Creazione_Effetti_da_EC::menu(MENU_TAG)
{
  KEY tasto;

  do {
    tasto=get_msk()->run();
    switch (tasto)
    {
    case K_ENTER:       // first check if the application can write effects 
    {
      TSheet_field& sheet =(TSheet_field&)get_msk()->field(F_SHEET_EFF);
      if (!_residuo && sheet.items()>0)
        message_box("Perform writing procedure...");
      break;
    }
  case K_F6: //Selects opened counts from E.C.
  {
    _residuo=0.0;       
    _Partite_aperte = new TArray_sheet(-1,-1,0,0,"Selezione partite aperte","@1|Anno|Numero|Data documento|Saldo@15");
    Load_Partite_Aperte(get_msk()->get_long(F_CODCF));
    _Partite_aperte->run();
    for (int i=0; i<_Partite_aperte->items(); i++)
      if (_Partite_aperte->checked(i))
        _residuo+=(real)_Partite_aperte->row(i).get(4);
    delete _Partite_aperte;
    get_msk()->set(F_RESIDUO,_residuo.string("."));
    TSheet_field& sheet = (TSheet_field&)get_msk()->field(F_SHEET_EFF);
    sheet.reset();
    break;
  }
  default:
    break;
  }
  } while (tasto!=K_QUIT);
  return FALSE;
}

int ef0200(int argc, char* argv[])
{
  Creazione_Effetti_da_EC a ;
  a.run(argc, argv, "Creazione effetti da E.C.");
  return 0;
}
