/**
 * 字段状态工具
 * 统一计算和处理字段的显示状态、禁用状态、只读状态等
 */

import type { FieldConfig } from '../types';
import type { FieldState } from './linkageHelper';

/**
 * 计算字段的最终状态
 * @param field 字段配置
 * @param fieldState 联动规则计算的字段状态
 * @returns 最终字段状态
 */
export interface ComputedFieldState {
  isVisible: boolean;      // 是否可见（考虑 hidden 和联动规则）
  isDisabled: boolean;     // 是否禁用（考虑 disabled 和联动规则）
  isReadonly: boolean;     // 是否只读
  isRequired: boolean;     // 是否必填（考虑 required 和联动规则）
}

export const computeFieldState = (
  field: FieldConfig,
  fieldState: FieldState = {}
): ComputedFieldState => {
  // 可见性：联动规则的 visible 优先级高于字段的 hidden
  // 如果联动规则设置为 visible=false，则隐藏；否则检查字段的 hidden 属性
  const isVisible = fieldState.visible !== false && !field.hidden;

  // 禁用状态：联动规则的 disabled 或字段的 disabled
  const isDisabled = fieldState.disabled || field.disabled || false;

  // 只读状态：字段的 readonly（不受联动规则影响）
  const isReadonly = field.readonly || false;

  // 必填状态：联动规则的 required 优先，否则使用字段的 required
  const isRequired = fieldState.required !== undefined 
    ? fieldState.required 
    : field.required || false;

  return {
    isVisible,
    isDisabled,
    isReadonly,
    isRequired,
  };
};

/**
 * 字段分类器：根据字段类型判断应该使用哪个渲染方式
 */
export class FieldClassifier {
  /**
   * 判断字段类型
   * @returns 'layout' | 'grid' | 'field'
   * 注意：hidden 字段的判断在 FormFieldsRenderer 中通过 computeFieldState 完成
   */
  static classify(field: FieldConfig): 'layout' | 'grid' | 'field' {
    // 布局字段：文本、分割线
    if (field.type === 'text' || field.type === 'divider') {
      return 'layout';
    }
    
    // 栅格布局
    if (field.type === 'grid') {
      return 'grid';
    }
    
    // 普通表单字段
    return 'field';
  }
}

