/*
 * Copyright (c) 2015 DataTorrent, Inc. ALL Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.datatorrent.contrib.zmq;

import java.util.HashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zeromq.ZMQ;


final class ZeroMQMessageReceiver implements Runnable
{
  private static final Logger logger = LoggerFactory.getLogger(ZeroMQMessageReceiver.class);

  public HashMap<String, Integer> dataMap = new HashMap<String, Integer>();
  public int count = 0;
  protected ZMQ.Context context;
  protected ZMQ.Socket subscriber;
  protected ZMQ.Socket syncclient;
  volatile boolean shutDown = false;

  public void setup()
  {
    context = ZMQ.context(1);
    logger.debug("Subsribing on ZeroMQ");
    subscriber = context.socket(ZMQ.SUB);
    subscriber.connect("tcp://localhost:5556");
    subscriber.subscribe("".getBytes());
    syncclient = context.socket(ZMQ.REQ);
    syncclient.connect("tcp://localhost:5557");
    sendSync();
  }

  public void sendSync()
  {
    syncclient.send("".getBytes(), 0);
  }

  @Override
  public void run()
  {
    logger.debug("receiver running");      
    while (!Thread.currentThread().isInterrupted() && !shutDown) {
    	//logger.debug("receiver running in loop"); 
      byte[] msg = subscriber.recv(ZMQ.NOBLOCK);
      // convert to HashMap and save the values for each key
      // then expect c to be 1000, b=20, a=2
      // and do count++ (where count now would be 30)
      if(msg == null || msg.length ==0)
      {
    	  continue;
      }
      String str = new String(msg);
      
      if (str.indexOf("{") == -1) {
        continue;
      }
      int eq = str.indexOf('=');
      String key = str.substring(1, eq);
      int value = Integer.parseInt(str.substring(eq + 1, str.length() - 1));
      logger.debug("\nsubscriber recv: {}", str);
      dataMap.put(key, value);
      count++;
      logger.debug("out of loop.. ");
    }
  }

  public void teardown()
  {
	shutDown=true;
	
	syncclient.close();
    subscriber.close();
    context.term();
  }
}
