package cl.altiuz.reports.zmq;

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

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 final int id;
	private final Context context;

	private static final Logger LOG = Logger.getLogger(WorkerThread.class
			.getName());

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

	public void run() {
		LOG.info("Req rcvd");
		final Socket reply = context.socket(ZMQ.REP);
		reply.connect("inproc://workers");
		byte[] data;
		Map<String, String> params;
		while (true) {

			data = reply.recv();
			LOG.info("Thread: Req rcvd");
			String resp = "Data: " + data + ", received by worker ";
			// LOG.info(resp);
			// System.out.println(resp);
			try {
				final ByteArrayInputStream bais = new ByteArrayInputStream(data);
				final ObjectInputStream ois = new ObjectInputStream(bais);
				params = (Map<String, String>) ois.readObject();
				// System.out.println(params);
				// LOG.info("params: " + params);

				final 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);
				// LOG.info(resp);
				// 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();
			}
			LOG.info("Thread: Rsp sent");
		}

	}
}
