package base.connection;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.ProtocolVersion;

import base.interfaces.IItem;
import base.interfaces.IResponse;
import base.types.Item;

public class Response implements IResponse {
	
	protected int status;
	
	protected String phrase;
	
	protected IItem item;
	
	protected ProtocolVersion version;
	
	protected Map<String, String> headers;
	
	/**
	 * Constructs the Response from an HttpResponse, which is used by
	 * HttpClient.
	 * 
	 * @param response is the HttpResponse object returned from HttpClient.
	 */
	public Response(HttpResponse response) {
		
		// Retrieve HTTP version from response
		version = response.getStatusLine().getProtocolVersion();
		
		// Retrieve status code from response
		status = response.getStatusLine().getStatusCode();
		
		// Retrieve reason from response
		phrase = response.getStatusLine().getReasonPhrase();
		
		// Set the item using the responses's entity
		item = new Item(response.getEntity());
		
		// Retrieve headers from response
		headers = new HashMap<String, String>();
		for (Header header : response.getAllHeaders()) {
			this.headers.put(header.getName(), header.getValue());
		}
	}

	public String getBody() {
		return item.getContentString();
	}
	
	public InputStream getBodyStream() {
		return item.getContent();
	}
	
	public IItem getItem() {
		return item;
	}

	public ProtocolVersion getVersion() {
		return version;
	}
	
	public String getPhrase() {
		return phrase;
	}

	public Map<String, String> getHeaders() {
		return headers;
	}

	public int getStatus() {
		return status;
	}
	
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append(status + " " + phrase + '\n');
		sb.append("Headers:\n");
		for (String key : headers.keySet()) {
			sb.append('\t' + key + ": " + headers.get(key) + '\n');
		}
		sb.append("Body: ");
		sb.append("[disabled - see Item]");
		return sb.toString();
	}
}
