package page.distribute;

import java.io.InputStream;
import java.io.OutputStream;

import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.distribute.interfaces.Task;
import org.wikiwebserver.distribute.interfaces.WorkerNode;
import org.wikiwebserver.distribute.se.worker.task.DisplayTask;
import org.wikiwebserver.distribute.server.TaskStub;
import org.wikiwebserver.handler.http.HTTPException;
import org.wikiwebserver.handler.http.HTTPHandler;
import org.wikiwebserver.handler.http.HTTPHeaders;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;

public class Display implements HTTPResponder {

	private WorkerNode node;
	
	public Display(WorkerNode node) {
		this.node = node;
	}
	
	
    public Object respond(HTTPHandler conn) throws HTTPException {
        
    	Task task = new DisplayTask();
    	//task.setTaskMeta(decodedPath); 	
		
		InputStream in = null;
    	try {
    		TaskStub stub = node.addNewTaskAndWait(task);
			
    		HTTPHeaders responseHeaders = conn.getResponse().getHeaders();
			
    		Object output = stub.getOutput();
    		
    		if (output instanceof Exception) {
    			throw (Exception) output;
    		}

    		responseHeaders.set("Content-Type", "image/png");
    		
            if (output instanceof byte[]) {
                return output;
            }    		
    		
    		if (output instanceof InputStream) {
				in = (InputStream) output;
				OutputStream out = conn.getOutputStream();
				WareHouse.proxyStream(in, out);
    		}
			
			return null;
			
		} 
    	catch (Exception ex) {
			String msg = "Failed to complete transfer";
			throw new HTTPException(500, msg, ex);
		}
		finally {
			try { in.close(); } catch (Exception ex2) {}			
		}
    }
}
