package com.yahoo.labs.samoa.topology.impl;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2013 Yahoo! Inc.
 * %%
 * 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.
 * #L%
 */

import org.apache.s4.core.App;
import org.apache.s4.core.ProcessingElement;

import com.yahoo.labs.samoa.core.ContentEvent;
import com.yahoo.labs.samoa.core.EntranceProcessor;
import com.yahoo.labs.samoa.topology.EntranceProcessingItem;
import com.yahoo.labs.samoa.topology.Stream;

// TODO adapt this entrance processing item to connect to external streams so the application doesnt need to use an AdapterApp

public class S4EntranceProcessingItem extends ProcessingElement implements EntranceProcessingItem {

  private EntranceProcessor entranceProcessor;
  // private S4DoTask app;
  private int parallelism;
  protected Stream outputStream;

  /**
   * Constructor of an S4 entrance processing item.
   * 
   * @param app
   *          : S4 application
   */
  public S4EntranceProcessingItem(EntranceProcessor entranceProcessor, App app) {
    super(app);
    this.entranceProcessor = entranceProcessor;
    // this.app = (S4DoTask) app;
    // this.setSingleton(true);
  }

  public void setParallelism(int parallelism) {
    this.parallelism = parallelism;
  }

  public int getParallelism() {
    return this.parallelism;
  }

  @Override
  public EntranceProcessor getProcessor() {
    return this.entranceProcessor;
  }

  //
  // @Override
  // public void put(Instance inst) {
  // // do nothing
  // // may not needed
  // }

  @Override
  protected void onCreate() {
    // was commented
    if (this.entranceProcessor != null) {
      // TODO revisit if we need to change it to a clone() call
      this.entranceProcessor = (EntranceProcessor) this.entranceProcessor.newProcessor(this.entranceProcessor);
      this.entranceProcessor.onCreate(Integer.parseInt(getId()));
    }
  }

  @Override
  protected void onRemove() {
    // do nothing
  }

  //
  // /**
  // * Sets the entrance processing item processor.
  // *
  // * @param processor
  // */
  // public void setProcessor(Processor processor) {
  // this.entranceProcessor = processor;
  // }

  @Override
  public void setName(String name) {
    super.setName(name);
  }

  @Override
  public EntranceProcessingItem setOutputStream(Stream stream) {
    if (this.outputStream != null)
      throw new IllegalStateException("Output stream for an EntrancePI sohuld be initialized only once");
    this.outputStream = stream;
    return this;
  }

  public boolean injectNextEvent() {
    if (entranceProcessor.hasNext()) {
      ContentEvent nextEvent = this.entranceProcessor.nextEvent();
      outputStream.put(nextEvent);
      return entranceProcessor.hasNext();
    } else
      return false;
    // return !nextEvent.isLastEvent();
  }
}
