/**
 * 表单验证规则转换工具
 * 将自定义的 ValidationRule 转换为 Ant Design 的 Rule 数组
 */

import type { Rule } from 'antd/es/form';
import type { ValidationRule } from '../types';

/**
 * 将验证规则转换为 Ant Design 的 Rule 数组
 * @param validationRules 自定义验证规则
 * @returns Ant Design Rule 数组
 */
export const convertValidationRules = (validationRules?: ValidationRule[]): Rule[] => {
  if (!validationRules || validationRules.length === 0) return [];

  return validationRules.map(rule => {
    const antdRule: Rule = {
      type: rule.type === 'email' ? 'email' : rule.type === 'url' ? 'url' : undefined,
      message: rule.message || getDefaultMessage(rule.type),
      // ✅ 保留用户配置的触发时机
      validateTrigger: rule.trigger || 'blur',
    };

    switch (rule.type) {
      case 'required':
        antdRule.required = true;
        antdRule.message = rule.message || '此项为必填项';
        break;
      case 'pattern':
        if (rule.value) {
          // 只支持标准正则字面量格式：/pattern/flags
          const regexMatch = rule.value.match(/^\/(.+)\/([gimsuy]*)$/);
          if (regexMatch) {
            try {
              antdRule.pattern = new RegExp(regexMatch[1], regexMatch[2]);
            } catch (error) {
              console.error('正则表达式语法错误:', rule.value, error);
            }
          } else {
            console.warn('正则表达式格式错误，请使用标准格式：/pattern/flags，例如 /^\\d+$/i');
          }
        }
        break;
      case 'min':
        antdRule.type = 'number';
        antdRule.min = rule.value;
        break;
      case 'max':
        antdRule.type = 'number';
        antdRule.max = rule.value;
        break;
      case 'minLength':
        antdRule.min = rule.value;
        antdRule.message = rule.message || `最少输入${rule.value}个字符`;
        break;
      case 'maxLength':
        antdRule.max = rule.value;
        antdRule.message = rule.message || `最多输入${rule.value}个字符`;
        break;
      case 'phone':
        antdRule.pattern = /^1[3-9]\d{9}$/;
        antdRule.message = rule.message || '请输入正确的手机号格式';
        break;
      case 'idCard':
        antdRule.pattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$/;
        antdRule.message = rule.message || '请输入正确的身份证号';
        break;
    }

    return antdRule;
  });
};

/**
 * 获取默认错误提示信息
 */
function getDefaultMessage(type: string): string {
  const messages: Record<string, string> = {
    required: '此项为必填项',
    email: '请输入正确的邮箱格式',
    url: '请输入正确的URL格式',
    phone: '请输入正确的手机号',
    idCard: '请输入正确的身份证号',
    pattern: '格式不正确',
    min: '值太小',
    max: '值太大',
    minLength: '长度太短',
    maxLength: '长度太长',
  };
  return messages[type] || '输入不正确';
}

/**
 * 合并字段的验证规则
 * 
 * 规则说明：
 * 1. 必填通过字段属性的 `required` 开关配置（不在验证规则中配置）
 * 2. 验证规则只负责格式、长度、范围等验证
 * 3. 联动规则可以动态控制必填状态（优先级最高）
 * 
 * 执行顺序：
 * - 必填规则始终在最前面（如果需要）
 * - 其他验证规则按配置顺序执行
 * 
 * @param field 字段配置
 * @param isRequired 是否必填（来自联动规则，动态覆盖字段属性）
 * @returns 合并后的验证规则数组
 */
export const mergeValidationRules = (
  field: { validationRules?: ValidationRule[]; required?: boolean; label?: string },
  isRequired?: boolean
): Rule[] => {
  // 1. 转换验证规则（格式、长度、范围等）
  const customRules = convertValidationRules(field.validationRules);
  
  // 2. 确定最终的必填状态
  // 优先级：联动规则 required > 字段属性 required
  const finalRequired = isRequired !== undefined ? isRequired : field.required;
  
  // 3. 构建最终规则数组
  if (finalRequired) {
    // 需要必填：在最前面添加必填规则
    const requiredRule: Rule = {
      required: true,
      message: `请输入${field.label || '内容'}`,
    };
    return [requiredRule, ...customRules];  // ✅ 必填在前
  } else {
    // 不需要必填：只返回其他验证规则
    return customRules;
  }
};

