#include <applicat.h>
#include <automask.h>
#include <execp.h>
#include <progind.h>
#include <reputils.h>
#include <utility.h>
#include <relation.h>
#include <reprint.h>
#include <textset.h>
#include <recarray.h>


#include "tabutil.h"

#include "ps0713.h"
#include "ps0713500a.h"

#include <rcausali.h>
#include <clifo.h>
#include <mov.h>
#include <rmov.h>


///////////////////////////////////////////////////////////
// TAutomask
///////////////////////////////////////////////////////////

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

public:
  TImportaSpese_mask();
};
  
TImportaSpese_mask::TImportaSpese_mask() :TAutomask ("ps0713500a")
{
}  

bool TImportaSpese_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
{ 
	switch (f.dlg())
	{
		//giochetto per avere la lista dei files validi nella directory di trasferimento!
		case F_NAME:
			if (e == fe_button)
			{
				TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), 
                           "File@32");
				TFilename path = get(F_PATH);
				path.add("*.csv");	//files delle testate
				list_files(path, as.rows_array());
				TFilename name;
				FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
				{
					name = *row;
					*row = name.name();
				}
				if (as.run() == K_ENTER)
				{
					f.set(as.row(as.selected()));
				}
			}
			break;
		default:
			break;
	}
  return true;
}

                                      ///////////////////////////////////////////////
                                      //// CLASSI DERIVATE PER IMPORTAZIONE DATI ////
                                      ///////////////////////////////////////////////  

/////////////////////////////////////////////////////////////
//	Recordset specifici per i dati da trasferire
/////////////////////////////////////////////////////////////

//Piano dei conti
class TImporta_spese_recordset : public TCSV_recordset
{
  protected:
    virtual TRecnotype new_rec(const char* buf = NULL);    
  
  public:
    TImporta_spese_recordset(const char * fileName);
};

TRecnotype TImporta_spese_recordset::new_rec(const char* buf)
{
  TToken_string str(256,'\t'); //nuovo record tab separator

  if(buf && *buf)
  {
    bool apici=false;

    for (const char* c = buf; *c ; c++)
    {
      if (*c == '"')
      {
        apici = !apici;
      }
      else
      {
        if (*c == ',')
        {
          if (!apici)
            str << str.separator();
          else
            str << *c;
        }
        else
          str << *c;

      }
    }
  }

  const TRecnotype n = TText_recordset::new_rec(str);

  if (n >= 0)
    row(n).separator(str.separator());
  
  return n;
}


TImporta_spese_recordset::TImporta_spese_recordset(const char * fileName)
                        : TCSV_recordset("CSV(,)")
{
	load_file(fileName);
}

///////////////////////////////////////
// TSkeleton_application
///////////////////////////////////////
class TSpeseCSV : public TSkeleton_application
{
	virtual bool check_autorization() const {return false;}
  virtual const char * extra_modules() const {return "ve";}

protected:
  void chiudi_movimento(TConfig& configfile, TImporto& tot_doc, TDate& data);

public:           
  virtual void main_loop();
	bool transfer(const TMask& msk);
 
  TSpeseCSV() {};
};

const char* const nomeini = "ps0713500ats.ini";  //non si conosce il perch�

void TSpeseCSV::chiudi_movimento(TConfig& configfile, TImporto& tot_doc, TDate& data)
{
  //aggiungo i campi che mancano in testata
  configfile.set_paragraph("23");
  configfile.set(MOV_DATAREG, data);
  configfile.set(MOV_DATADOC, data);
  configfile.set(MOV_DATACOMP, data);

	tot_doc.normalize();

  //aggiungo la prima riga che bilancia le righe successive
	TString8 paragraph;
  paragraph.format("%d,%d",LF_RMOV,1);
	configfile.set_paragraph(paragraph);  
	configfile.set(RMV_IMPORTO,tot_doc.valore().string());
  configfile.set(RMV_SEZIONE,tot_doc.sezione());

  configfile.set_paragraph("Transaction");
  
  TString app;
  app << "cg2 -0 -i" << nomeini; 
  TExternal_app primanota(app);
  primanota.run();
}

bool TSpeseCSV::transfer(const TMask& msk)
{
  //genero il nome del file da caricare
  TFilename name = msk.get(F_PATH);
  name.add(msk.get(F_NAME));
  TImporta_spese_recordset s(name);

  TProgind pi(s.items(),"Importazione spese in corso ...",true,true);

  xvt_fsys_removefile(nomeini);
  TConfig configfile (nomeini, "Transaction");  //setto il paragrafo [Transaction] del file ini 

  TDate dataold, data;

  int nriga = 2;
  TImporto tot_doc;

  const TRectype& causale = cache().get(LF_RCAUSALI, msk.get(F_CODCAU));


  for (bool ok=s.move_first();ok;ok=s.move_next())
  {
    if (!pi.addstatus(1)) 
      break;
    
    
	  TString80 tmp;

    //importo
	  tmp = s.get(2).as_string();

    //evito di analizzare eventuali righe vuote
    if (tmp.blank())
      continue;

    tmp.replace(',','.');
    tmp.strip("\"");
    const real imp = tmp;

    if (!imp.is_zero())
    {
      
      //codice commessa
	    tmp = s.get(0).as_string();
      tmp.strip("\"");

      const TRectype& commessa = cache().get("CMS", tmp);

	    //data
	    tmp = s.get(1).as_string();    
      tmp.strip("\"");
	    
	    data.set_day(atoi(tmp.mid(0,2)));
	    data.set_month(atoi(tmp.mid(3,2)));
	    data.set_year(atoi(tmp.mid(6,4)));
      
      //descrizione
	    tmp = s.get(3).as_string();    
      tmp.strip("\"");

	    if(data != dataold)
		  {
        if (dataold.ok())
          chiudi_movimento(configfile, tot_doc, data);

				TFilename filename(nomeini);
				filename.fremove();

        configfile.set_paragraph("Transaction");
        configfile.set("Action","INSERT");
        configfile.set("Mode","AUTO");
        
        configfile.set_paragraph("23"); //setto il paragrafo [23] del file ini (testata)
        configfile.set(MOV_CODCAUS, causale.get(RCA_CODCAUS));
  
        configfile.set_paragraph("24,1");
        configfile.set(RMV_NUMRIG,1);
        configfile.set(RMV_GRUPPO, causale.get(RCA_GRUPPO));
        configfile.set(RMV_CONTO, causale.get(RCA_CONTO));
        configfile.set(RMV_SOTTOCONTO, causale.get(RCA_SOTTOCONTO));

			  tot_doc.reset();
        nriga = 2;
        dataold = data;
      }

	    TImporto importo('D', imp);
	    importo.normalize();
      tot_doc -= importo;
		  
	    TString8 paragraph;
      paragraph.format("%d,%d",LF_RMOV,nriga++);
      configfile.set_paragraph(paragraph);

      configfile.set(RMV_IMPORTO,importo.valore().string());
      configfile.set(RMV_SEZIONE,importo.sezione());
      configfile.set(RMV_CODCMS,commessa.get("CODTAB"));
      configfile.set(RMV_DATAREG,data);
      configfile.set(RMV_GRUPPO,commessa.get("I1"));
      configfile.set(RMV_CONTO,commessa.get("I2"));
      configfile.set(RMV_SOTTOCONTO,commessa.get("I3"));
    }

  }

  chiudi_movimento(configfile, tot_doc, data);
    
  return true;
}


void TSpeseCSV::main_loop()
{
  TImportaSpese_mask msk;
	
  if (msk.run() == K_ENTER)
  {		
		if (transfer(msk))
		{
      message_box(TR("Importazione spese completata"));
      xvt_fsys_removefile(nomeini);
		}
  }   
}


TSpeseCSV& app() { return (TSpeseCSV&) main_app(); }


int ps0713500 (int argc, char* argv[])
{
  TSpeseCSV main_app;
  main_app.run(argc, argv, TR("Importazione Spese"));
  return true;
}