/*
 to test, compile with:
     g++ -std=c++11 Client.cpp HttpClient.cpp -o test
*/

#include "HttpClient.h"
#include <stdio.h>
#include <sstream>
#include "rapidjson/document.h"
using namespace rapidjson;


void ClientTest()
{
  HttpRequest  request = { "GET", "http://192.168.0.15:8000/servers" };
  HttpResponse result  = MakeHttpRequestWrapper(request);
  std::map<std::string,std::string>& h = result.headers;
  printf("status: %s\n", result.status.c_str());
  for (std::map<std::string, std::string>::const_iterator i = h.begin(); i != h.end(); ++i)
    printf("header[\"%s\"] = \"%s\"\n", i->first.c_str(), i->second.c_str());
  printf("body: %s\n", result.body.data());

  Document d;
  std::string services_url;
  if ((ParseResult)d.Parse((const char*)result.body.data())) {
    services_url = d["services"].GetString();
    printf("services_url = %s\n", services_url.c_str());
  }

  { 
  HttpRequest  request = { "GET", "http://" + services_url + "/services" };
  HttpResponse result  = MakeHttpRequestWrapper(request);
  std::map<std::string,std::string>& h = result.headers;
  printf("status: %s\n", result.status.c_str());
  for (std::map<std::string, std::string>::const_iterator i = h.begin(); i != h.end(); ++i)
    printf("header[\"%s\"] = \"%s\"\n", i->first.c_str(), i->second.c_str());
  printf("body: %s\n", result.body.data());

  Document d;
  std::string auth_url;
  std::string asset_url;
  if ((ParseResult)d.Parse((const char*)result.body.data())) {
    auth_url  = d["authentication"].GetString();
    asset_url = d["assets"].GetString();
    printf("auth_url = %s\n", auth_url.c_str());
  }

  {
    HttpRequest  request = { "GET", "http://" + asset_url + "/asset/blah.txt" };
    HttpResponse result  = MakeHttpRequestWrapper(request);
    std::map<std::string,std::string>& h = result.headers;
    printf("status: %s\n", result.status.c_str());
    for (std::map<std::string, std::string>::const_iterator i = h.begin(); i != h.end(); ++i)
      printf("header[\"%s\"] = \"%s\"\n", i->first.c_str(), i->second.c_str());
    printf("body: %s\n", result.body.data());
  }

  {
  HttpRequest  request = { "GET", "http://" + auth_url + "/authenticate" };
  HttpResponse result  = MakeHttpRequestWrapper(request);
  std::map<std::string,std::string>& h = result.headers;
  printf("status: %s\n", result.status.c_str());
  for (std::map<std::string, std::string>::const_iterator i = h.begin(); i != h.end(); ++i)
    printf("header[\"%s\"] = \"%s\"\n", i->first.c_str(), i->second.c_str());
  printf("body: %s\n", result.body.data());

  Document d;
  if ((ParseResult)d.Parse((const char*)result.body.data())) {
    std::string access_token = d["token"].GetString();
    printf("token = %s\n", access_token.c_str());
  }

  MakeAsyncHttpRequestWrapper(request);

  }
  }
}


// Test case
int main(int argc, char *argv[])
{
  if (argc >= 2)
  {
    std::vector<uint8_t> response;
    std::map<std::string,std::string> args;
    int res = MakeSyncHttpRequest(response, "GET", argv[1], args);
    if (response.data())
      printf("%s\n", response.data());
    return res;
  }
  else
  {
    ClientTest();
  }
  return 0;
}


