/**
 * 表单核心逻辑 Hook
 * 集成验证规则、联动规则、默认值等核心功能
 */

import { useState, useEffect } from 'react';
import type { FormInstance } from 'antd';
import dayjs from 'dayjs';
import type { FieldConfig } from '../types';
import { calculateLinkageStates, evaluateCondition, flattenFields, type FieldState } from '../utils/linkageHelper';

/**
 * 收集字段的默认值（内部使用）
 */
const collectDefaultValues = (fieldList: FieldConfig[]): Record<string, any> => {
  const defaultValues: Record<string, any> = {};

  const collect = (fields: FieldConfig[]) => {
    fields.forEach(field => {
      // 处理有默认值的字段
      if (field.defaultValue !== undefined && field.name) {
        // 日期字段需要转换为 dayjs 对象
        if (field.type === 'date' && typeof field.defaultValue === 'string') {
          defaultValues[field.name] = dayjs(field.defaultValue);
        } else {
          defaultValues[field.name] = field.defaultValue;
        }
      }

      // 递归处理栅格布局内的字段
      if (field.type === 'grid' && field.children) {
        field.children.forEach(columnFields => {
          collect(columnFields);
        });
      }
    });
  };

  collect(fieldList);
  return defaultValues;
};

export interface UseFormCoreOptions {
  /** 字段列表 */
  fields: FieldConfig[];
  /** Ant Design Form 实例 */
  form: FormInstance;
}

export interface UseFormCoreReturn {
  /** 表单数据 */
  formData: Record<string, any>;
  /** 设置表单数据 */
  setFormData: React.Dispatch<React.SetStateAction<Record<string, any>>>;
  /** 字段状态（联动规则影响） */
  fieldStates: Record<string, FieldState>;
  /** 值变化处理函数 */
  handleValuesChange: (_: any, allValues: Record<string, any>) => void;
}

/**
 * 表单核心逻辑 Hook
 * 
 * 功能：
 * - 管理表单数据状态
 * - 处理联动规则
 * - 设置默认值
 * - 处理值联动（自动设置字段值）
 */
export const useFormCore = ({ fields, form }: UseFormCoreOptions): UseFormCoreReturn => {
  const [formData, setFormData] = useState<Record<string, any>>({});
  const [fieldStates, setFieldStates] = useState<Record<string, FieldState>>({});

  // 处理表单值变化
  const handleValuesChange = (_: any, allValues: Record<string, any>) => {
    setFormData(allValues);
  };

  // 处理联动规则（包括值联动）
  useEffect(() => {
    // 1. 计算字段状态（visible、disabled、required）
    const newFieldStates = calculateLinkageStates(fields, formData);
    setFieldStates(newFieldStates);

    // 2. 处理值联动（需要直接操作 form）
    const allFields = flattenFields(fields);
    allFields.forEach(field => {
      if (field.linkageRules && field.linkageRules.length > 0) {
        field.linkageRules.forEach(rule => {
          if (rule.type === 'value') {
            const allConditionsMet = rule.conditions.every(condition =>
              evaluateCondition(condition, formData)
            );
            if (allConditionsMet) {
              form.setFieldValue(field.name, rule.action);
            }
          }
        });
      }
    });
  }, [formData, fields, form]);

  // 设置默认值
  useEffect(() => {
    const defaultValues = collectDefaultValues(fields);
    form.setFieldsValue(defaultValues);
    setFormData(prev => ({ ...prev, ...defaultValues }));
  }, [fields, form]);

  return {
    formData,
    setFormData,
    fieldStates,
    handleValuesChange,
  };
};

