// ***************************************************************************************************************************
// * 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.juneau.utils;

import java.lang.reflect.*;
import java.util.*;
import java.util.concurrent.atomic.*;

import org.apache.juneau.annotation.*;
import org.apache.juneau.marshall.*;

/**
 * Basic timing information.
 *
 * Keeps track of number of starts/finishes on tasks and keeps an average run time.
 */
@Bean(bpi="method,runs,running,errors,avgTime,totalTime,exceptions")
public class MethodExecStats implements Comparable<MethodExecStats> {
	private String method;
	private WeightedAverage avgTime = new WeightedAverage();

	private AtomicInteger
		starts = new AtomicInteger(),
		finishes = new AtomicInteger(),
		errors = new AtomicInteger();

	private AtomicLong
		totalTime = new AtomicLong();

	private StackTraceDatabase stackTraceDb;

	/**
	 * Constructor.
	 *
	 * @param method Arbitrary label.  Should be kept to less than 50 characters.
	 * @param stackTraceStopClass Don't calculate stack traces when this class is encountered.
	 */
	public MethodExecStats(Method method, Class<?> stackTraceStopClass) {
		this.method = method.getDeclaringClass().getSimpleName() + "." + method.getName();
		this.stackTraceDb = new StackTraceDatabase(-1, stackTraceStopClass);
	}

	/**
	 * Constructor.
	 *
	 * @param method Arbitrary label.  Should be kept to less than 50 characters.
	 */
	public MethodExecStats(Method method) {
		this(method, MethodInvoker.class);
	}

	/**
	 * Call when task is started.
	 */
	public void started() {
		starts.incrementAndGet();
	}

	/**
	 * Call when task is finished.
	 * @param time The execution time of the task.
	 */
	public void finished(long time) {
		finishes.incrementAndGet();
		totalTime.addAndGet(time);
		avgTime.add(1, time);
	}

	/**
	 * Call when an error occurs.
	 * @param e The exception thrown.  Can be <jk>null</jk>.
	 */
	public void error(Throwable e) {
		errors.incrementAndGet();
		stackTraceDb.add(e);
	}

	/**
	 * Returns the method name of these stats.
	 *
	 * @return The method name of these stats.
	 */
	public String getMethod() {
		return method;
	}

	/**
	 * Returns the number of times the {@link #started()} method was called.
	 *
	 * @return The number of times the {@link #started()} method was called.
	 */
	public int getRuns() {
		return starts.get();
	}

	/**
	 * Returns the number currently running method invocations.
	 *
	 * @return The number of currently running method invocations.
	 */
	public int getRunning() {
		return starts.get() - finishes.get();
	}

	/**
	 * Returns the number of times the {@link #error(Throwable)} method was called.
	 *
	 * @return The number of times the {@link #error(Throwable)} method was called.
	 */
	public int getErrors() {
		return errors.get();
	}

	/**
	 * Returns the average execution time.
	 *
	 * @return The average execution time in milliseconds.
	 */
	public int getAvgTime() {
		return (int)avgTime.getValue();
	}

	/**
	 * Returns the total execution time.
	 *
	 * @return The total execution time in milliseconds.
	 */
	public long getTotalTime() {
		return totalTime.get();
	}

	/**
	 * Returns information on all stack traces of all exceptions encountered.
	 *
	 * @return Information on all stack traces of all exceptions encountered.
	 */
	public List<StackTraceInfo> getExceptions() {
		return stackTraceDb.getClonedStackTraceInfos();
	}

	@Override /* Object */
	public String toString() {
		return SimpleJson.DEFAULT.toString(this);
	}

	@Override /* Comparable */
	public int compareTo(MethodExecStats o) {
		return Long.compare(o.getTotalTime(), getTotalTime());
	}
}