package com.neverwinterdp.sparkngin;

import java.util.Map;

import org.slf4j.Logger;

import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.neverwinterdp.message.Message;
import com.neverwinterdp.queuengin.kafka.KafkaMessageProducer;
import com.neverwinterdp.util.JSONSerializer;
import com.neverwinterdp.util.LoggerFactory;
import com.neverwinterdp.yara.MetricRegistry;

public class KafkaMessageForwarder implements MessageForwarder {
  private Logger logger ;
  private KafkaMessageProducer producer ;
  private Throwable error ;
  
  public KafkaMessageForwarder() {}
  
  public KafkaMessageForwarder(LoggerFactory lfactory,
                               MetricRegistry mRegistry,Map<String, String> props) {
    init(lfactory, mRegistry, props) ;
  }
  
  @Inject
  public void init(LoggerFactory lfactory,
                   MetricRegistry mRegistry, 
                   @Named("kafka-producerProperties") Map<String, String> producerProps) {
    logger = lfactory.getLogger(KafkaMessageForwarder.class) ;
    logger.info("Start init()");
    logger.info("Kafka Producer Properties: \n" + JSONSerializer.INSTANCE.toString(producerProps));
    producer = new KafkaMessageProducer(producerProps, mRegistry, "127.0.0.1:9092") ;
    logger.info("Finish init()");
  }
  
  public boolean hasError() { return error != null ; }
  
  public void setError(Throwable error) { this.error = error ; }
  
  public boolean reconnect() { 
    error = null ;
    producer.reconnect();
    return true ; 
  }
  
  public void forward(Message message) throws Exception {
    String topic = message.getHeader().getTopic() ;
    producer.send(topic, message);
  }
  
  public void close() {
    logger.info("Start close()");
    producer.close() ;
    logger.info("Finish close()");
  }
}