#include "MbariVisualObjectDB.H"
#include "MbariVisualObject.H"

#include <fstream>


/******************************************************************************
 *
 *                          CONSTRUCTOR
 * 
 * ****************************************************************************/

MbariVisualObjectDB::MbariVisualObjectDB()
	:VisualObjectDB() 
{
}

/******************************************************************************
 *
 *                          DESTRUCTOR
 * 
 * ****************************************************************************/

MbariVisualObjectDB::~MbariVisualObjectDB()
{
}


/******************************************************************************
 *
 *                          LOAD A DATA BASE
 * 
 * ****************************************************************************/

bool MbariVisualObjectDB::loadDB(const std::string& fname)
{
  const char *fn = fname.c_str();
  LINFO("Loading Visual Object database '%s'...", fn);

  std::ifstream inf(fn);
  if (inf.is_open() == false)
    { LERROR("Cannot open '%s' -- USING EMPTY", fn); return false; }

  std::string filepathstr = fname.substr(0, fname.find_last_of('/')+1);
  
  LINFO(" filePath = %s \n", filepathstr.c_str());
  filepathstr ="";

  if (filepathstr == "") {
    inf>>(*this);
    createMbariVisualObjectDB(inf, *this);
  }
  else {
    createVisualObjectDB(inf, *this, filepathstr);
  }

  inf.close();
  LINFO("Done. Loaded %u VisualObjects.", numObjects());
  return true;
}

/******************************************************************************
 *
 *               CREATE A MbariVisualObject from the DataBase
 * 
 * ****************************************************************************/
void MbariVisualObjectDB::
createMbariVisualObjectDB(std::istream& is, MbariVisualObjectDB& vdb,
                     std::string filepath)
{
 
   std::string name;
   std::getline(is, name); 
  
 // LINFO("name apres '%s'...\n", name.c_str()); // test francois

  vdb.setName(name);
  uint siz; is>>siz;
  LINFO("filepath '%s'...\n", filepath.c_str()); // test francois

  vdb.itsObjects.clear(); vdb.itsObjects.resize(siz);

  std::vector< rutz::shared_ptr<MbariVisualObject> >::iterator
    vo = vdb.itsObjects.begin(), stop = vdb.itsObjects.end();
   
  while (vo != stop)
    {
      rutz::shared_ptr<VisualObject> newvo(new MbariVisualObject());
      is>>(*newvo);   
    }
  *vo++ = newvo;
    
}
