using System;
using ChangkeTec.Utils.CustomException;

namespace ChangkeTec.Utils
{
    /// <summary>
    /// 错误等级
    /// </summary>
    public enum ErrorLevel : byte
    {
        /// <summary>
        /// 普通
        /// </summary>
        Info = 0,
        /// <summary>
        /// 警告
        /// </summary>
        Warning = 1,
        /// <summary>
        /// 错误
        /// </summary>
        Error = 2,
    }

    /// <summary>
    /// 返回消息
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ReturnInfo<T> : IDisposable
    {
        #region 属性
        /// <summary>
        /// 返回值
        /// </summary>
        public T ReturnValue { get; set; }

        /// <summary>
        /// 返回消息
        /// </summary>
        public string ReturnText { get; set; }

        /// <summary>
        /// 是否执行成功
        /// </summary>
        public bool IsSuccess { get; set; }

        /// <summary>
        /// 异常等级 默认最低级
        /// </summary>
        public ErrorLevel ErrLevel { get; set; }

        /// <summary>
        /// 内部异常
        /// </summary>
        public Exception InnerException { get; set; }

        /// <summary>
        /// 计数(总数 不考虑PageSize过滤条件)
        /// </summary>
        public int Count { get; set; }

        /// <summary>
        /// 附加返回内容
        /// </summary>
        public object Tag { get; set; }
        #endregion

        #region 方法

        public ReturnInfo()
        {
            ErrLevel = ErrorLevel.Info;
        }

        public void Dispose()
        {
            Dispose(true);
        }
        public void Dispose(bool disposing)
        {
            if (!disposing)
            {
                return;
            }
            Tag = null;
            ReturnValue = default(T);
            InnerException = null;
            ReturnText = null;
        }
        public static ReturnInfo<T> ErrorInstance(Exception ex)
        {
            ReturnInfo<T> ri = new ReturnInfo<T>();
            if ((ex is FriendlyException))
            {
                ri.ErrLevel = ErrorLevel.Warning;
                ri.ReturnText = ex.Message;
                ri.InnerException = ex;
            }
            else
            {
                ri.ErrLevel = ErrorLevel.Error;
                ri.ReturnText = ex.Message;
                ri.InnerException = ex;
            }
            return ri;
        }
        public static ReturnInfo<T> SuccInstance(T t)
        {
            ReturnInfo<T> ri = new ReturnInfo<T>();
            ri.ReturnValue = t;
            ri.IsSuccess = true;
            return ri;
        }
        public static ReturnInfo<T> SuccInstance(T t, int Count)
        {
            ReturnInfo<T> ri = ReturnInfo<T>.SuccInstance(t);
            ri.Count = Count;
            return ri;
        }
        public static ReturnInfo<T> SuccInstance(T t, object Tag)
        {
            ReturnInfo<T> ri = ReturnInfo<T>.SuccInstance(t);
            ri.Tag = Tag;
            return ri;
        }
        public static ReturnInfo<T> SuccInstance(T t, string ReturnText)
        {
            ReturnInfo<T> ri = ReturnInfo<T>.SuccInstance(t);
            ri.ReturnText = ReturnText;
            return ri;
        }
        public static ReturnInfo<T> SuccInstance(T t, int Count, string ReturnText)
        {
            ReturnInfo<T> ri = ReturnInfo<T>.SuccInstance(t);
            ri.Count = Count;
            ri.ReturnText = ReturnText;
            return ri;
        }
        public static ReturnInfo<T> SuccInstance(T t, int Count, object Tag)
        {
            ReturnInfo<T> ri = ReturnInfo<T>.SuccInstance(t);
            ri.Count = Count;
            ri.Tag = Tag;
            return ri;
        }
        public static ReturnInfo<T> SuccInstance(T t, int Count, string ReturnText, object Tag)
        {
            ReturnInfo<T> ri = ReturnInfo<T>.SuccInstance(t);
            ri.Count = Count;
            ri.ReturnText = ReturnText;
            ri.Tag = Tag;
            return ri;
        }
        #endregion
    }
    /// <summary>
    /// 返回消息 object
    /// </summary>
    public class ReturnInfo : ReturnInfo<object>
    {

    }
}