/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.sling.event.jobs;

import org.osgi.annotation.versioning.ProviderType;

/**
 * Statistic information about a topic.
 * This information is not preserved between restarts of the service.
 * Once a service is restarted, the counters start at zero!
 * @since 3.0
 */
@ProviderType
public interface TopicStatistics {

    /**
     * The topic this statistics is about.
     * @return The topic name
     */
    String getTopic();

    /**
     * Number of successfully finished jobs.
     * @return Number of successfully finished jobs.
     */
    long getNumberOfFinishedJobs();

    /**
     * Number of permanently failing or cancelled jobs.
     * @return Number of permanently failing or cancelled jobs.
     */
    long getNumberOfCancelledJobs();

    /**
     * Number of failing jobs.
     * @return Number of failing jobs.
     */
    long getNumberOfFailedJobs();

    /**
     * Number of already processed jobs. This adds
     * {@link #getNumberOfFinishedJobs()}, {@link #getNumberOfCancelledJobs()}
     * and {@link #getNumberOfFailedJobs()}
     * @return Number of already processed jobs.
     */
    long getNumberOfProcessedJobs();

    /**
     * The time a job has been started last.
     * @return The time a job has been started last.
     */
    long getLastActivatedJobTime();

    /**
     * The time a job has been finished/failed/cancelled last.
     * @return The time a job has been finished/failed/cancelled last.
     */
    long getLastFinishedJobTime();

    /**
     * The average waiting time of a job in the queue.
     * @return The average waiting time of a job in the queue.
     */
    long getAverageWaitingTime();

    /**
     * The average processing time of a job - this only counts finished jobs.
     * @return The average processing time of a job
     */
    long getAverageProcessingTime();
}
