using CloudBuilder.Core.DatabaseAccessor.Entity;
using CloudBuilder.Core.Service;
using CloudBuilder.Security.Entity;

namespace CloudBuilder.Security.Utility
{
    public class ValidateHelper
    {
        public static void Validate(IApplicationService service, dynamic data, string tableName)
        {
            List<SysTableSchemaViewEntity> sysTableSchemas = service.GetRepository<IRepository<SysTableSchemaViewEntity>>().DetachedEntities.Where(x => x.TableName == tableName).ToList();
            ValidateHelper.ValidateString(data, sysTableSchemas.ToArray());
        }

        public static void ValidateString(dynamic dynamic, SysTableSchemaViewEntity[] sysTableSchemas)
        {
            // 获取所有实体有效属性
            var props = dynamic.GetType().GetProperties();
            // 获取实体当前（现在）的值

            SysTableSchemaViewEntity sysTableSchema;
            int maxLength = 0;
            string desName = null;
            // 遍历所有属性
            foreach (var prop in props)
            {
                // 获取属性名
                var propName = prop.Name;
                sysTableSchema = sysTableSchemas.Where(x => x.FieldName.Replace("_", "").ToLower() == propName.ToLower()).FirstOrDefault();

                if (sysTableSchema == null) continue;

                if (sysTableSchema.TypeOfName != "string") continue;

                if (string.IsNullOrEmpty(prop.GetValue(dynamic, null))) continue;

                maxLength = sysTableSchema.MaxLength;

                object[] objs = prop.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), true);
                desName = propName;
                if (objs != null && objs.Length > 0) desName = ((System.ComponentModel.DescriptionAttribute)objs[0]).Description;

                if (((string)prop.GetValue(dynamic, null)).Length > maxLength)
                {
                    throw new ValidatedException(string.Format("{0}长度不能超过【{1}】字符.", desName, maxLength));
                }
            }
        }
    }
}
