package org.wikiwebserver.handler.http;

public class HTTPRequest {
    
    private static final String CRLF = "\r\n";
    
    private String sourceAddress;
    private String uri, method;  
    private int versionMajor = 1, versionMinor = 0;   

    private HTTPHeaders headers;

    private Object session;    
    private Object data;
    private FormData formData;

    private long startTime;  
    private String threadId;    
    private String requestID;
    
    private long numBytesRead;

    public HTTPRequest() {
        
    }
    
    public HTTPRequest(String method, String uri) {
        this.method = method;
        this.uri = uri;
        this.versionMajor = 1;
        this.versionMinor = 1;
        this.headers = new HTTPHeaders();
    }
    
    public String getThreadId() {
        return this.threadId;
    }

    void setThreadId(String threadId) {
        this.threadId = threadId;
    }

    public String getRequestID() {
        return requestID;
    }
    
    void setRequestID(String requestID) {
        this.requestID = requestID;
    }     
    
    public String getSourceAddress() {
        return this.sourceAddress;
    }
    
    void setSourceAddress(String sourceAddress) {
    	this.sourceAddress = sourceAddress;
    }    
    
    public Object getData() {
        return this.data;
    }
    
    void setData(Object data) {
        this.data = data;
    }
    
    public Object getSession() {
        return this.session;
    }
    
    void setSession(Object session) {
        this.session = session;
    }    
    
    public FormData getFormData() {
        return this.formData;
    }
    
    void setFormData(FormData formData) {
        this.formData = formData;
    }
    
    public HTTPHeaders getHeaders() {
        return this.headers;
    }
    
    void setHeaders(HTTPHeaders headers) {
        this.headers = headers;
    }
    
    public int getVersionMajor() {
        return this.versionMajor;
    }
    
    void setVersionMajor(int versionMajor) {
        this.versionMajor = versionMajor;
    }
    
    public int getVersionMinor() {
        return this.versionMinor;
    }
    
    void setVersionMinor(int versionMinor) {
        this.versionMinor = versionMinor;
    }    
    
    public String getMethod() {
        return this.method;
    }
    
    void setMethod(String method) {
        this.method = method;
    }     
    
    public String getUri() {
        return this.uri;
    }
    
    void setUri(String uri) {
        this.uri = uri;
    }
    
    public String getQuery() {
        if (getUri() == null) return null;
        int idx = getUri().indexOf('?');
        if (idx > -1) return getUri().substring(idx+1);
        return "";
    }
    
    public String getUrl() {
        if (getUri() == null) return null;
        int idx = getUri().indexOf('?');
        if (idx > -1) return getUri().substring(0, idx);
        return getUri();
    }  
    
    public long getStartTime() {
        return startTime;
    }
    
    void setStartTime(long startTime) {
        this.startTime = startTime;
    } 
    
    void incrementNumBytesRead(int amount) {
        this.numBytesRead += amount;
    }    
    
    public long getNumBytesRead() {
        return numBytesRead;
    }    
    
    public String toString() {
        StringBuilder buffer = new StringBuilder(1024);
        buffer.append(method);
        buffer.append(" ");
        buffer.append(uri);
        buffer.append(" ");
        buffer.append("HTTP/");
        buffer.append(String.valueOf(versionMajor));
        buffer.append(".");
        buffer.append(String.valueOf(versionMinor));
        buffer.append(CRLF);
        if (headers != null) {
            buffer.append(getHeaders().toString());
        }
        buffer.append(CRLF);
        return buffer.toString();
    }     
}

