#include <applicat.h>
#include <filetext.h>
#include <mask.h>
#include <progind.h>
#include <utility.h>

#include "../mg/umart.h"
#include "../mg/anamag.h"

#include "ps1100.h"
#include "ps1100100a.h"


/////////////////////////////////////////////////////
// Classe TLis2fil: filetext       //
/////////////////////////////////////////////////////

class TLis2fil_txt: public TFile_text
{
public:
  void save_price(const TRecord_text& rec, const TString& um);
  TLis2fil_txt(const TString& file_name, const TString& config_name);
  virtual ~TLis2fil_txt() { }
};

TLis2fil_txt::TLis2fil_txt(const TString& file_name, const TString& config_name)
          : TFile_text(file_name, config_name)
{
}

//validate per sistemare il prezzo nel file UMART
void TLis2fil_txt::save_price(const TRecord_text& rec, const TString& um)
{
  const TString80 codart = rec.get(0);
  const TPrice prezzo = real(rec.get(2));

  TLocalisamfile umart(LF_UMART);
  TRectype& curr = umart.curr();
  curr.put(UMART_CODART, codart);
  curr.put(UMART_NRIGA, 1);
  curr.put(UMART_UM, um);
  curr.put(UMART_PREZZO, prezzo);

  if (umart.rewrite() != NOERR)
    umart.write();
}

/////////////////////////////////////////////////////
// Classe TLis2fil: applicazione principale        //
/////////////////////////////////////////////////////

class TLis2fil: public TSkeleton_application
{
  TMask*          _msk;
  TString4 _um;
  
protected:
  virtual const char * extra_modules() const {return "ve";}

  virtual bool create(void);
  virtual void main_loop();
  virtual bool destroy(void);
  void transfer(void);
  static bool annulla_handler(TMask_field& f, KEY k);
  const char * get_ini_name(const TString& filename) const;
  void import(const TString& filename);

public:
  const TMask& msk() const { return *_msk; }
  TLis2fil() {}
  virtual ~TLis2fil() {}
};

const char * TLis2fil::get_ini_name (const TString& filename) const
{
  TScanner scan_line(filename);
  const TString& line = scan_line.line();
  return line[0] == '"' ? "ps1100100p.ini" : "ps1100100m.ini";
}

void TLis2fil::import(const TString& filename)
{
  //stabilisce quale tipo di listino e' il file corrente (M o P),carica il .ini relativo
  //lo parsa in modo read
  const char * ini = get_ini_name (filename);
  TLis2fil_txt trasfile(filename, ini);
  trasfile.open(filename,'r');
  const long dimension = fsize(filename);
  TString msg;
  msg << "Acquisizione del file " << filename << " in corso...";
  TProgind pi(dimension, msg, false, true);
  
  TRelation rel(LF_ANAMAG);
  
  TRecord_text curr;
  while (trasfile.read(curr) == NOERR) 
  { 
    pi.setstatus(trasfile.read_file()->tellg());
    trasfile.autosave(rel, curr);
    trasfile.save_price(curr, _um);
  }

  trasfile.close();
}

// creazione dell'applicazione
bool TLis2fil::create()
{                        
  open_files(LF_ANAMAG, LF_UMART, 0);
  
  _msk = new TMask("ps1100100a");
  TString default_dir = "A:\\";
  _msk->set(F_DIRNAME, default_dir);
  TString4 default_um = "PZ";
  _msk->set(F_UM, default_um);

  return TSkeleton_application::create();
}

// distruzione dell'applicazione
bool TLis2fil::destroy()
{
  delete _msk;
  return TSkeleton_application::destroy();
}

// carica la maschera 
void TLis2fil::main_loop()
{
  // Preimposta gli eventuali valori specificati sulla riga di comando            
  KEY key = K_ENTER;
  while (key != K_QUIT)
  {
    key = _msk->run();
    if (key == K_ENTER)
    {
      TString_array dir_files;
      TFilename path = _msk->get(F_DIRNAME);  //da maschera si seleziona la directory di importazione..
      _um = _msk->get(F_UM);
      path.add("*.txt");
      list_files(path, dir_files);  //..poi si mettono tutti i nomi dei files .txt presenti nella dir in un TString_array..
      FOR_EACH_ARRAY_ROW(dir_files, i, row)
        import(*row);               //..e per ogni file (riga del TString-array) si procede all'upload dei record
    }      
  } 
}


// handler per gestire la conferma dell'annullamento dei dati inseriti
// nella maschera
bool TLis2fil::annulla_handler(TMask_field& f, KEY k)
{
  TMask &m = f.mask();
  if (k == K_SPACE)
  {
    if (yesno_box("Vuoi veramente annullare i dati inseriti"))
       m.reset();
  }
  return TRUE;
}


int ps1100100(int argc, char* argv[])
{
  TLis2fil a ;
  a.run(argc, argv, TR("Importazione listino"));
  return 0;
}