using IRaCIS.Core.Infrastructure.NewtonsoftJson;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace IRaCIS.Core.API
{
    /// 
    /// LowerCamelCaseJsonAttribute 可以设置类小写返回给前端
    /// 
    public class NullToEmptyStringResolver : DefaultContractResolver
    {
        protected override IList CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            // 检查类是否有 LowerCamelCaseJsonAttribute 标记  有的话,属性名小写
            if (type.GetCustomAttribute() != null)
            {
                base.NamingStrategy = new LowerCamelCaseNamingStrategy();
            }
            else
            {
                base.NamingStrategy = null;
            }
            IList properties = base.CreateProperties(type, memberSerialization);
            var list = type.GetProperties()
                .Select(p =>
                {
                    var jp = base.CreateProperty(p, memberSerialization);
                    jp.ValueProvider = new NullToEmptyStringValueProvider(p);
                    return jp;
                }).ToList();
            var uu = list.Select(t => t.PropertyName).ToList();
            //获取复杂对象属性
            properties = properties.TakeWhile(t => !uu.Contains(t.PropertyName)).ToList();
            list.AddRange(properties);
            return list;
        }
    }
    public class NullToEmptyStringValueProvider : IValueProvider
    {
        PropertyInfo _MemberInfo;
        public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
        {
            _MemberInfo = memberInfo;
        }
        public object GetValue(object target)
        {
            object result = _MemberInfo.GetValue(target);
            if (_MemberInfo.PropertyType == typeof(string) && result == null) result = "";
            else if (_MemberInfo.PropertyType == typeof(String[]) && result == null) result = new string[] { };
            //else if (_MemberInfo.PropertyType == typeof(Nullable) && result == null) result = 0;
            //else if (_MemberInfo.PropertyType == typeof(Nullable) && result == null) result = 0.00M;
            return result;
        }
        public void SetValue(object target, object value)
        {
            if (_MemberInfo.PropertyType == typeof(string))
            {
                //去掉前后空格
                _MemberInfo.SetValue(target, value == null ? string.Empty : value.ToString() == string.Empty ? value : value/*.ToString().Trim()*/);
            }
            else
            {
                _MemberInfo.SetValue(target, value);
            }
        }
    }
}