public class ServerClient {
	private AndroidHttpClient client;
	private CookieStore cookieStore;
	private HttpContext localContext;
	private Uri.Builder uriBuilder;

	public ServerClient(String rootPath) {
		this.uriBuilder = Uri.parse(rootPath).buildUpon();
		this.client = AndroidHttpClient.newInstance("httpclient");
		this.cookieStore = new BasicCookieStore();
		this.localContext = new BasicHttpContext();
		this.localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
	}

	public HttpResponse executeRequest(HttpUriRequest request) {
		HttpResponse response = null;
		try {
			response = client.execute(request, localContext);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return response;
	}

	public HttpResponse postRequest(String path, List<NameValuePair> params) {
		HttpPost request = new HttpPost();
		HttpResponse response = null;

		try {
			Uri.Builder builder = this.uriBuilder.encodedPath(path);
			URI uri = new URI(builder.build().toString());
			request.setURI(uri);
			if (params != null) {
				request.setEntity(new UrlEncodedFormEntity(params));
			}
			response = executeRequest(request);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return response;
	}

	public HttpResponse getRequest(String path, List<NameValuePair> params) {
		HttpGet request = new HttpGet();
		HttpResponse response = null;

		try {
			Uri.Builder builder = this.uriBuilder.encodedPath(path);
			if (params != null) {
				builder.query(URLEncodedUtils.format(params, "utf-8"));
			}
			URI uri = new URI(builder.build().toString());
			request.setURI(uri);
			response = executeRequest(request);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return response;
	}

	/*
	 * Successful sample:
   * POST http://192.168.1.128/users/sign_in.json 
   * FORM {"user[email]"=>"asdf@qwer.com", "user[password]"=>"123456"} 
   * STATUS 201 - Created [Net::HTTPCreated]
   * RETURN {"created_at":"2012-04-19T13:29:00Z","email":"joel@uchoa.com","id":2,"updated_at":"2012-04-19T16:25:13Z"}
	 */
	public JSONObject signIn(String email, String password) {
		JSONObject jsonResult = null;

		try {
			List<NameValuePair> params = new ArrayList<NameValuePair>(2);
			params.add(new BasicNameValuePair("user[email]", email));
			params.add(new BasicNameValuePair("user[password]", password));

			HttpResponse response = this.postRequest("users/sign_in.json",
					params);

			if (response == null) {
				return null;
			}

			jsonResult = new JSONObject(httpResponseContentAsString(response));
		} catch (Exception e) {
			e.printStackTrace();
		}

		return jsonResult;
	}

	public JSONObject createGroup(String name) {
		JSONObject jsonResult = null;

		try {
			List<NameValuePair> params = new ArrayList<NameValuePair>(1);
			params.add(new BasicNameValuePair("group[name]", name));

			HttpResponse response = this.postRequest("group.json", params);

			if (response == null) {
				return null;
			}

			jsonResult = new JSONObject(httpResponseContentAsString(response));
		} catch (Exception e) {
			e.printStackTrace();
		}

		return jsonResult;
	}

	private String httpResponseContentAsString(HttpResponse response) {
		String result = "";

		try {
			BufferedReader buffer = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
			for (String line = ""; (line = buffer.readLine()) != null;) {
				if (result != "") {
					result += "\n";
				}
				result += line;
			}
		} catch (Exception e) {
			result = null;
			e.printStackTrace();
		}

		return result;
	}
}
