package cl.altiuz.reports.zmq;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Map;

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class WorkerThread extends Thread {

	private static final int NO_FLAGS = 0;
	private int id;
	private Context context;

	public WorkerThread(int i, Context context) {
		this.id = i;
		this.context = context;
		System.out.println("Preparing worker: " + id);
	}

	public void run() {

		Socket reply = context.socket(ZMQ.REP);
		reply.connect("inproc://workers");
		byte[] data;
		Map<String, String> params;
		while (true) {

			data = reply.recv();
			String resp = "Data: " + data + ", received by worker ";

			//System.out.println(resp);
			try {
				ByteArrayInputStream bais = new ByteArrayInputStream(data);
				ObjectInputStream ois = new ObjectInputStream(bais);
				params = (Map<String, String>) ois.readObject();
				//System.out.println(params);

				ObjetoRemoto oRemoto = new ObjetoRemoto();
				data = oRemoto.getDoc(params.get("path"),
						Integer.parseInt(params.get("dOff")),
						Integer.parseInt(params.get("dLen")),
						Integer.parseInt(params.get("cOff")),
						Integer.parseInt(params.get("clen")),
						params.get("cType").charAt(0));
				resp = "Data: " + data + ", retrieved by worker: "
						+ new String(data);

				//System.out.println(resp);
				reply.send(data, NO_FLAGS);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}
