/**
 * Copyright (C) 2015 DataTorrent, 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.
 */
package com.datatorrent.api;

import java.io.IOException;
import java.io.Serializable;
import java.lang.annotation.*;
import java.util.List;

import com.datatorrent.api.Stats.OperatorStats;


/**
 * Listener for operator status updates.
 * <p>
 * Can be directly implemented by operator class or defined via operator context attribute. Implementation in the
 * operator allows the operator developer to define a handler that along with the stats can access the operator
 * properties and control partitioning.
 *
 * @since 0.9.1
 */
public interface StatsListener
{
  /**
   * Command to be executed at subsequent end of window on the operator instance that is deployed in the container.
   * Provides the opportunity to define operator specific actions such as method invocation or property set.
   */
  public interface OperatorRequest
  {
    /**
     * Execute the command.
     *
     * @param operator
     * @param operatorId
     * @param windowId
     * @throws IOException
     */
    public OperatorResponse execute(Operator operator, int operatorId, long windowId) throws IOException;
  }

  /**
   * Use {@link OperatorRequest}
   */
  @Deprecated
  public interface OperatorCommand
  {
    /**
     * Execute the command.
     *
     * @param operator
     * @param operatorId
     * @param windowId
     * @throws IOException
     */
    public void execute(Operator operator, int operatorId, long windowId) throws IOException;
  }

  public interface OperatorResponse
  {

    /*
     * The Object to identify the response
     */
    public Object getResponseId();
    /*
     * The data payload that needs to be sent back
     */
    public Object getResponse();

  }

  /**
   * List of recent, per window operator stats and moving averages.
   */
  public interface BatchedOperatorStats
  {
    /**
      Stats list will typically contain multiple entries, depending on streaming window size and heartbeat interval.
      * @return
      */
    List<OperatorStats> getLastWindowedStats();
    int getOperatorId();
    long getCurrentWindowId();
    long getTuplesProcessedPSMA();
    long getTuplesEmittedPSMA();
    double getCpuPercentageMA();
    long getLatencyMA();
    List<OperatorResponse> getOperatorResponse();
  }

  public class Response implements Serializable
  {
    /**
     * Set true to request repartition of the logical operator.
     * The controller will call {@link PartitionableOperator#definePartitions(java.util.Collection, int)} if applicable.
     */
    public boolean repartitionRequired;

    /**
     * Load indicator for the partition. See {@link PartitionableOperator.Partition#getLoad()}.
     * Taken into consideration on repartition.
     */
    public int loadIndicator;

    /**
     * Note for repartition.  Should indicate the reason if there is a partition of the operator
     *
     */
    public String repartitionNote;

    /**
     * List of commands to be executed on all deployed operator instances.
     */
    public List<? extends OperatorRequest> operatorRequests;

    /**
     * for backward compatibility
     */
    public List<? extends OperatorCommand> operatorCommands;

    private static final long serialVersionUID = 201401201506L;
  }

  /**
   * Called when new stats become available and status for operator is updated.
   * @param stats
   * @return
   */
  Response processStats(BatchedOperatorStats stats);

  /**
   *  This is used to tell the operator stats listener is interested in knowing the queue_size
   */
  @Target(ElementType.TYPE)
  @Retention(RetentionPolicy.RUNTIME)
  public @interface DataQueueSize
  {
  }
}
