string Mediator::search(IndexWrapper::indexItem index, string toSearch)
{
	Key* k = NULL;
	string toReturn;
	list<int>* bookIds;
	//string separator;
	//list<string> wordsToFind;
	FileParser* fp;
	map<string, Term*> wordsToFind;
	list<Word*> words;
	list<int>* coincidenceDocs = NULL;
	list<int>* notCoincidenceDocs = NULL;
	list<BookGlobalWeight*>* bookByGlobalWeight = NULL;
	bool doSearch = false;
	int totalBooks;

	switch(index){
		case IndexWrapper::EDITORIAL:
			k = new Key(toSearch);
			bookIds = this->indexWrapper->searchAllIds(k, index);
			break;
		case IndexWrapper::AUTOR:
			k = new Key(toSearch);
			bookIds = this->indexWrapper->searchAllIds(k, index);
			break;
		case IndexWrapper::TITULO:
			k = new Key(toSearch);
			bookIds = this->indexWrapper->searchAllIds(k, index);
			break;
		case IndexWrapper::PALABRAS:
		{
			bookIds = new list<int>();

			//separator = " ";
			//wordsToFind = Utility::split(toSearch, separator);

			fp = new FileParser();
			fp->setWords(toSearch);
			wordsToFind = fp->getTerms();
			delete fp;

			// Se recorre todas las palabras de las busqueda, y se buscan en el hash
			for(map<string, Term*>::iterator it = wordsToFind.begin(); it != wordsToFind.end(); ++it)
			{
				Key* k = new Key((*it).first);
				list<int>* booksWords = this->indexWrapper->searchAllIds(k, index);
				Word* newWord = new Word((*it).first, booksWords);
				words.push_back(newWord);
				if (newWord->getBooks()->size() > 0)
					doSearch = true;
				delete k;
			}

			if (wordsToFind.size()>0 && doSearch)
			{
				//Obtiene los libros en que se encuentran en todas las palabras
				coincidenceDocs = this->findCoincidences(words);
				if (coincidenceDocs->size() > 0)
				{
					list<RankingBook>* listRanking;
					listRanking = findTermProxIdBooks(coincidenceDocs,words);
					list<RankingBook>::iterator itRanking;

					cout << "Ids book Encontrados por Terminos Proximos: ";
					for(itRanking=listRanking->begin();itRanking!=listRanking->end();++itRanking)
					{
						int idBook = (*itRanking).getIdBook();
						cout << idBook << " ";
						bookIds->push_back(idBook);
					}
					cout << endl;
				}

				//Obtiene los libros que se encuentran solo algunas de las palabras
				notCoincidenceDocs = this->findNotCoincidences(words, coincidenceDocs);
				if (notCoincidenceDocs->size() > 0)
				{
					//Ordena los documentos que no tienen coincidencia total en los terminos segun el peso global
					totalBooks = coincidenceDocs->size() + notCoincidenceDocs->size();
					bookByGlobalWeight = this->orderBookByGlobalWeight(notCoincidenceDocs, words, totalBooks);

					cout << "Ids book Encontrados por Peso Global: ";
					for(list<BookGlobalWeight*>::iterator itGW = bookByGlobalWeight->begin(); itGW!=bookByGlobalWeight->end(); ++itGW)
					{
						int idBook = (*itGW)->getIdBook();
						cout << idBook << " ";
						bookIds->push_back(idBook);
					}
					cout << endl;
				}
			}

			break;
		}
		default:
			break;
	}

	if(bookIds->size() > 0){
		for (list<int>::iterator it = bookIds->begin(); it != bookIds->end(); ++it)
		{
			ByteString bs = this->dataBookManager->getBook(*it);
			Book b;
			b.Hidratate(bs);
			toReturn.append(b.getBookFormatedText());
		}
	}else
		toReturn = "La busqueda no arrojo resultados";


	delete k;
	return toReturn;
}