using System;
using System.Collections.Generic;
using System.Text;
using Yanesdk.Ytl;
using Yanesdk.System;

namespace Yamalib.Yanesdkext.System
{
    /// <summary>
    /// 行の先頭に、現在日時も出力するLogWriter
    /// </summary>
    public class TimestampLogWriter : IDisposable
    {
        private static readonly String DEFAULT_FORMAT = "HH:mm:ss";
        private String formatStr = DEFAULT_FORMAT;
        private readonly LogWriter logWriter;

        private static bool PRINT_CONSORL = true;

        /// <summary>
        /// ログをコンソールにも出力するか
        /// </summary>
        /// <param name="b">真であれば、コンソールにも出力。さもなければコンソールに出力しない</param>
        public static void PrintConsorl(bool b)
        {
            PRINT_CONSORL = b;
        }

		#region publicメソッド
		/// <summary>
		///		コンストラクタ
		/// </summary>
        public TimestampLogWriter()
		{
            logWriter = new LogWriter();
		}

		/// <summary>書き出すフォルダ位置を指定する</summary>
		/// <example>
		///		SetPath("log");とやれば、log/20060401_1.log に書き出される
		///		(default : "")
		/// </example>
		/// <param name="path">書き出すフォルダ位置</param>
		public YanesdkResult SetPath(string path) 
		{
            return logWriter.SetPath(path);
		}

		/// <summary>
		///	[async]	1行テキストを出力する
		/// </summary>
		/// <remarks>
		///		実際には即座に書き込みは行われない。
		///		いったんtextbufにためられ、別スレッドからファイルに書き込まれる。
		/// </remarks>
		/// <param name="logtext">出力するテキスト</param>
		public YanesdkResult Write(string logtext)
		{
            StringBuilder sb = new StringBuilder(GetTimeString());
            sb.Append(" ").Append(logtext);
            String msgStr = sb.ToString();
            if (PRINT_CONSORL)
            {
                Console.WriteLine(msgStr);
            }
            return logWriter.Write(msgStr);
        }

		/// <summary>
		///		終了処理。
		/// </summary>
		public void Dispose()
		{
            logWriter.Dispose();
		}

		#endregion

		#region プロパティ
		/// <summary>
		/// 1ファイルの最大サイズ。default = 1MB = 1024*1024
		/// </summary>
		public long FileMaxSize
		{
			get { return logWriter.FileMaxSize; }
            set { logWriter.FileMaxSize = value; }
		}

		/// <summary>
		///		ファイルのエンコードを指定します。
		/// </summary>
		/// <remarks>
		///		実際のファイルの書き込み(Write)を行う前に指定してください。
		/// </remarks>
		public global::System.Text.Encoding CodePage
		{
			get { return logWriter.CodePage; }
            set { logWriter.CodePage = value; }
		}

        /// <summary>
        /// フォーマット（書式）の指定
        /// デフォルトは"hh:mm:ss"
        /// </summary>
        public String format
        {
            get { return formatStr; }
            set { formatStr = value; }
        }

        #endregion

        /// <summary>
        /// 指定された書式化された現在日時の文字列を取得する
        /// </summary>
        /// <returns></returns>
        private String GetTimeString()
        {
            return DateTime.Now.ToString(formatStr);
        }

    }
}
