/
etc/
lib/
src/Abilities/
src/Abilities/Skills/
src/Abilities/Spells/
src/Abilities/Spells/Enums/
src/Affects/
src/ArtheaConsole/
src/ArtheaConsole/Properties/
src/ArtheaGUI/Properties/
src/Clans/Enums/
src/Commands/Communication/
src/Commands/ItemCommands/
src/Connections/
src/Connections/Colors/
src/Connections/Enums/
src/Connections/Players/
src/Connections/Players/Enums/
src/Continents/
src/Continents/Areas/
src/Continents/Areas/Characters/
src/Continents/Areas/Characters/Enums/
src/Continents/Areas/Items/
src/Continents/Areas/Items/Enums/
src/Continents/Areas/Rooms/
src/Continents/Areas/Rooms/Enums/
src/Continents/Areas/Rooms/Exits/
src/Creation/
src/Creation/Attributes/
src/Creation/Interfaces/
src/Database/
src/Database/Interfaces/
src/Environment/
src/Properties/
src/Scripts/Enums/
src/Scripts/Interfaces/
#region Arthea License

/***********************************************************************
*  Arthea MUD by R. Jennings (2007)      http://arthea.googlecode.com/ *
*  By using this code you comply with the Artistic and GPLv2 Licenses. *
***********************************************************************/

#endregion

using System;
using System.IO;
using System.Text;
using Arthea.Commands.Admin;
using Arthea.Connections.Players;
using Arthea.Environment;

namespace Arthea
{
    /// <summary>
    /// Implements a way to write a log
    /// </summary>
    public struct Log
    {
        private static readonly TextWriter file = new StreamWriter(CreateFileName());

        /// <summary>
        /// Creates the name of the file.
        /// </summary>
        /// <returns>the file name</returns>
        private static string CreateFileName()
        {
            return Paths.LogDir + DateTime.Now.ToString("ddMMyy-h.mt") + ".log";
        }

        private static void LogMessage(string type, object message)
        {
            StringBuilder buf = new StringBuilder();
            buf.AppendFormat("[{0}] [{1,-5}] {2}", DateTime.Now, type, message);
            file.WriteLine(buf);
            file.Flush();
            Console.WriteLine(buf);
        }

        /// <summary>
        /// Logs a debugging message.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="args">The args.</param>
        public static void Debug(string text, params object[] args)
        {
            LogMessage("DEBUG", string.Format(text, args));
        }

        /// <summary>
        /// Logs a debugging message.
        /// </summary>
        /// <param name="message">The message.</param>
        public static void Debug(object message)
        {
            LogMessage("DEBUG", message);
        }

        /// <summary>
        /// Logs a warning message.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="args">The args.</param>
        public static void Warn(string text, params object[] args)
        {
            LogMessage("WARN", string.Format(text, args));
        }

        /// <summary>
        /// Logs a warning message.
        /// </summary>
        /// <param name="message">The message.</param>
        public static void Warn(object message)
        {
            LogMessage("WARN", message);
        }

        /// <summary>
        /// Logs and info message.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="args">The args.</param>
        public static void Info(string text, params object[] args)
        {
            LogMessage("INFO", string.Format(text, args));
        }

        /// <summary>
        /// Logs an info message.
        /// </summary>
        /// <param name="message">The message.</param>
        public static void Info(object message)
        {
            LogMessage("INFO", message);
        }

        /// <summary>
        /// Logs an error message.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="args">The args.</param>
        public static void Error(string text, params object[] args)
        {
            LogMessage("ERROR", string.Format(text, args));
        }

        /// <summary>
        /// Logs an error message.
        /// </summary>
        /// <param name="message">The message.</param>
        public static void Error(object message)
        {
            LogMessage("ERROR", message);
        }

        /// <summary>
        /// Logs a fatal error message.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="args">The args.</param>
        public static void Fatal(string text, params object[] args)
        {
            LogMessage("FATAL", string.Format(text, args));
        }

        /// <summary>
        /// Logs a fatal error message.
        /// </summary>
        /// <param name="message">The message.</param>
        public static void Fatal(object message)
        {
            LogMessage("FATAL", message);
        }

        /// <summary>
        /// Logs bugs.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="args">The args.</param>
        public static void Bug(string text, params object[] args)
        {
            string message = string.Format(text, args);
            LogMessage("BUG", message);
            BugNet(message);
        }

        /// <summary>
        /// Log bugs.
        /// </summary>
        /// <param name="message">The message.</param>
        public static void Bug(object message)
        {
            LogMessage("BUG", message);
            BugNet(message);
        }

        /// <summary>
        /// Report a bugs to online admins.
        /// </summary>
        /// <param name="text">The text.</param>
        private static void BugNet(object text)
        {
            foreach (Player player in Lists.Players)
            {
                if (player.Powers[Powers.BugNet])
                {
                    player.WriteLine("BUGNET> {0}", text);
                }
            }
        }
    }
}