package com.martinkl.samza.newsfeed;

import java.util.HashMap;

import org.apache.samza.system.IncomingMessageEnvelope;
import org.apache.samza.system.OutgoingMessageEnvelope;
import org.apache.samza.task.MessageCollector;
import org.apache.samza.task.StreamTask;
import org.apache.samza.task.TaskCoordinator;
import org.apache.samza.task.TaskCoordinator.RequestScope;
import org.apache.samza.task.WindowableTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Generates a fake social graph for a given number of users, by emitting
 * "follow" events between randomly selected pairs of users. The output
 * is partitioned by followee.
 */
public class GenerateFollowsTask implements StreamTask, WindowableTask {
  private static final Logger log = LoggerFactory.getLogger(GenerateFollowsTask.class);

  private long messagesSent = 0;

  @Override
  public void process(IncomingMessageEnvelope envelope, MessageCollector collector, TaskCoordinator coordinator) {
    // no input streams, nothing to process
  }

  @Override
  public void window(MessageCollector collector, TaskCoordinator coordinator) {
    for (int i = 0; i < 100 && messagesSent < NewsfeedConfig.NUM_FOLLOW_EVENTS; i++, messagesSent++) {
      String follower = NewsfeedConfig.randomUser();
      String followee = NewsfeedConfig.randomUser();

      HashMap<String, Object> message = new HashMap<String, Object>();
      message.put("event", "follow");
      message.put("follower", follower);
      message.put("followee", followee);
      message.put("time", NewsfeedConfig.currentDateTime());
      collector.send(new OutgoingMessageEnvelope(NewsfeedConfig.FOLLOWS_STREAM, followee, null, message));
    }

    if (messagesSent % 100000 == 0) {
      log.info("Generated " + messagesSent + " follow events");
    }

    if (messagesSent == NewsfeedConfig.NUM_FOLLOW_EVENTS) {
      log.info("Finished generating random follower graph");
      coordinator.shutdown(RequestScope.CURRENT_TASK);
    }
  }
}