package fi.bitrite.android.ws.host.impl;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import fi.bitrite.android.ws.api.RestClient;
import fi.bitrite.android.ws.host.Search;
import fi.bitrite.android.ws.model.HostBriefInfo;
import fi.bitrite.android.ws.util.GlobalInfo;
import fi.bitrite.android.ws.util.http.HttpException;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class RestTextSearch extends RestClient implements Search {

    private final String keyword;

    public RestTextSearch(String keyword) {
        this.keyword = keyword;
    }

    private static final String WARMSHOWERS_HOST_BY_KEYWORD_URL = GlobalInfo.warmshowersBaseUrl + "/services/rest/hosts/by_keyword";

    /*
     * Searches wsuser using service.
     *
     * The whole concept of HostBriefInfo here comes from previously
     * scraping from an HTML page, but to make changes incremental
     * it is adapted here to the new host/by_keyword service. Eventually
     * we should just use the info returned by that service and move on.
     *
     */
    public List<HostBriefInfo> doSearch() throws JSONException, HttpException, IOException {

        List<NameValuePair> args = new ArrayList<NameValuePair>();
        args.add(new BasicNameValuePair("keyword", this.keyword));

        JSONObject jsonObject = post(WARMSHOWERS_HOST_BY_KEYWORD_URL, args);

        List<HostBriefInfo> list = new ArrayList<HostBriefInfo>();
        JSONObject statusJson = jsonObject.getJSONObject("status");
        String numDelivered = statusJson.get("delivered").toString();
        if (Integer.parseInt(numDelivered) > 0) {
            JSONObject hostJson = jsonObject.getJSONObject("accounts");

            for (int i = 0; i < hostJson.names().length(); i++) {
                int uid = hostJson.names().getInt(i);
                JSONObject account = (JSONObject) (hostJson.get(Integer.toString(uid)));
                HostBriefInfo bi = new HostBriefInfo(
                        uid,
                        account.get("name").toString(),
                        account.get("fullname").toString(),
                        account.get("street").toString(),
                        account.get("city").toString(),
                        account.get("province").toString(),
                        account.get("country").toString(),
                        account.get("comments").toString(),
                        (account.get("notcurrentlyavailable").toString().equals("1")),
                        account.getString("access"),
                        account.getString("created")
                );
                list.add(bi);
            }
        }
        return list;
    }
}