/**
 * 表单验证模块
 * 重写浏览器默认的表单验证提示信息
 * 将所有验证提示统一为英文
 */
;(function () {
  'use strict'

  // 获取HTMLInputElement原型上的validationMessage属性的原始getter方法
  const originalValidationMessage = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'validationMessage').get

  // 重写validationMessage属性的getter方法
  Object.defineProperty(HTMLInputElement.prototype, 'validationMessage', {
    get() {
      // 获取当前输入框的验证状态对象
      const validity = this.validity

      // 处理必填字段为空的情况
      if (validity.valueMissing) {
        return 'This field is required'
      }

      // 处理输入类型不匹配的情况(如email格式错误)
      if (validity.typeMismatch) {
        switch (this.type) {
          case 'email':
            return 'Please enter a valid email address'
          case 'url':
            return 'Please enter a valid URL'
          case 'tel':
            return 'Please enter a valid phone number'
          default:
            return 'Please enter a valid value'
        }
      }

      // 处理输入文本长度小于最小长度的情况
      if (validity.tooShort) {
        return `Please lengthen this text to ${this.minLength} characters or more (currently ${this.value.length} characters)`
      }

      // 处理输入文本长度大于最大长度的情况
      if (validity.tooLong) {
        return `Please shorten this text to ${this.maxLength} characters or less (currently ${this.value.length} characters)`
      }

      // 处理输入值小于最小值的情况
      if (validity.rangeUnderflow) {
        return `Please enter a value greater than or equal to ${this.min}`
      }

      // 处理输入值大于最大值的情况
      if (validity.rangeOverflow) {
        return `Please enter a value less than or equal to ${this.max}`
      }

      // 处理输入值不符合step步进值的情况
      if (validity.stepMismatch) {
        return `Please enter a valid value. The closest valid values are ${this.min} and ${this.max}`
      }

      // 处理输入值不匹配pattern正则表达式的情况
      if (validity.patternMismatch) {
        return this.title || 'Please match the requested format'
      }

      // 处理输入值格式错误的情况(如数字框输入了字母)
      if (validity.badInput) {
        switch (this.type) {
          case 'number':
            return 'Please enter a number'
          case 'date':
            return 'Please enter a valid date'
          case 'time':
            return 'Please enter a valid time'
          case 'datetime-local':
            return 'Please enter a valid date and time'
          default:
            return 'Please enter a valid value'
        }
      }

      // 如果没有匹配到以上任何验证错误,则返回原始的验证消息
      return originalValidationMessage.call(this)
    },
  })
})()