#region Apache 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;
using System.Collections;

namespace log4net.Core
{
	/// <summary>
	/// Defines the default set of levels recognized by the system.
	/// </summary>
	/// <remarks>
	/// <para>
	/// Each <see cref="LoggingEvent"/> has an associated <see cref="Level"/>.
	/// </para>
	/// <para>
	/// Levels have a numeric <see cref="Level.Value"/> that defines the relative
	/// ordering between levels. Two Levels with the same <see cref="Level.Value"/>
	/// are deemed to be equivalent.
	/// </para>
	/// <para>
	/// The levels that are recognized by log4net are set for each <see cref="log4net.Repository.ILoggerRepository"/>
	/// and each repository can have different levels defined. The levels are stored
	/// in the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/> on the repository. Levels are
	/// looked up by name from the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/>.
	/// </para>
	/// <para>
	/// When logging at level INFO the actual level used is not <see cref="Level.Info"/> but
	/// the value of <c>LoggerRepository.LevelMap["INFO"]</c>. The default value for this is
	/// <see cref="Level.Info"/>, but this can be changed by reconfiguring the level map.
	/// </para>
	/// <para>
	/// Each level has a <see cref="DisplayName"/> in addition to its <see cref="Name"/>. The
	/// <see cref="DisplayName"/> is the string that is written into the output log. By default
	/// the display name is the same as the level name, but this can be used to alias levels
	/// or to localize the log output.
	/// </para>
	/// <para>
	/// Some of the predefined levels recognized by the system are:
	/// </para>
	/// <list type="bullet">
	///		<item>
	///			<description><see cref="Off"/>.</description>
	///		</item>
	///		<item>
	///			<description><see cref="Fatal"/>.</description>
	///		</item>
	///		<item>
	///			<description><see cref="Error"/>.</description>
	///		</item>
	///		<item>
	///			<description><see cref="Warn"/>.</description>
	///		</item>
	///		<item>
	///			<description><see cref="Info"/>.</description>
	///		</item>
	///		<item>
	///			<description><see cref="Debug"/>.</description>
	///		</item>
	///		<item>
	///			<description><see cref="All"/>.</description>
	///		</item>
	/// </list>
	/// </remarks>
	/// <author>Nicko Cadell</author>
	/// <author>Gert Driesen</author>
#if !NETCF
	[Serializable]
#endif
	sealed public class Level : IComparable
	{
		#region Public Instance Constructors

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="level">Integer value for this level, higher values represent more severe levels.</param>
		/// <param name="levelName">The string name of this level.</param>
		/// <param name="displayName">The display name for this level. This may be localized or otherwise different from the name</param>
		/// <remarks>
		/// <para>
		/// Initializes a new instance of the <see cref="Level" /> class with
		/// the specified level name and value.
		/// </para>
		/// </remarks>
		public Level(int level, string levelName, string displayName)
		{
			if (levelName == null)
			{
				throw new ArgumentNullException("levelName");
			}
			if (displayName == null)
			{
				throw new ArgumentNullException("displayName");
			}

			m_levelValue = level;
#if NETSTANDARD1_3
			m_levelName = levelName;
#else
			m_levelName = string.Intern(levelName);
#endif
			m_levelDisplayName = displayName;
		}

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="level">Integer value for this level, higher values represent more severe levels.</param>
		/// <param name="levelName">The string name of this level.</param>
		/// <remarks>
		/// <para>
		/// Initializes a new instance of the <see cref="Level" /> class with
		/// the specified level name and value.
		/// </para>
		/// </remarks>
		public Level(int level, string levelName) : this(level, levelName, levelName)
		{
		}

		#endregion Public Instance Constructors

		#region Public Instance Properties

		/// <summary>
		/// Gets the name of this level.
		/// </summary>
		/// <value>
		/// The name of this level.
		/// </value>
		/// <remarks>
		/// <para>
		/// Gets the name of this level.
		/// </para>
		/// </remarks>
		public string Name
		{
			get { return m_levelName; }
		}

		/// <summary>
		/// Gets the value of this level.
		/// </summary>
		/// <value>
		/// The value of this level.
		/// </value>
		/// <remarks>
		/// <para>
		/// Gets the value of this level.
		/// </para>
		/// </remarks>
		public int Value
		{
			get { return m_levelValue; }
		}

		/// <summary>
		/// Gets the display name of this level.
		/// </summary>
		/// <value>
		/// The display name of this level.
		/// </value>
		/// <remarks>
		/// <para>
		/// Gets the display name of this level.
		/// </para>
		/// </remarks>
		public string DisplayName
		{
			get { return m_levelDisplayName; }
		}

		#endregion Public Instance Properties

		#region Override implementation of Object

		/// <summary>
		/// Returns the <see cref="string" /> representation of the current
		/// <see cref="Level" />.
		/// </summary>
		/// <returns>
		/// A <see cref="string" /> representation of the current <see cref="Level" />.
		/// </returns>
		/// <remarks>
		/// <para>
		/// Returns the level <see cref="Name"/>.
		/// </para>
		/// </remarks>
		override public string ToString()
		{
			return m_levelName;
		}

		/// <summary>
		/// Compares levels.
		/// </summary>
		/// <param name="o">The object to compare against.</param>
		/// <returns><c>true</c> if the objects are equal.</returns>
		/// <remarks>
		/// <para>
		/// Compares the levels of <see cref="Level" /> instances, and
		/// defers to base class if the target object is not a <see cref="Level" />
		/// instance.
		/// </para>
		/// </remarks>
		override public bool Equals(object o)
		{
			Level otherLevel = o as Level;
			if (otherLevel != null)
			{
				return m_levelValue == otherLevel.m_levelValue;
			}
			else
			{
				return base.Equals(o);
			}
		}

		/// <summary>
		/// Returns a hash code
		/// </summary>
		/// <returns>A hash code for the current <see cref="Level" />.</returns>
		/// <remarks>
		/// <para>
		/// Returns a hash code suitable for use in hashing algorithms and data
		/// structures like a hash table.
		/// </para>
		/// <para>
		/// Returns the hash code of the level <see cref="Value"/>.
		/// </para>
		/// </remarks>
		override public int GetHashCode()
		{
			return m_levelValue;
		}

		#endregion Override implementation of Object

		#region Implementation of IComparable

		/// <summary>
		/// Compares this instance to a specified object and returns an
		/// indication of their relative values.
		/// </summary>
		/// <param name="r">A <see cref="Level"/> instance or <see langword="null" /> to compare with this instance.</param>
		/// <returns>
		/// A 32-bit signed integer that indicates the relative order of the
		/// values compared. The return value has these meanings:
		/// <list type="table">
		///		<listheader>
		///			<term>Value</term>
		///			<description>Meaning</description>
		///		</listheader>
		///		<item>
		///			<term>Less than zero</term>
		///			<description>This instance is less than <paramref name="r" />.</description>
		///		</item>
		///		<item>
		///			<term>Zero</term>
		///			<description>This instance is equal to <paramref name="r" />.</description>
		///		</item>
		///		<item>
		///			<term>Greater than zero</term>
		///			<description>
		///				<para>This instance is greater than <paramref name="r" />.</para>
		///				<para>-or-</para>
		///				<para><paramref name="r" /> is <see langword="null" />.</para>
		///				</description>
		///		</item>
		/// </list>
		/// </returns>
		/// <remarks>
		/// <para>
		/// <paramref name="r" /> must be an instance of <see cref="Level" />
		/// or <see langword="null" />; otherwise, an exception is thrown.
		/// </para>
		/// </remarks>
		/// <exception cref="ArgumentException"><paramref name="r" /> is not a <see cref="Level" />.</exception>
		public int CompareTo(object r)
		{
			Level target = r as Level;
			if (target != null)
			{
				return Compare(this, target);
			}
			throw new ArgumentException("Parameter: r, Value: [" + r + "] is not an instance of Level");
		}

		#endregion Implementation of IComparable

		#region Operators

		/// <summary>
		/// Returns a value indicating whether a specified <see cref="Level" />
		/// is greater than another specified <see cref="Level" />.
		/// </summary>
		/// <param name="l">A <see cref="Level" /></param>
		/// <param name="r">A <see cref="Level" /></param>
		/// <returns>
		/// <c>true</c> if <paramref name="l" /> is greater than
		/// <paramref name="r" />; otherwise, <c>false</c>.
		/// </returns>
		/// <remarks>
		/// <para>
		/// Compares two levels.
		/// </para>
		/// </remarks>
		public static bool operator > (Level l, Level r)
		{
			return l.m_levelValue > r.m_levelValue;
		}

		/// <summary>
		/// Returns a value indicating whether a specified <see cref="Level" />
		/// is less than another specified <see cref="Level" />.
		/// </summary>
		/// <param name="l">A <see cref="Level" /></param>
		/// <param name="r">A <see cref="Level" /></param>
		/// <returns>
		/// <c>true</c> if <paramref name="l" /> is less than
		/// <paramref name="r" />; otherwise, <c>false</c>.
		/// </returns>
		/// <remarks>
		/// <para>
		/// Compares two levels.
		/// </para>
		/// </remarks>
		public static bool operator < (Level l, Level r)
		{
			return l.m_levelValue < r.m_levelValue;
		}

		/// <summary>
		/// Returns a value indicating whether a specified <see cref="Level" />
		/// is greater than or equal to another specified <see cref="Level" />.
		/// </summary>
		/// <param name="l">A <see cref="Level" /></param>
		/// <param name="r">A <see cref="Level" /></param>
		/// <returns>
		/// <c>true</c> if <paramref name="l" /> is greater than or equal to
		/// <paramref name="r" />; otherwise, <c>false</c>.
		/// </returns>
		/// <remarks>
		/// <para>
		/// Compares two levels.
		/// </para>
		/// </remarks>
		public static bool operator >= (Level l, Level r)
		{
			return l.m_levelValue >= r.m_levelValue;
		}

		/// <summary>
		/// Returns a value indicating whether a specified <see cref="Level" />
		/// is less than or equal to another specified <see cref="Level" />.
		/// </summary>
		/// <param name="l">A <see cref="Level" /></param>
		/// <param name="r">A <see cref="Level" /></param>
		/// <returns>
		/// <c>true</c> if <paramref name="l" /> is less than or equal to
		/// <paramref name="r" />; otherwise, <c>false</c>.
		/// </returns>
		/// <remarks>
		/// <para>
		/// Compares two levels.
		/// </para>
		/// </remarks>
		public static bool operator <= (Level l, Level r)
		{
			return l.m_levelValue <= r.m_levelValue;
		}

		/// <summary>
		/// Returns a value indicating whether two specified <see cref="Level" />
		/// objects have the same value.
		/// </summary>
		/// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param>
		/// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param>
		/// <returns>
		/// <c>true</c> if the value of <paramref name="l" /> is the same as the
		/// value of <paramref name="r" />; otherwise, <c>false</c>.
		/// </returns>
		/// <remarks>
		/// <para>
		/// Compares two levels.
		/// </para>
		/// </remarks>
		public static bool operator == (Level l, Level r)
		{
			if (((object)l) != null && ((object)r) != null)
			{
				return l.m_levelValue == r.m_levelValue;
			}
			else
			{
				return ((object) l) == ((object) r);
			}
		}

		/// <summary>
		/// Returns a value indicating whether two specified <see cref="Level" />
		/// objects have different values.
		/// </summary>
		/// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param>
		/// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param>
		/// <returns>
		/// <c>true</c> if the value of <paramref name="l" /> is different from
		/// the value of <paramref name="r" />; otherwise, <c>false</c>.
		/// </returns>
		/// <remarks>
		/// <para>
		/// Compares two levels.
		/// </para>
		/// </remarks>
		public static bool operator != (Level l, Level r)
		{
			return !(l==r);
		}

		#endregion Operators

		#region Public Static Methods

		/// <summary>
		/// Compares two specified <see cref="Level"/> instances.
		/// </summary>
		/// <param name="l">The first <see cref="Level"/> to compare.</param>
		/// <param name="r">The second <see cref="Level"/> to compare.</param>
		/// <returns>
		/// A 32-bit signed integer that indicates the relative order of the
		/// two values compared. The return value has these meanings:
		/// <list type="table">
		///		<listheader>
		///			<term>Value</term>
		///			<description>Meaning</description>
		///		</listheader>
		///		<item>
		///			<term>Less than zero</term>
		///			<description><paramref name="l" /> is less than <paramref name="r" />.</description>
		///		</item>
		///		<item>
		///			<term>Zero</term>
		///			<description><paramref name="l" /> is equal to <paramref name="r" />.</description>
		///		</item>
		///		<item>
		///			<term>Greater than zero</term>
		///			<description><paramref name="l" /> is greater than <paramref name="r" />.</description>
		///		</item>
		/// </list>
		/// </returns>
		/// <remarks>
		/// <para>
		/// Compares two levels.
		/// </para>
		/// </remarks>
		public static int Compare(Level l, Level r)
		{
			// Reference equals
			if ((object)l == (object)r)
			{
				return 0;
			}

			if (l == null && r == null)
			{
				return 0;
			}
			if (l == null)
			{
				return -1;
			}
			if (r == null)
			{
				return 1;
			}

			return l.m_levelValue.CompareTo(r.m_levelValue);
		}

		#endregion Public Static Methods

		#region Public Static Fields

		/// <summary>
		/// The <see cref="Off" /> level designates a higher level than all the rest.
		/// </summary>
		public readonly static Level Off = new Level(int.MaxValue, "OFF");

		/// <summary>
		/// The <see cref="Log4Net_Debug" /> is only used to debug internals of log4net.
		/// </summary>
		public readonly static Level Log4Net_Debug = new Level(120000, "log4net:DEBUG");

		/// <summary>
		/// The <see cref="Emergency" /> level designates very severe error events.
		/// System unusable, emergencies.
		/// </summary>
		public readonly static Level Emergency = new Level(120000, "EMERGENCY");

		/// <summary>
		/// The <see cref="Fatal" /> level designates very severe error events
		/// that will presumably lead the application to abort.
		/// </summary>
		public readonly static Level Fatal = new Level(110000, "FATAL");

		/// <summary>
		/// The <see cref="Alert" /> level designates very severe error events.
		/// Take immediate action, alerts.
		/// </summary>
		public readonly static Level Alert = new Level(100000, "ALERT");

		/// <summary>
		/// The <see cref="Critical" /> level designates very severe error events.
		/// Critical condition, critical.
		/// </summary>
		public readonly static Level Critical = new Level(90000, "CRITICAL");

		/// <summary>
		/// The <see cref="Severe" /> level designates very severe error events.
		/// </summary>
		public readonly static Level Severe = new Level(80000, "SEVERE");

		/// <summary>
		/// The <see cref="Error" /> level designates error events that might
		/// still allow the application to continue running.
		/// </summary>
		public readonly static Level Error = new Level(70000, "ERROR");

		/// <summary>
		/// The <see cref="Warn" /> level designates potentially harmful
		/// situations.
		/// </summary>
		public readonly static Level Warn  = new Level(60000, "WARN");

		/// <summary>
		/// The <see cref="Notice" /> level designates informational messages
		/// that highlight the progress of the application at the highest level.
		/// </summary>
		public readonly static Level Notice  = new Level(50000, "NOTICE");

		/// <summary>
		/// The <see cref="Info" /> level designates informational messages that
		/// highlight the progress of the application at coarse-grained level.
		/// </summary>
		public readonly static Level Info  = new Level(40000, "INFO");

		/// <summary>
		/// The <see cref="Debug" /> level designates fine-grained informational
		/// events that are most useful to debug an application.
		/// </summary>
		public readonly static Level Debug = new Level(30000, "DEBUG");

		/// <summary>
		/// The <see cref="Fine" /> level designates fine-grained informational
		/// events that are most useful to debug an application.
		/// </summary>
		public readonly static Level Fine = new Level(30000, "FINE");

		/// <summary>
		/// The <see cref="Trace" /> level designates fine-grained informational
		/// events that are most useful to debug an application.
		/// </summary>
		public readonly static Level Trace = new Level(20000, "TRACE");

		/// <summary>
		/// The <see cref="Finer" /> level designates fine-grained informational
		/// events that are most useful to debug an application.
		/// </summary>
		public readonly static Level Finer = new Level(20000, "FINER");

		/// <summary>
		/// The <see cref="Verbose" /> level designates fine-grained informational
		/// events that are most useful to debug an application.
		/// </summary>
		public readonly static Level Verbose = new Level(10000, "VERBOSE");

		/// <summary>
		/// The <see cref="Finest" /> level designates fine-grained informational
		/// events that are most useful to debug an application.
		/// </summary>
		public readonly static Level Finest = new Level(10000, "FINEST");

		/// <summary>
		/// The <see cref="All" /> level designates the lowest level possible.
		/// </summary>
		public readonly static Level All = new Level(int.MinValue, "ALL");

		#endregion Public Static Fields

		#region Private Instance Fields

		private readonly int m_levelValue;
		private readonly string m_levelName;
		private readonly string m_levelDisplayName;

		#endregion Private Instance Fields
	}
}
