#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;
        }
      }
    }
  }
}
