/**
 * 表单创建工具函数
 * 用于处理动态表单的配置和字段设置
 */

import type { Dispatch, SetStateAction } from 'react';

/**
 * 表单配置和字段数据类型
 */
export interface FormCreateData {
  rule: any[];
  option: Record<string, any>;
}

/**
 * 设置表单配置和字段（React 版本）
 * @param setState React 的 setState 函数或 ref 的 setter
 * @param conf 表单配置字符串（JSON 格式）
 * @param fields 表单字段数组（JSON 格式字符串或数组）
 */
export function setConfAndFields2(
  setState: Dispatch<SetStateAction<FormCreateData>> | { current: FormCreateData },
  conf: string | Record<string, any>,
  fields: string | string[] | any[]
): void {
  let parsedConf: Record<string, any> = {};
  let parsedFields: any[] = [];

  // 解析配置
  if (typeof conf === 'string') {
    try {
      parsedConf = JSON.parse(conf);
    } catch (e) {
      console.error('解析表单配置失败:', e);
      parsedConf = {};
    }
  } else if (conf && typeof conf === 'object') {
    parsedConf = conf;
  }

  // 解析字段
  if (typeof fields === 'string') {
    try {
      parsedFields = JSON.parse(fields);
    } catch (e) {
      console.error('解析表单字段失败:', e);
      parsedFields = [];
    }
  } else if (Array.isArray(fields)) {
    parsedFields = fields.map((field) => {
      if (typeof field === 'string') {
        try {
          return JSON.parse(field);
        } catch (e) {
          return field;
        }
      }
      return field;
    });
  }

  // 更新状态
  const newData: FormCreateData = {
    rule: parsedFields,
    option: parsedConf
  };

  // 处理 React setState 或 ref
  if (typeof setState === 'function') {
    setState(newData);
  } else if (setState && typeof setState === 'object' && 'current' in setState) {
    setState.current = newData;
  }
}

/**
 * 设置表单配置和字段（兼容 Vue ref 风格的函数）
 * 用于直接修改 ref 对象的属性
 * @param refObject 包含 rule 和 option 属性的对象引用
 * @param conf 表单配置字符串（JSON 格式）
 * @param fields 表单字段数组（JSON 格式字符串或数组）
 */
export function setConfAndFields(
  refObject: { rule: any[]; option: Record<string, any> },
  conf: string | Record<string, any>,
  fields: string | string[] | any[]
): void {
  let parsedConf: Record<string, any> = {};
  let parsedFields: any[] = [];

  // 解析配置
  if (typeof conf === 'string') {
    try {
      parsedConf = JSON.parse(conf);
    } catch (e) {
      console.error('解析表单配置失败:', e);
      parsedConf = {};
    }
  } else if (conf && typeof conf === 'object') {
    parsedConf = conf;
  }

  // 解析字段
  if (typeof fields === 'string') {
    try {
      parsedFields = JSON.parse(fields);
    } catch (e) {
      console.error('解析表单字段失败:', e);
      parsedFields = [];
    }
  } else if (Array.isArray(fields)) {
    parsedFields = fields.map((field) => {
      if (typeof field === 'string') {
        try {
          return JSON.parse(field);
        } catch (e) {
          return field;
        }
      }
      return field;
    });
  }

  // 直接修改对象属性
  refObject.rule = parsedFields;
  refObject.option = parsedConf;
}

