#include <applicat.h>

#include "../ve/velib.h"

                                                    //////////////////////////////////////////
                                                    ////    TAGGIUNGI_LISTINI_HABA_APP    ////
                                                    //////////////////////////////////////////

//Classe TAggiungi_listini_app
class TAggiungi_listini_haba_app : public TSkeleton_application
{
private:
  TFilename _ini_name;
    
protected:
  virtual bool check_autorization() const {return false;}
  virtual const char * extra_modules() const {return "cg";}

  virtual void main_loop();
  void check_doc();

public:
  bool load_ini(bool check);  
};


//LOAD_INI: carica il file ini che contiene il documento
bool TAggiungi_listini_haba_app::load_ini(bool check)
{   
  //argc  é un intero che specifica quanti parametri vengono passati al programma dalla linea di comando
  const int args = argc();
  
  const int narg = check ? 3 : 2;
  
  //argv  é un array di null-terminated strings
  if (args <= narg)
    return false;                                     

	const TFixed_string arg = argv(narg);
  if ((arg[0] != '-' && arg[0] != '/') || (arg[1] != 'i' && arg[1] != 'I'))
    return false;
    
  _ini_name = arg.mid(2);
  if (_ini_name.blank() && args > 3)  
    _ini_name = argv(3);
    
  //controlla che il file su cui deve scrivere ci sia; se non c'é dá una segnalazione di errore
  if (!_ini_name.exist())
    return false;
  
  return true;
}

//CHECK_DOC: scorro il file ini e aggiungo alla tabella dei listini le righe mancanti
void TAggiungi_listini_haba_app::check_doc()
{              
  TConfig ini(_ini_name, "33");
  TString4 para;  para.format("%d", LF_DOC);
	const int anno = ini.get_int(DOC_ANNO, para);
  TString4 mese; mese.format("%02d", TDate(ini.get(DOC_DATADOC)).month());

  TTable listini("LGM");

  //scorro le righe documento, saltando quelle che non sono articoli,
  //e fermandomi quando la set_paragraph fallisce dal momento che non so a priori
  //quante sono le righe del documento
  for(int i = 1; ; i++)
  {
    TString4 riga; riga.format("%d,%d", LF_RIGHEDOC, i);
    
    if(!ini.set_paragraph(riga))
      break;

		if(ini.get(RDOC_TIPORIGA) != "A1")
			continue;

    if(ini.get(RDOC_CODARTMAG).empty())
      continue;

    const TString& codart  = ini.get(RDOC_CODART);

		//devo prendere il prezzo al Kg (salvato in USER9, campo virtuale) e non il prezzo della riga
		const TString& r1 = ini.get(ini.get(RDOC_RG1));
		const int  inizio = r1.find("USER9=");
		const int fine = r1.find("\\n", inizio);
		TToken_string tmp(r1.sub(inizio, fine), '=');
    const real importo(tmp.get(1));

    real spessore(ini.get(RDOC_LIVELLO));
		spessore.ceil();

    //il gruppo va letto dall'anagrafica magazzino
    const TString16 gruppo = cache().get(LF_ANAMAG, codart, ANAMAG_GRMERC);

    TString80 codtab;
    codtab << gruppo << mese << spessore;

    listini.put("CODTAB", codtab);
    //se fallisce la read, allora aggiungo la riga
    if(listini.read() != NOERR)
    {
      listini.zero();
      listini.put("CODTAB", codtab);
      listini.put("R0",     importo);
      listini.write();
    }
  }
}

void TAggiungi_listini_haba_app::main_loop() //definizione della member function main_loop, della classe TAggiungi_listini_haba_app
{
 	TString sw(argv(2)); sw.upper(); 
 	const bool chk_doc = sw == "-V";

  open_files(LF_TAB, LF_DOC, LF_RIGHEDOC, 0);

  //mostra un messaggio di errore se non riesce ad aprire  il file richiesto; nota la conversione dei tipi che
  //é da eseguire quando devo passare una TString ad un %s
  if(!load_ini(chk_doc))
  {
    error_box(TR("Impossibile aprire il file '%s'"), (const char*)_ini_name);
    return;
  }
  else
  {
	  check_doc();
    message_box(TR("Importazione listini completata"));
  }
}

//////  Esecuzione del programma  ///////////

int pd6411200(int argc, char* argv[])
{
  TAggiungi_listini_haba_app app;
  app.run(argc,argv,"Listini Haba");
  return 0;
}