package io.github.xwz.base.content;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import io.github.xwz.base.api.EpisodeBaseModel;
import io.github.xwz.base.trie.RadixTree;
public class ContentCacheManager {
private static final String TAG = "ContentCacheManager";
private final LocalBroadcastManager mBroadcastManager;
private Map<String, EpisodeBaseModel> mEpisodes = new HashMap<>();
private List<EpisodeBaseModel> mShows = new ArrayList<>();
private RadixTree<String> mDictionary = new RadixTree<>();
private final Map<String, Uri> mStreamUrls = new HashMap<>();
private Map<String, List<EpisodeBaseModel>> mCollections = new LinkedHashMap<>();
public ContentCacheManager(Context context) {
mBroadcastManager = LocalBroadcastManager.getInstance(context);
}
public void broadcastChange(String change, String tag, String id) {
Intent intent = new Intent(change);
if (tag != null) {
intent.putExtra(ContentManagerBase.CONTENT_TAG, tag);
}
if (id != null) {
intent.putExtra(ContentManagerBase.CONTENT_ID, id);
}
Log.d(TAG, "Broadcast:=> " + change);
if (mBroadcastManager != null) {
mBroadcastManager.sendBroadcast(intent);
}
}
public void broadcastChangeDelayed(long delay, final String change, final String tag, final String id) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
broadcastChange(change, tag, id);
}
}, delay);
}
public void broadcastChange(String change, String tag) {
broadcastChange(change, tag, null);
}
public void broadcastChange(String change) {
broadcastChange(change, null, null);
}
synchronized public List<EpisodeBaseModel> getAllShows() {
return new ArrayList<>(mShows);
}
synchronized public boolean hasShows() {
return !mShows.isEmpty();
}
synchronized public void putShows(Collection<EpisodeBaseModel> shows) {
mShows = new ArrayList<>(shows);
}
public void putCollections(LinkedHashMap<String, List<EpisodeBaseModel>> collection) {
mCollections = new LinkedHashMap<>(collection);
}
synchronized public LinkedHashMap<String, List<EpisodeBaseModel>> getCollections() {
return new LinkedHashMap<>(mCollections);
}
synchronized public void putEpisodes(Collection<EpisodeBaseModel> episodes) {
mEpisodes = new HashMap<>();
addEpisodes(episodes);
}
synchronized public void addEpisodes(Collection<EpisodeBaseModel> episodes) {
for (EpisodeBaseModel ep : episodes) {
mEpisodes.put(ep.getHref(), ep);
}
}
synchronized public void buildDictionary(Collection<EpisodeBaseModel> shows) {
mDictionary = buildWordsFromShows(shows);
}
synchronized public List<String> getSuggestions(String query) {
return mDictionary.getValuesWithPrefix(query);
}
synchronized public EpisodeBaseModel updateEpisode(EpisodeBaseModel ep) {
if (mEpisodes.containsKey(ep.getHref())) {
mEpisodes.get(ep.getHref());
} else {
mEpisodes.put(ep.getHref(), ep);
}
return mEpisodes.get(ep.getHref());
}
synchronized public EpisodeBaseModel getEpisode(String href) {
if (href != null) {
return mEpisodes.get(href);
}
return null;
}
synchronized public void putStreamUrl(String id, Uri url) {
mStreamUrls.put(id, url);
}
synchronized public Uri getEpisodeStreamUrl(String id) {
return mStreamUrls.get(id);
}
private RadixTree<String> buildWordsFromShows(Collection<EpisodeBaseModel> shows) {
RadixTree<String> dict = new RadixTree<>();
for (EpisodeBaseModel ep : shows) {
dict.putAll(getWords(ep));
}
Log.d(TAG, "dict:" + dict.size());
return dict;
}
private Map<String, String> getWords(EpisodeBaseModel episode) {
Map<String, String> words = new HashMap<>();
if (episode.getSeriesTitle() != null) {
words.putAll(splitWords(episode.getSeriesTitle(), episode));
}
if (episode.getTitle() != null) {
words.putAll(splitWords(episode.getTitle(), episode));
}
return words;
}
private Map<String, String> splitWords(String s, EpisodeBaseModel episode) {
String[] words = s.split("\\s+");
Map<String, String> result = new HashMap<>();
for (String w : words) {
String word = w.replaceAll("[^\\w]", "");
if (word.length() >= 3) {
result.put(word.toLowerCase(), word);
}
}
return result;
}
}