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
{
    /// <summary>
    /// LowerCamelCaseJsonAttribute 可以设置类小写返回给前端
    /// </summary>
    public class NullToEmptyStringResolver : DefaultContractResolver
    {

        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            // 检查类是否有 LowerCamelCaseJsonAttribute 标记  有的话,属性名小写
            if (type.GetCustomAttribute<LowerCamelCaseJsonAttribute>() != null)
            {
                base.NamingStrategy = new LowerCamelCaseNamingStrategy();
            }
            else
            {
                base.NamingStrategy = null;
            }


            IList<JsonProperty> 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<Int32>) && result == null) result = 0;
            //else if (_MemberInfo.PropertyType == typeof(Nullable<Decimal>) && 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);
            }

        }
    }
}