package com.masterofcode.android.magreader.search;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.kroz.activerecord.ActiveRecordBase;
import org.kroz.activerecord.ActiveRecordException;
import android.content.Context;
import com.masterofcode.android.EPubBook.EPubBook;
import com.masterofcode.android.EPubBook.EPubBookProcessingListener;
import com.masterofcode.android.EPubBook.EPubBookSearchResult;
import com.masterofcode.android.magreader.application.JtjApplication;
import com.masterofcode.android.magreader.db.entity.FeedItem;
import com.masterofcode.android.magreader.db.entity.LibraryItem;
import com.masterofcode.android.magreader.library.LibraryManager;
import com.masterofcode.android.magreader.library.ResourceMagazinesCopyingListener;
import com.masterofcode.android.magreader.utils.constants.Constants;
public class SearchManager {
private static SearchManager instance = null;
private FeedSearchDbAdapter feedSearchDbAdapter;
private ActiveRecordBase _db;
public SearchManager()
{
super();
}
static public SearchManager getInstance()
{
if(instance==null)
{
instance = new SearchManager();
}
return instance;
}
public ArrayList<SearchResultItem> searchWithType(Context context, int searchType, String keyword)
{
ArrayList<SearchResultItem> result = null;
switch (searchType) {
case Constants.SEARCH_TYPE_FEEDS:
result = searchInFeeds(context, keyword);
break;
case Constants.SEARCH_TYPE_LIBRARY:
result = searchInLibrary(context, keyword);
break;
case Constants.SEARCH_TYPE_EVERYWHERE:
result = searchEverywhere(context, keyword);
break;
default:
break;
}
return result;
}
public ArrayList<SearchResultItem> searchInFeeds(Context context, String keyword)
{
ArrayList<SearchResultItem> feedSearchResults = null;
try {
feedSearchDbAdapter = new FeedSearchDbAdapter(context);
feedSearchDbAdapter.open();
List<FeedItem> feedItemSearchResults = new ArrayList<FeedItem>();
HashSet<String> results = feedSearchDbAdapter.search(keyword);
_db = JtjApplication.getInstance().getDatabase();
_db.open();
for(String mGUID : results){
for (FeedItem feedItem : _db.find(FeedItem.class, "GUID=?", new String[] { mGUID })){
feedItemSearchResults.add(feedItem);
break;
}
}
for(FeedItem feedItem : feedItemSearchResults){
SearchResultItem searchItem = new SearchResultItem();
searchItem.assignFeedItem(feedItem);
if(feedSearchResults==null)feedSearchResults = new ArrayList<SearchResultItem>();
feedSearchResults.add(searchItem);
}
return feedSearchResults;
} catch (ActiveRecordException e) {
e.printStackTrace();
}
return feedSearchResults;
}
/*private void checkDefaultIsCopied(Context context)
{
if(LibraryManager.GetInstance().isAllMagazinesIsCopied(context)) return;
LibraryManager.GetInstance().copyResourceMagazines(context, new ResourceMagazinesCopyingListener() {
@Override
public void onProgress(float copied) {
}
});
}*/
public ArrayList<SearchResultItem> searchInLibrary(Context context, String keyword)
{
//checkDefaultIsCopied(context);
ArrayList<SearchResultItem> result = null;
List<LibraryItem> libraryItems = LibraryManager.GetInstance().queryLibraryItems();
for(LibraryItem currentLibraryItem : libraryItems)
{
// check if epub is downloaded
File bookf = new File(currentLibraryItem.magazine_filepath);
if(!bookf.canRead()) continue;
EPubBook currentBook = new EPubBook(context, currentLibraryItem.magazine_filepath, false);
try {
currentBook.load();
// extract if need
if(currentBook.isNeedExtract())
{
currentBook.extractContentToExternalStorage(new EPubBookProcessingListener() {
@Override
public void onProgress(long percentsExtracted) {
}
});
}
// process media if need
if(currentBook.isNeedProcessingMedia())
{
currentBook.processMedia(new EPubBookProcessingListener() {
@Override
public void onProgress(long percentsExtracted) {
}
});
}
EPubBookSearchResult searchResult = currentBook.isContainsKeyword(keyword);
if(searchResult.isKeywordFinded())
{
if(result==null) result = new ArrayList<SearchResultItem>();
ArrayList<Integer> topics = searchResult.getTopicsWithKeyword();
boolean combineTopics = false;
if(Constants.SEARCH_IN_LIBRARY_WITH_THRESHOLD)
{
if(((float)(topics.size())) / currentBook.getTopicsCount() > Constants.SEARCH_IN_LIBRARY_ALL_BOOK_THRESHOLD)
{
combineTopics = true;
}
}
// check if topics with finded keywords bigger than thrashold, to interpreting
// search result as whole book or no
if(combineTopics)
{
SearchResultItem newSearchResult = new SearchResultItem();
newSearchResult.assignLibraryItem(currentLibraryItem);
newSearchResult.setLibraryItemWholeBook(true);
newSearchResult.setLibraryItemTopics(topics);
if(topics.size()>0) newSearchResult.setLibraryItemTopicIndex(topics.get(0).intValue());
else newSearchResult.setLibraryItemTopicIndex(0);
ArrayList<String> topicTitles = searchResult.getTopicsTitles();
String resultTitles = null;
for(int i=0; i<topicTitles.size(); i++)
{
if(resultTitles==null) resultTitles = topicTitles.get(i);
else resultTitles = resultTitles + ", " + topicTitles.get(i);
}
newSearchResult.setLibraryItemTopicTitle(resultTitles);
result.add(newSearchResult);
} else {
ArrayList<String> topicTitles = searchResult.getTopicsTitles();
for(int i=0; i<topics.size(); i++)
{
SearchResultItem newSearchResult = new SearchResultItem();
newSearchResult.assignLibraryItem(currentLibraryItem);
newSearchResult.setLibraryItemTopics(topics);
newSearchResult.setLibraryItemTopicTitle(topicTitles.get(i));
newSearchResult.setLibraryItemTopicIndex(topics.get(i).intValue());
newSearchResult.setLibraryItemWholeBook(false);
result.add(newSearchResult);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
public ArrayList<SearchResultItem> searchEverywhere(Context context, String keyword)
{
ArrayList<SearchResultItem> feedSearchResults = searchInFeeds(context, keyword);
ArrayList<SearchResultItem> librarySearchResults = searchInLibrary(context, keyword);
ArrayList<SearchResultItem> result = feedSearchResults;
if(result!=null)
{
if(librarySearchResults!=null)
{
result.addAll(librarySearchResults);
}
} else {
result = librarySearchResults;
}
return result;
}
}