#include "ef0301.h"    

///////////////////////////////////////////////////
// Definizione dei metodi della classe TDistinta // 
///////////////////////////////////////////////////

// costruttore distinta utilizzando il record passato
TDistinta::TDistinta(const TRectype& rec)
{      
   read(rec);                           
}

// costruisce la distinta del tipo e numero passati
TDistinta::TDistinta(const char tipo, const long numero)
{      
   read(tipo,numero);                           
}

// permette di leggere la distinta del tipo e numero passati 
int TDistinta::read(const char tipo, const long numero)
{ 
  int err = NOERR;
  CHECK(tipo!='\0' && numero > 0,"Can't read distinta from NULL elements");
  TLocalisamfile f(LF_EFFETTI); 
  for (int i=0; err == NOERR ; i++)
  {
    TEffetto* effetto = new TEffetto; 
    err = effetto->read(f, tipo, numero, i+1);//legge un effetto per chiave 4
    if (err == NOERR)
      _righe_dist.add(effetto);
  }
  // se ho letto degli effetti della distinta ed ho 
  // trovato la fine file elimino l'errore 
  if ((_righe_dist.items()>0)||(err == _iseof) )
    err = NOERR;                                
  return err;
}
 
// permette di leggere la distinta dal record passato    
int TDistinta::read(const TRectype& rec)
{ 
  CHECK(rec.num() == LF_EFFETTI,"Can't read distinta from a different record type");
  const char tipo = rec.get_char(EFF_TIPODIST);
  const long numero = rec.get_long(EFF_NDIST);
  return read(tipo,numero);//legge la distinta
} 

// scrive la distinta
int TDistinta::write(bool force, TToken_string* dati_dist)
{ 
  int err = NOERR;
  //quanti effetti sono nella distinta (nell'array in memoria)
  const int elem = items(); 
  TLocalisamfile f(LF_EFFETTI);
  for (int i=0; i<elem && err==NOERR; i++)
  {
    TEffetto& effetto = (TEffetto&)_righe_dist[i];
    // token string che contiene i dati da registrare sull'effetto 
    dati_dist->restart();
    effetto.put(EFF_TIPODIST, dati_dist->get());
    effetto.put(EFF_NDIST, dati_dist->get_long());   
    effetto.put(EFF_DATADIST, dati_dist->get()); 
    effetto.put(EFF_CODABIP, dati_dist->get_long());
    effetto.put(EFF_CODCABP, dati_dist->get_long());  
    effetto.put(EFF_NRIGADIST, i+1);
    //riscrivo l'effetto con i dati della distinta a cui appartiene
    err = effetto.rewrite(f);
  }    
  return err;  
}

// rimuove la distinta (non si effettua la rimozione del record su file ma si 
// elimina dal file il collegamento tra gli effetti e la distinta)
int TDistinta::remove(char tipodist, long ndist)
{
  int err;
  TLocalisamfile file(LF_EFFETTI);
  // scandisco tutti gli effetti della distinta (nell'array),
  // cancello i dati della distinta e riscrivo gli effetti
  for (int i = 0; i < items(); i++)
  { 
    TEffetto& effetto = (TEffetto&)_righe_dist[i];
    err = effetto.read(file, tipodist,ndist,i+1);
    effetto.zero(EFF_TIPODIST);
    effetto.zero(EFF_NDIST);
    effetto.zero(EFF_DATADIST);
    effetto.zero(EFF_NRIGADIST);
    effetto.zero(EFF_CODABIP);
    effetto.zero(EFF_CODCABP);
    err = effetto.rewrite(file);
  }
  reset();//elimino gli effetti dalla memoria resettando l'array
  return err;  
}                        
