#ifndef __LFFILES_H
#include "lffiles.h"
#endif

#ifndef __DYNAREL_H
#include "dynarel.h"
#endif


TField_array::TField_array( const TRectype& rec )
{
  int last = rec.items( );
  for( int i = 0; i  < last;  i ++ )
  {
    add( rec.fieldname( i ), rec.get( rec.fieldname( i ) ) );  
  }   
}

const TString& TField_array::get( const TString& nome_campo )
{
  return ( TString& )(*this)[ nome_campo ];
}

int TField_array::get_int( const TString& nome_campo )
{
  return atoi( get( nome_campo ) );
}

long TField_array::get_long( const TString& nome_campo )
{
  return atoi( get( nome_campo ) );
}

bool TField_array::get_bool( const TString& nome_campo )
{ 
  TString p( get( nome_campo ) );
  char fc = toupper( p[ 0 ] );
  return ( fc == 'T' || fc == 'Y' || fc == 'S' || fc == 'X' );
}

real TField_array::get_real( const TString& nome_campo )
{
  real r( get( nome_campo ) );
  return r;
}


TDyna_rel::TDyna_rel( const int main_file_index )
{
  _main_file = main_file_index;
  load_file( main_file_index );
};

bool TDyna_rel::file_added( const int file_index )
{
  return ( &_rules[ file_index ] != NULL );
}

bool TDyna_rel::file_loaded( const int file_index )
{
  return ( &_file_array[ file_index ] != NULL );
}

void TDyna_rel::load_file( const int file_index )
{
  CHECK( file_loaded( file_index ), "Utilizzo di un file non aggiunto alla dyna_rel!" );
  TToken_string rule( ( ( TString& ) _rules[ file_index ] ) );

  // Il file principale è già caricato
  TLocalisamfile to( file_index );
  to.setkey( _keys[ file_index ] );
  to.curr( ).zero( );
  int last = rule.items( );
  // Carico i valori per la ricerca
  for( int i = 0; i < last; i += 3 )
    to.curr( ).put( rule.get( i ), get( ( rule.get_int( i + 1 ) == 0 ? rule.get_int( i + 1 ) : _main_file ), rule.get( i + 2 ) ) );
  to.read ( _isequal );
  // Se il posizionamento riesce ...
  if( !to.bad( ) )
    {
       //  Carica tutti i campi                                   
       _file_array.add( new TField_array( to.curr( ) ), file_index );
    }
}  

void TDyna_rel::add_file( const int file_index, const TToken_string rule, const int key )
{
  _rules[ file_index ] = rule;
  _keys[ file_index ] = key;

};

const TString& TDyna_rel::get( const int file_index, const TString16 nome_campo )
{
  CHECK( file_loaded( file_index ), "Tentativo di accesso ad un campo di un file non caricato!" );
  return ( file( file_index ).get( nome_campo ) );
};

int TDyna_rel::get_int( const int file_index, const TString16 nome_campo )
{
  CHECK( file_loaded( file_index ), "Tentativo di accesso ad un campo di un file non caricato!" );
  return ( file( file_index ).get_int( nome_campo ) );
};

long TDyna_rel::get_long( const int file_index, const TString16 nome_campo )
{
  CHECK( file_loaded( file_index ), "Tentativo di accesso ad un campo di un file non caricato!" );
  return ( file( file_index ).get_long( nome_campo ) );
};

bool TDyna_rel::get_bool( const int file_index, const TString16 nome_campo )
{
  CHECK( file_loaded( file_index ), "Tentativo di accesso ad un campo di un file non caricato!" );
  return ( file( file_index ).get_bool( nome_campo ) );
};

real TDyna_rel::get_real( const int file_index, const TString16 nome_campo )
{
  CHECK( file_loaded( file_index ), "Tentativo di accesso ad un campo di un file non caricato!" );
  return ( file( file_index ).get_real( nome_campo ) );
};

class TCF : public TDyna_rel
{
  public:
    
    TCF( );
    

};

TCF::TCF( ) : TDyna_rel( LF_CLIFO )
{
  add_file( LF_CFVEN, "", 1 );
}