package com.aptoide.amethyst.webservices;
import android.text.TextUtils;
import com.aptoide.amethyst.Aptoide;
import com.aptoide.models.displayables.SearchApk;
import com.aptoide.amethyst.models.search.SearchResults;
import com.aptoide.amethyst.utils.AptoideUtils;
import com.aptoide.dataprovider.webservices.models.Constants;
import com.octo.android.robospice.request.retrofit.RetrofitSpiceRequest;
import java.util.HashMap;
import java.util.List;
import retrofit.http.FieldMap;
import retrofit.http.FormUrlEncoded;
import retrofit.http.POST;
/**
* Created by rmateus on 12/06/15.
*/
public class SearchRequest extends RetrofitSpiceRequest<SearchResults, SearchRequest.Webservice> {
public interface Webservice {
@POST("/webservices.aptoide.com/webservices/3/listSearchApks")
@FormUrlEncoded
SearchJson searchApks(@FieldMap HashMap<String, String> args);
}
private static final String PACKAGE = "package";
private static final String MODE = "mode";
private static final String TYPE = "type";
private static final String MATURE = "mature";
private static final String VERCODE = "vercode";
private static final String REPO = "repos";
private static final String LIMIT = "limit";
private static final String OFFSET = "offset";
private static final String U_LIMIT = "u_limit";
private static final String U_OFFSET = "u_offset";
private static final String LANG = "lang";
private static final String FILTERS = "q";
private static final String SEARCH = "search";
public static final int SEARCH_LIMIT = 7;
public static final int OTHER_REPOS_SEARCH_LIMIT = 0;
private String[] repos = {};
private String search;
private int limit;
private int offset;
private int u_offset;
public void setOtherReposLimit(int otherReposLimit) {
this.otherReposLimit = otherReposLimit;
}
private int otherReposLimit;
public SearchRequest() {
super(SearchResults.class, SearchRequest.Webservice.class);
}
public void setU_offset(int u_offset) {
this.u_offset = u_offset;
}
@Override
public SearchResults loadDataFromNetwork() throws Exception {
HashMap<String, String> args = new HashMap<>();
args.put(MODE, "json");
args.put(SEARCH, search);
args.put(FILTERS, Aptoide.filters);
//build options
StringBuilder optionsString = new StringBuilder();
optionsString.append("(");
optionsString.append(putIntOptionString("limit", limit));
optionsString.append(putIntOptionString("u_limit", otherReposLimit));
if (repos.length > 0) {
optionsString.append("repos=" + TextUtils.join(",", repos) + ";");
}
optionsString.append(putIntOptionString("offset", offset));
optionsString.append(putIntOptionString("u_offset", u_offset));
optionsString.append(putIntOptionString("mature", AptoideUtils.getSharedPreferences().getBoolean(Constants.MATURE_CHECK_BOX, false)));
optionsString.append(")");
args.put("options", optionsString.toString());
SearchJson json = getService().searchApks(args);
SearchResults results = new SearchResults();
for (SearchJson.Apk apk : json.results.apks) {
results.apkList.add(apk.toSearchApk());
}
for (SearchJson.Apk apk : json.results.uApks) {
results.uApkList.add(apk.toSearchApk());
}
results.didyoumean.addAll(json.results.didyoumean);
setFromSubscribedStores(results.apkList);
setPositions(results.apkList, results.uApkList);
return results;
}
private void setFromSubscribedStores(List<SearchApk> apkList) {
for (SearchApk searchApk : apkList) {
searchApk.fromSubscribedStore = true;
}
}
/**
* Define search items position for Analytics purpose.
*/
private void setPositions(List<SearchApk> apkList, List<SearchApk> uApkList) {
int i = offset + u_offset + 1;
if (!apkList.isEmpty()) {
for (SearchApk apk : apkList) {
apk.position = i++;
}
}
if (!uApkList.isEmpty()) {
for (SearchApk apk : uApkList) {
apk.position = i++;
}
}
}
public void setRepos(String... repos) {
this.repos = repos;
}
public void setSearchQuery(String search) {
this.search = search;
}
private String putIntOptionString(String argName, Boolean value) {
return putIntOptionString(argName, String.valueOf(value));
}
private String putIntOptionString(String argName, int value) {
if (value > 0) {
return putIntOptionString(argName, String.valueOf(value));
}else return "";
}
private String putIntOptionString(String argName, String value) {
return argName + "=" + value + ";";
}
public void setLimit(int limit) {
this.limit = limit;
}
public void setOffset(int offset) {
this.offset = offset;
}
}