#region Copyright & License
//
// 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.
//
#endregion

using System;

namespace log4net.Core
{
	/// <summary>
	/// An evaluator that triggers after specified number of seconds.
	/// </summary>
	/// <remarks>
	/// <para>
	/// This evaluator will trigger if the specified time period
	/// <see cref="Interval"/> has passed since last check.
	/// </para>
	/// </remarks>
	/// <author>Robert Sevcik</author>
	public class TimeEvaluator : ITriggeringEventEvaluator
	{
		/// <summary>
		/// The time threshold for triggering in seconds. Zero means it won't trigger at all.
		/// </summary>
		private int m_interval;

		/// <summary>
		/// The UTC time of last check. This gets updated when the object is created and when the evaluator triggers.
		/// </summary>
		private DateTime m_lastTimeUtc;

		/// <summary>
		/// The default time threshold for triggering in seconds. Zero means it won't trigger at all.
		/// </summary>
		const int DEFAULT_INTERVAL = 0;

		/// <summary>
		/// Create a new evaluator using the <see cref="DEFAULT_INTERVAL"/> time threshold in seconds.
		/// </summary>
		/// <remarks>
		/// <para>
		/// Create a new evaluator using the <see cref="DEFAULT_INTERVAL"/> time threshold in seconds.
		/// </para>
		/// <para>
		/// This evaluator will trigger if the specified time period
		/// <see cref="Interval"/> has passed since last check.
		/// </para>
		/// </remarks>
		public TimeEvaluator()
			: this(DEFAULT_INTERVAL)
		{
		}

		/// <summary>
		/// Create a new evaluator using the specified time threshold in seconds.
		/// </summary>
		/// <param name="interval">
		/// The time threshold in seconds to trigger after.
		/// Zero means it won't trigger at all.
		/// </param>
		/// <remarks>
		/// <para>
		/// Create a new evaluator using the specified time threshold in seconds.
		/// </para>
		/// <para>
		/// This evaluator will trigger if the specified time period
		/// <see cref="Interval"/> has passed since last check.
		/// </para>
		/// </remarks>
		public TimeEvaluator(int interval)
		{
			m_interval = interval;
			m_lastTimeUtc = DateTime.UtcNow;
		}

		/// <summary>
		/// The time threshold in seconds to trigger after
		/// </summary>
		/// <value>
		/// The time threshold in seconds to trigger after.
		/// Zero means it won't trigger at all.
		/// </value>
		/// <remarks>
		/// <para>
		/// This evaluator will trigger if the specified time period
		/// <see cref="Interval"/> has passed since last check.
		/// </para>
		/// </remarks>
		public int Interval
		{
			get { return m_interval; }
			set { m_interval = value; }
		}

		/// <summary>
		/// Is this <paramref name="loggingEvent"/> the triggering event?
		/// </summary>
		/// <param name="loggingEvent">The event to check</param>
		/// <returns>This method returns <c>true</c>, if the specified time period
		/// <see cref="Interval"/> has passed since last check..
		/// Otherwise it returns <c>false</c></returns>
		/// <remarks>
		/// <para>
		/// This evaluator will trigger if the specified time period
		/// <see cref="Interval"/> has passed since last check.
		/// </para>
		/// </remarks>
		public bool IsTriggeringEvent(LoggingEvent loggingEvent)
		{
			if (loggingEvent == null)
			{
				throw new ArgumentNullException("loggingEvent");
			}

			// disable the evaluator if threshold is zero
			if (m_interval == 0) return false;

			lock (this) // avoid triggering multiple times
			{
				TimeSpan passed = DateTime.UtcNow.Subtract(m_lastTimeUtc);

				if (passed.TotalSeconds > m_interval)
				{
					m_lastTimeUtc = DateTime.UtcNow;
					return true;
				}
				else
				{
					return false;
				}
			}
		}
	}
}
