using Apewer.Internals;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace Apewer
{

    /// <summary>日志记录程序。</summary>
    public class Logger
    {

        private string _key = Guid.NewGuid().ToString("n");
        private string _target = "";
        private bool _enabled = true;

        /// <summary>异常。</summary>
        public event Event<Exception> ExceptionEvent;

        /// <summary>调试。</summary>
        public event Event<string> DebugEvent;

        /// <summary>文本。</summary>
        public event Event<string> TextEvent;

        /// <summary>信息。</summary>
        public event Event<string> InfomationEvent;

        /// <summary>注意。</summary>
        public event Event<string> WarningEvent;

        /// <summary>错误。</summary>
        public event Event<string> ErrorEvent;

        /// <summary>自定义。</summary>
        public event Event<object> CustomEvent;

        /// <summary>已启用。</summary>
        public bool Enabled { get { return _enabled; } set { _enabled = value; } }

        /// <summary>唯一标识。</summary>
        public string Key { get { return _key; } }

        /// <summary>目标。</summary>
        public string Target { get { return _target; } protected set { _target = value ?? ""; } }

        internal void Invoke(LogItem item)
        {
            if (item == null) return;
            switch (item.Type)
            {
                case LogType.Debug:
                    if (DebugEvent != null) DebugEvent(this, item.Content);
                    break;
                case LogType.Text:
                    if (TextEvent != null) TextEvent(this, item.Content);
                    break;
                case LogType.Infomation:
                    if (InfomationEvent != null) InfomationEvent(this, item.Content);
                    break;
                case LogType.Warning:
                    if (WarningEvent != null) WarningEvent(this, item.Content);
                    break;
                case LogType.Error:
                    if (ErrorEvent != null) ErrorEvent(this, item.Content);
                    break;
                case LogType.Exception:
                    if (ExceptionEvent != null) ExceptionEvent(this, item.Exception);
                    break;
                case LogType.Custom:
                    if (CustomEvent != null) CustomEvent(this, item.Custom);
                    break;
            }
        }

        /// <summary>异常。</summary>
        public void Exception(Exception value)
        {
            if (value == null) return;
            var item = new LogItem(LogType.Exception);
            item.Logger = this;
            item.Target = _target;
            try { item.Content = value.ToString(); } catch { }
        }

        /// <summary>自定义。</summary>
        public void Custom(object value)
        {
            if (value == null) return;
            var item = new LogItem(LogType.Custom);
            item.Logger = this;
            item.Target = _target;
            item.Custom = value;
        }

        /// <summary>调试。</summary>
        public void Debug(string value)
        {
            if (value == null) return;
            var item = new LogItem(LogType.Debug);
            item.Logger = this;
            item.Target = _target;
            item.Content = value;
        }

        /// <summary>文本。</summary>
        public void Text(string value)
        {
            if (value == null) return;
            var item = new LogItem(LogType.Text);
            item.Logger = this;
            item.Target = _target;
            item.Content = value;
        }

        /// <summary>信息。</summary>
        public void Infomation(string value)
        {
            if (value == null) return;
            var item = new LogItem(LogType.Infomation);
            item.Logger = this;
            item.Target = _target;
            item.Content = value;
        }

        /// <summary>注意。</summary>
        public void Warning(string value)
        {
            if (value == null) return;
            var item = new LogItem(LogType.Warning);
            item.Logger = this;
            item.Target = _target;
            item.Content = value;
        }

        /// <summary>错误。</summary>
        public void Error(string value)
        {
            if (value == null) return;
            var item = new LogItem(LogType.Error);
            item.Logger = this;
            item.Target = _target;
            item.Content = value;
        }

        private Logger(string target)
        {
            _target = target ?? "";
        }

        private static Event<Exception> ExceptionDefaultCallback = null;
        private static Event<object> CustomDefaultCallback = null;
        private static Event<string> DebugDefaultCallback = null;
        private static Event<string> TextDefaultCallback = null;
        private static Event<string> InfomationDefaultCallback = null;
        private static Event<string> WarningDefaultCallback = null;
        private static Event<string> ErrorDefaultCallback = null;

        private static void Logger_ExceptionEvent(object sender, Exception value)
        {
            if (ExceptionDefaultCallback != null) ExceptionDefaultCallback(sender, value);
        }

        private static void Logger_CustomEvent(object sender, object value)
        {
            if (ExceptionDefaultCallback != null) CustomDefaultCallback(sender, value);
        }

        private static void Logger_DebugEvent(object sender, string value)
        {
            if (ExceptionDefaultCallback != null) DebugDefaultCallback(sender, value);
        }

        private static void Logger_TextEvent(object sender, string value)
        {
            throw new NotImplementedException();
        }

        private static void Logger_InfomationEvent(object sender, string value)
        {
            throw new NotImplementedException();
        }

        private static void Logger_WarningEvent(object sender, string value)
        {
            throw new NotImplementedException();
        }

        private static void Logger_ErrorEvent(object sender, string value)
        {

        }

        private Logger(Type target)
        {
            try
            {
                if (target != null)
                {
                    _target = target.FullName;
                }
            }
            catch { }
        }

        private Logger(object target)
        {
            try
            {
                if (target != null)
                {
                    _target = target.GetType().FullName;
                }
            }
            catch { }
        }

        /// <summary>默认的日志记录程序。</summary>
        public static Logger Default(object target)
        {
            var logger = new Logger(target);
            logger.CustomEvent += Logger_CustomEvent;
            logger.ExceptionEvent += Logger_ExceptionEvent;
            logger.DebugEvent += Logger_DebugEvent;
            logger.TextEvent += Logger_TextEvent;
            logger.InfomationEvent += Logger_InfomationEvent;
            logger.WarningEvent += Logger_WarningEvent;
            logger.ErrorEvent += Logger_ErrorEvent;
            return logger;
        }

    }

}