using System;

namespace BepInEx.Logging
{
	/// <summary>
	/// Log event arguments. Contains info about the log message.
	/// </summary>
	public class LogEventArgs : EventArgs
	{
		/// <summary>
		/// Logged data.
		/// </summary>
		public object Data { get; protected set; }

		/// <summary>
		/// Log levels for the data.
		/// </summary>
		public LogLevel Level { get; protected set; }

		/// <summary>
		/// Log source that emitted the log event.
		/// </summary>
		public ILogSource Source { get; protected set; }

		/// <summary>
		/// Creates the log event args-
		/// </summary>
		/// <param name="data">Logged data.</param>
		/// <param name="level">Log level of the data.</param>
		/// <param name="source">Log source that emits these args.</param>
		public LogEventArgs(object data, LogLevel level, ILogSource source)
		{
			Data = data;
			Level = level;
			Source = source;
		}

		/// <inheritdoc />
		public override string ToString()
		{
			return $"[{Level,-7}:{Source.SourceName,10}] {Data}";
		}

		/// <summary>
		/// Like <see cref="ToString"/> but appends newline at the end.
		/// </summary>
		/// <returns>Same output as <see cref="ToString"/> but with new line.</returns>
		public string ToStringLine()
		{
			return $"[{Level,-7}:{Source.SourceName,10}] {Data}{Environment.NewLine}";
		}
	}
}