package org.softeg.slartus.forpdaapi.search;/*
* Created by slinkin on 14.04.2014.
*/
import android.content.SharedPreferences;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.Html;
import android.util.Log;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import org.softeg.slartus.forpdacommon.UrlExtensions;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SearchSettings implements Parcelable {
/*
сортировать результаты по релевантности
*/
public static final String RESULT_SORT_RELEVANT = "rel";
/*
сортировать результаты по дате(от новых к старым)
*/
public static final String RESULT_SORT_DATE_DESC = "dd";
/*
сортировать результаты по дате(от старых к новым)
*/
public static final String RESULT_SORT_DATE = "da";
/*
результаты в виде сообщений
*/
public static final String RESULT_VIEW_POSTS = "posts";
/*
результаты в виде тем
*/
public static final String RESULT_VIEW_TOPICS = "topics";
/*
Искать везде
*/
public static final String SOURCE_ALL = "all";
/*
Искать Только в заголовках тем
*/
public static final String SOURCE_TOPICS = "top";
/*
Искать Только в сообщениях
*/
public static final String SOURCE_POSTS = "pst";
//общий поиск
public static final String SEARCH_TYPE_FORUM = "SEARCH_TYPE_FORUM";
// поиск в теме
public static final String SEARCH_TYPE_TOPIC = "SEARCH_TYPE_TOPIC";
// поиск тем пользователя
public static final String SEARCH_TYPE_USER_TOPICS = "SEARCH_TYPE_USER_TOPICS";
// поиск сообщений пользователя
public static final String SEARCH_TYPE_USER_POSTS = "SEARCH_TYPE_USER_POSTS";
private String m_SearchType = SEARCH_TYPE_FORUM;
protected Set<String> m_TopicsIds = new HashSet<>();
protected String m_Query;
protected String m_ResultView = RESULT_VIEW_POSTS;
protected Boolean m_SearchInSubForums = true;
protected String m_Sort = RESULT_SORT_DATE_DESC;
protected String m_UserName;
protected String m_Source = SOURCE_ALL;
protected Set<String> m_ForumsIds = new HashSet<>();
public SearchSettings() {
}
public SearchSettings(String searchType) {
m_SearchType = searchType;
}
public String getQuery() {
return m_Query;
}
public String getUserName() {
return m_UserName;
}
public String getSource() {
return m_Source;
}
public String getSort() {
return m_Sort;
}
public void setSearchInSubForums(Boolean value) {
m_SearchInSubForums = value;
}
public Set<String> getForumsIds() {
return m_ForumsIds;
}
public String getSearchQuery() throws URISyntaxException {
List<NameValuePair> qualms = new ArrayList<>();
qualms.add(new BasicNameValuePair("act", "search"));
qualms.add(new BasicNameValuePair("query", m_Query));
qualms.add(new BasicNameValuePair("username", m_UserName));
for (String key : m_ForumsIds)
qualms.add(new BasicNameValuePair("forums[]", key));
for (String key : m_TopicsIds)
qualms.add(new BasicNameValuePair("topics[]", key));
qualms.add(new BasicNameValuePair("subforums", m_SearchInSubForums ? "1" : "0"));
qualms.add(new BasicNameValuePair("source", m_Source));
qualms.add(new BasicNameValuePair("sort", m_Sort));
qualms.add(new BasicNameValuePair("result", m_ResultView));
qualms.add(new BasicNameValuePair("noform", "1"));
URI uri = URIUtils.createURI("http", "4pda.ru", -1, "/forum/index.php",
URLEncodedUtils.format(qualms, "windows-1251"), null);
return uri.toString();
}
public String getResultView() {
return m_ResultView;
}
public Boolean tryParse(String url) {
url = tryUrlDecode(url);
url = Html.fromHtml(url).toString();
Matcher m = Pattern.compile("(?:([\\w\\[\\]]+)=(.*?))(?:\\&|$)").matcher(url);
m_ForumsIds = new HashSet<>();
m_TopicsIds = new HashSet<>();
boolean res = false;
while (m.find()) {
String key = m.group(1).toLowerCase();
String val = m.group(2);
switch (key) {
case "query":
m_Query = val;
res = true;
break;
case "username":
m_UserName = val;
res = true;
break;
case "forums[]":
m_ForumsIds.add(val);
res = true;
break;
case "subforums":
m_SearchInSubForums = "1".equals(val);
res = true;
break;
case "source":
m_Source = val;
res = true;
break;
case "sort":
m_Sort = val;
res = true;
break;
case "result":
m_ResultView = val;
res = true;
break;
case "topics[]":
m_TopicsIds.add(val);
res = true;
break;
}
}
return res;
}
private String tryUrlDecode(String url) {
try {
if (UrlExtensions.isUrlUtf8Encoded(url))
return URLDecoder.decode(url, "UTF-8");
return URLDecoder.decode(url, "windows-1251");
} catch (UnsupportedEncodingException e) {
return url;
}
}
private String tryUrlEncode(String url) {
try {
return URLEncoder.encode(url, "windows-1251");
} catch (UnsupportedEncodingException e) {
return url;
}
}
public int describeContents() {
return 0;
}
// упаковываем объект в Parcel
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(m_SearchType);
parcel.writeString(m_Query);
parcel.writeString(m_UserName);
parcel.writeInt(m_TopicsIds.size());
for (String forumId : m_TopicsIds) {
parcel.writeString(forumId);
}
parcel.writeString(m_ResultView);
parcel.writeByte((byte) (m_SearchInSubForums ? 1 : 0));
parcel.writeString(m_Sort);
parcel.writeString(m_Source);
parcel.writeInt(m_ForumsIds.size());
for (String forumId : m_ForumsIds) {
parcel.writeString(forumId);
}
}
public static final Parcelable.Creator<SearchSettings> CREATOR = new Parcelable.Creator<SearchSettings>() {
// распаковываем объект из Parcel
public SearchSettings createFromParcel(Parcel in) {
return new SearchSettings(in);
}
public SearchSettings[] newArray(int size) {
return new SearchSettings[size];
}
};
// конструктор, считывающий данные из Parcel
private SearchSettings(Parcel parcel) {
m_SearchType = parcel.readString();
m_Query = parcel.readString();
m_UserName = parcel.readString();
int count = parcel.readInt();
for (int i = 0; i < count; i++) {
m_TopicsIds.add(parcel.readString());
}
m_ResultView = parcel.readString();
m_SearchInSubForums = parcel.readByte() == 1;
m_Sort = parcel.readString();
m_Source = parcel.readString();
count = parcel.readInt();
for (int i = 0; i < count; i++) {
m_ForumsIds.add(parcel.readString());
}
}
public SharedPreferences.Editor save(SharedPreferences.Editor editor) {
editor.putString("search.query", m_Query);
editor.putString("search.username", m_UserName);
saveForums(editor);
saveSearchInSubForums(editor);
editor.putString("search.source", m_Source);
editor.putString("search.sort", m_Sort);
editor.putString("search.result", m_ResultView);
return editor.putStringSet("search.topics", m_TopicsIds);
}
public SharedPreferences.Editor saveForums(SharedPreferences.Editor editor) {
return editor.putStringSet("search.forums", m_ForumsIds);
}
public SharedPreferences.Editor saveSearchInSubForums(SharedPreferences.Editor editor) {
return editor.putBoolean("search.subforums", m_SearchInSubForums);
}
public void load(SharedPreferences preferences) {
m_Query = preferences.getString("search.query", m_Query);
m_UserName = preferences.getString("search.username", m_UserName);
loadForums(preferences);
m_SearchInSubForums = preferences.getBoolean("search.subforums", m_SearchInSubForums);
m_Source = preferences.getString("search.source", m_Source);
m_Sort = preferences.getString("search.sort", m_Sort);
m_ResultView = preferences.getString("search.result", m_ResultView);
m_TopicsIds = preferences.getStringSet("search.topics", m_TopicsIds);
}
public void loadForums(SharedPreferences preferences) {
m_ForumsIds = new HashSet<>();
Set<String> defaultForumIds = new HashSet<>();
defaultForumIds.add("all");
m_ForumsIds.addAll(preferences.getStringSet("search.forums", defaultForumIds));
}
public boolean getIsSubForums() {
return m_SearchInSubForums;
}
public void setQuery(String query) {
this.m_Query = query;
}
public void setUserName(String userName) {
this.m_UserName = userName;
}
public Set<String> getTopicIds() {
return m_TopicsIds;
}
public void setSource(String source) {
this.m_Source = source;
}
public void setSort(String sort) {
this.m_Sort = sort;
}
public void setResultView(String resultView) {
this.m_ResultView = resultView;
}
public static SearchSettings parse(String url) {
SearchSettings res = new SearchSettings(SEARCH_TYPE_FORUM);
res.tryParse(url);
return res;
}
public String getSearchType() {
return m_SearchType;
}
}