using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Newtonsoft.Json;

namespace LogStudy.EventLog.Next
{
    public class CustomEventListener : EventListener
    {
        protected override void OnEventSourceCreated(EventSource eventSource)
        {
            if (eventSource.Name.StartsWith("EventLogNext-"))
            {
                EnableEvents(eventSource, EventLevel.Verbose);
            }
        }

        /// <summary>
        /// 处理事件
        /// 其中 PayloadName 是个数组,表示事件源方法的形参数名称列表
        /// Payload也是个数组,为 PayloadName 形参列表对应的实参列表
        /// </summary>
        /// <param name="eventData"></param>
        protected override void OnEventWritten(EventWrittenEventArgs eventData)
        {
            var content = ToText(eventData);

            Console.WriteLine("---------事件日志开始-----------------------------------------------------------------------");
            Console.WriteLine(content);
            Console.WriteLine("=========事件日志结束=======================================================================");
            Console.WriteLine();
        }

        private string ToJson(EventWrittenEventArgs eventData)
        { 
            return Newtonsoft.Json.JsonConvert.SerializeObject(eventData, Formatting.Indented);
        }

        private string ToText(EventWrittenEventArgs eventData)
        {
            StringBuilder stringBuilder= new StringBuilder(1000);

            stringBuilder.AppendLine($"[TimeStamp               = { eventData.TimeStamp.ToLongDateString }]");
            stringBuilder.AppendLine($"[OSThreadId              = { eventData.OSThreadId }]"); 
            stringBuilder.AppendLine($"[ActivityId              = { eventData.ActivityId }]" ); 
            stringBuilder.AppendLine($"[RelatedActivityId       = { eventData.RelatedActivityId }],");
            stringBuilder.AppendLine($"[Channel                 = { eventData.Channel }]"); 
            stringBuilder.AppendLine($"[Version                 = { eventData.Version }]"); 
            stringBuilder.AppendLine($"[Opcode                  = { eventData.Opcode }]"); 
            stringBuilder.AppendLine($"[EventSource             = { eventData.EventSource }]"); 
            stringBuilder.AppendLine($"[EventId                 = { eventData.EventId }]"); 
            stringBuilder.AppendLine($"[EventName               = { eventData.EventName }]"); 
            stringBuilder.AppendLine($"[Keywords                = { eventData.Keywords }]"); 
            stringBuilder.AppendLine($"[Level                   = { eventData.Level }]");
            stringBuilder.AppendLine($"[Message                 = { eventData.Message }]");
            stringBuilder.AppendLine($"[PayloadNames            = { eventData.PayloadNames }]");
            stringBuilder.AppendLine($"[Payload                 = { eventData.Payload }]");
            stringBuilder.AppendLine($"[Message                 = { eventData.Message }]");
            stringBuilder.AppendLine($"[Tags                    = { eventData.Tags },");
            stringBuilder.AppendLine($"[Task                    = { eventData.Task },");

            return stringBuilder.ToString();
        }
    }
}