using System;
using System.Diagnostics;
using System.IO;

namespace TCMPortMapper
{
	public abstract class OutputLog
	{
		protected const String F = "yyyy-MM-dd HH:mm:ss:fff";

		protected static String Timestamp()
		{
			return DateTime.Now.ToString(F);
		}
	}

	public class DebugLog : OutputLog
	{
		[Conditional("DEBUG")]
		public static void Write(String format, params Object[] args)
		{
			String partMessage = String.Format(format, args);
			String fullMessage = String.Format("{0}:  {1}", Timestamp(), partMessage);
			Debug.Write(fullMessage);
		}

		[Conditional("DEBUG")]
		public static void WriteIf(bool flag, String format, params Object[] args)
		{
			if (flag)
			{
				String partMessage = String.Format(format, args);
				String fullMessage = String.Format("{0}:  {1}", Timestamp(), partMessage);
				Debug.Write(fullMessage);
			}
		}

		[Conditional("DEBUG")]
		public static void WriteLine(String format, params Object[] args)
		{
			String partMessage = String.Format(format, args);
			String fullMessage = String.Format("{0}:  {1}", Timestamp(), partMessage);
			Debug.WriteLine(fullMessage);
		}

		[Conditional("DEBUG")]
		public static void WriteLineIf(bool flag, String format, params Object[] args)
		{
			if (flag)
			{
				String partMessage = String.Format(format, args);
				String fullMessage = String.Format("{0}:  {1}", Timestamp(), partMessage);
				Debug.WriteLine(fullMessage);
			}
		}
	}

    public class ReleaseLog : OutputLog
    {
        public static void WriteError(String format, params Object[] args)
        {
            String partMessage = String.Format(format, args);
            String fullMessage = String.Format("{0}:  {1}", Timestamp(), partMessage);
            EventLog.WriteEntry("TCMPortMapper", fullMessage, EventLogEntryType.Error);
        }

        public static void WriteInformation(String format, params Object[] args)
        {
            String partMessage = String.Format(format, args);
            String fullMessage = String.Format("{0}:  {1}", Timestamp(), partMessage);
            EventLog.WriteEntry("TCMPortMapper", fullMessage, EventLogEntryType.Information);
        }

        public static void WriteWarning(String format, params Object[] args)
        {
            String partMessage = String.Format(format, args);
            String fullMessage = String.Format("{0}:  {1}", Timestamp(), partMessage);
            EventLog.WriteEntry("TCMPortMapper", fullMessage, EventLogEntryType.Warning);
        }
    }
}
