EegeoSearchQuery::EegeoSearchQuery(Eegeo::Web::IWebLoadRequestFactory& webRequestFactory,
                                   Eegeo::Helpers::UrlHelpers::IUrlEncoder& urlEncoder,
                                   const Search::SdkModel::SearchQuery& query,
                                   const std::string& apiKey,
                                   Eegeo::Helpers::ICallback0& completionCallback)
    : m_apiKey(apiKey)
    , m_completionCallback(completionCallback)
    , m_responseString("")
    , m_isSuccess(false)
    , m_webRequestCompleteCallback(this, &EegeoSearchQuery::OnWebResponseReceived)
{
    std::string encodedQuery;
    urlEncoder.UrlEncode(query.Query(), encodedQuery);

    std::stringstream urlstream;
    urlstream << "https://poi.eegeo.com/v1";
    if (query.IsCategory())
    {
        urlstream << "/category?c=";
    }
    else
    {
        urlstream << "/search?s=";
    }
    urlstream << encodedQuery;
    urlstream << "&r=" << std::setprecision(4) << query.Radius();
    urlstream << "&lat=" << std::setprecision(8) << query.Location().GetLatitudeInDegrees();
    urlstream << "&lon=" << std::setprecision(8) << query.Location().GetLongitudeInDegrees();
    urlstream << "&apikey=" << m_apiKey;

    std::string url = urlstream.str();
    m_pWebLoadRequest = webRequestFactory.Begin(Eegeo::Web::HttpVerbs::GET, url, m_webRequestCompleteCallback).Build();
    m_pWebLoadRequest->Load();
}