#coding=utf-8

from rest_framework import fields

def dump_serializer_errors(serializer):
    error_messages = {
        u'blank': u'此字段不能为空',
        u'required': u'此字段必填',
        u'max_length':u'此字段不超过%d个字符',
        u'min_length':u'此字段不少于%d个字符',
        u'null': u'该字段不能为空'  # This field may not be null
    }
    field_error_messages = {
        fields.BooleanField:{
            u'invalid': u'此字段不是一个合法的布尔值'
        },
        fields.CharField: {
            u'invalid': u'此字段不是一个合法的字符串'
        },
        fields.NullBooleanField: {
            u'invalid': u'此字段不是一个合法的布尔值'
        },
        fields.EmailField: {
            u'invalid': u'邮箱格式不正确'
        },
        fields.RegexField: {
            u'invalid': u'此字段没有匹配的一个必要的模板'
        },
        fields.SlugField: {
            u'invalid': u'此字段不是一个合法的slug，应该由字母，数字，下划线，连字符组成',
            u'invalid_unicode': u'此字段不是一个合法的slug，应该由unicode字母，数字，下划线，连字符组成'
        },
        fields.URLField: {
            u'invalid': u'此字段不是一个合法的URL'
        },
        fields.UUIDField: {
            u'invalid': u'此字段不是一个合法的UUID'
        },
        fields.IPAddressField: {
            u'invalid': u'此字段不是一个合法的IPv4或者IPv6地址'
        },
        fields.IntegerField: {
            u'invalid': u'此字段不是一个合法的整数',
            u'max_value': u'此字段的数值要小于等于%d',
            u'min_value': u'此字段的数值要大于等于%d',
            u'max_string_length': u'此字段长度超过1000',
        },
        fields.FloatField: {
            u'invalid': u'此字段不是一个合法的浮点数',
            u'max_value': u'此字段的数值要小于等于%d',
            u'min_value': u'此字段的数值要大于等于%d',
            u'max_string_length': u'此字段长度超过1000',
        },
        fields.DecimalField: {
            u'invalid': u'此字段不是一个合法的数字',
            u'max_value': u'此字段的数值要小于等于%d',
            u'min_value': u'此字段的数值要大于等于%d',
            u'max_digits': u'此字段的数值不超过%d位',
            u'max_decimal_places': u'此字段十进制位不超过%d',
            u'max_whole_digits': u'此字段小数点前的数字不超过%d。',
            u'max_string_length': u'此字段长度超过1000',
        },
        fields.DateTimeField: {
            u'invalid': u'日期时间格式不合法',
            u'date': u'不能只输入日期，应输入日期和时间',
            u'make_aware': u'时区%d不合法',
            u'overflow': u'日期时间超出范围',
        },
        fields.DateField: {
            u'invalid': u'日期格式不合法',
            u'date': u'应输入日期，不能输入日期和时间',
        },
        fields.TimeField: {
            u'invalid': u'时间格式不合法',
        },
        fields.DurationField: {
            u'invalid': u'时间段格式不合法，应该用格式:%d',
        },
        fields.ChoiceField: {
            u'invalid_choice': u'此字段不是一个合法的选项',
        },
        fields.MultipleChoiceField: {
            u'invalid_choice': u'此字段不是一个合法的选项',
            u'not_a_list': u'应输入数组（list）格式',
            u'empty': u'此选项不能为空',
        },
        fields.FilePathField: {
            u'invalid_choice': u'此字段不是一个合法的路径',
        },
        fields.FileField: {
            u'required': u'没有提交文件',
            u'invalid': u'提交的不是文件，请检查表单的编码类型',
            u'no_name': u'没有文件名',
            u'empty': u'提交的是一个空文件',
            u'max_length': u'文件内容要小于%d个字符',
        },
        fields.ImageField: {
            u'invalid_image': u'提交的不是图片文件或者图片文件损坏，请提交一个合法的图片文件',
        },
        fields.ListField: {
            u'not_a_list': u'此字段应传入数组（list）类型',
            u'empty': u'传入的list不能为空',
            u'min_length': u'该字段至少要%d个元素',
            u'max_length': u'该字段最多能有%d个元素',
        },
        fields.DictField: {
            u'not_a_dict': u'此字段应传入字典(dict)类型',
        },
        fields.JSONField: {
            u'invalid': u'此字段不是一个合法的JSON类型'
        },
        fields.ModelField: {
            u'max_length': u'此字段长度要小于等于%d个字符'
        }
    }

    result = [u'数据错误<br />', ]
    for i in range(0, len(serializer.errors.keys())):
        k = serializer.errors.keys()[i]
        v = serializer.errors.values()[i]
        field = serializer.fields.get(k)

        label = field.label
        if label:
            label += ' - '
        else:
            label = ''

        error_detail = v[0]
        try:
            msg = field_error_messages[type(field)][error_detail.code]
            if type(field) == fields.IntegerField or type(field) == fields.FloatField:
                if error_detail.code == u'max_value':
                    msg = msg % field.max_value
                if error_detail.code == u'min_value':
                    msg = msg % field.min_value

            if type(field) == fields.DecimalField:
                if error_detail.code == u'max_value':
                    msg = msg % field.max_value
                if error_detail.code == u'min_value':
                    msg = msg % field.min_value
                if error_detail.code == u'max_digits':
                    msg = msg % field.max_digits
                if error_detail.code == u'max_decimal_places':
                    msg = msg % field.decimal_places
                if error_detail.code == u'max_whole_digits':
                    msg = msg % field.max_whole_digits

            if type(field) == fields.DateTimeField:
                if error_detail.code == u'make_aware':
                    msg = msg % field.timezone

            if type(field) == fields.DurationField:
                if error_detail.code == u'invalid':
                    msg = msg % u'[DD] [HH:[MM:]]ss[.uuuuuu]'

            if type(field) == fields.DateTimeField:
                if error_detail.code == u'make_aware':
                    msg = msg % field.timezone

            if type(field) == fields.ListField:
                if error_detail.code == u'min_length':
                    msg = msg % field.min_length
                if error_detail.code == u'max_length':
                    msg = msg % field.max_length

            if type(field) == fields.ModelField:
                if error_detail.code == u'max_length':
                    msg = msg % field.max_length

        except:
            try:
                msg = error_messages[error_detail.code]
                if error_detail.code == u'max_length':
                    msg = msg % field.max_length
                if error_detail.code == u'min_length':
                    msg = msg % field.min_length

            except:
                msg = unicode(error_detail)
        msg = label + msg
        result.append(msg)
    return u'<br />'.join(result)