/**
 * DOM props 필터링 유틸리티
 * React 전용 props들을 DOM 요소에 전달되지 않도록 필터링합니다.
 */

// DOM에 전달하면 안 되는 React 전용 props 목록
const REACT_ONLY_PROPS = new Set([
  // 컴포넌트 관련
  "component",
  "componentConfig",
  "config",
  "isSelected",
  "isDesignMode",
  "isInteractive",
  "size",
  "position",

  // 이벤트 핸들러 (React 이벤트 외)
  "onFormDataChange",
  "onRefresh",
  "onClose",
  "onZoneComponentDrop",
  "onZoneClick",
  "onSelectedRowsChange",
  "onUpdateLayout",
  "onConfigChange",

  // 데이터 관련
  "formData",
  "originalData",
  "selectedScreen",
  "allComponents",
  "refreshKey",
  "value", // 커스텀 value prop (input의 value와 구별)

  // 화면/테이블 관련
  "screenId",
  "tableName",

  // 상태 관련
  "mode",
  "isInModal",
  "isPreview",

  // 테이블 관련
  "selectedRows",
  "selectedRowsData",

  // 컴포넌트 기능 관련
  "autoGeneration",
  "hidden", // 이미 SAFE_DOM_PROPS에 있지만 커스텀 구현을 위해 제외
  
  // 필터링할 특수 속성
  "readonly", // readOnly로 변환되므로 원본은 제거
]);

// DOM에 안전하게 전달할 수 있는 표준 HTML 속성들
const SAFE_DOM_PROPS = new Set([
  // 표준 HTML 속성
  "id",
  "className",
  "style",
  "title",
  "lang",
  "dir",
  "role",
  "tabIndex",
  "accessKey",
  "contentEditable",
  "draggable",
  "hidden",
  "spellCheck",
  "translate",
  
  // 폼 관련 속성
  "readOnly",
  "disabled",
  "required",
  "placeholder",
  "value",
  "defaultValue",
  "checked",
  "defaultChecked",
  "name",
  "type",
  "accept",
  "autoComplete",
  "autoFocus",
  "multiple",
  "pattern",
  "min",
  "max",
  "step",
  "minLength",
  "maxLength",

  // ARIA 속성 (aria-로 시작)
  // data 속성 (data-로 시작)

  // 표준 이벤트 핸들러
  "onClick",
  "onDoubleClick",
  "onMouseDown",
  "onMouseUp",
  "onMouseOver",
  "onMouseOut",
  "onMouseEnter",
  "onMouseLeave",
  "onMouseMove",
  "onKeyDown",
  "onKeyUp",
  "onKeyPress",
  "onFocus",
  "onBlur",
  "onChange",
  "onInput",
  "onSubmit",
  "onReset",
  "onDragStart",
  "onDragEnd",
  "onDragOver",
  "onDragEnter",
  "onDragLeave",
  "onDrop",
  "onScroll",
  "onWheel",
  "onLoad",
  "onError",
  "onResize",
]);

/**
 * props에서 React 전용 속성들을 제거하고 DOM 안전한 props만 반환
 */
export function filterDOMProps<T extends Record<string, any>>(props: T): Partial<T> {
  const filtered: Partial<T> = {};

  for (const [key, value] of Object.entries(props)) {
    // React 전용 props는 제외
    if (REACT_ONLY_PROPS.has(key)) {
      continue;
    }

    // readonly → readOnly 변환 (React의 camelCase 규칙)
    if (key === "readonly") {
      filtered["readOnly" as keyof T] = value;
      continue;
    }

    // aria- 또는 data- 속성은 안전하게 포함
    if (key.startsWith("aria-") || key.startsWith("data-")) {
      filtered[key as keyof T] = value;
      continue;
    }

    // 안전한 DOM props만 포함
    if (SAFE_DOM_PROPS.has(key)) {
      filtered[key as keyof T] = value;
    }
  }

  return filtered;
}

/**
 * props를 React 전용과 DOM 안전한 것으로 분리
 */
export function separateProps<T extends Record<string, any>>(
  props: T,
): {
  reactProps: Partial<T>;
  domProps: Partial<T>;
} {
  const reactProps: Partial<T> = {};
  const domProps: Partial<T> = {};

  for (const [key, value] of Object.entries(props)) {
    if (REACT_ONLY_PROPS.has(key)) {
      reactProps[key as keyof T] = value;
    } else if (key.startsWith("aria-") || key.startsWith("data-") || SAFE_DOM_PROPS.has(key)) {
      domProps[key as keyof T] = value;
    }
    // 둘 다 해당하지 않는 경우 무시 (안전을 위해)
  }

  return { reactProps, domProps };
}

/**
 * React 전용 props 여부 확인
 */
export function isReactOnlyProp(propName: string): boolean {
  return REACT_ONLY_PROPS.has(propName);
}

/**
 * DOM 안전 props 여부 확인
 */
export function isDOMSafeProp(propName: string): boolean {
  return SAFE_DOM_PROPS.has(propName) || propName.startsWith("aria-") || propName.startsWith("data-");
}

/**
 * 디버깅용: 필터링된 props 로깅
 */
export function logFilteredProps<T extends Record<string, any>>(
  originalProps: T,
  componentName: string = "Component",
): void {
  const { reactProps, domProps } = separateProps(originalProps);

  console.group(`🔍 ${componentName} Props 필터링`);
  console.log("📥 원본 props:", Object.keys(originalProps));
  console.log("⚛️ React 전용 props:", Object.keys(reactProps));
  console.log("🌐 DOM 안전 props:", Object.keys(domProps));

  // React 전용 props가 DOM에 전달될 뻔한 경우 경고
  const reactPropsKeys = Object.keys(reactProps);
  if (reactPropsKeys.length > 0) {
    console.warn("⚠️ 다음 React 전용 props가 필터링되었습니다:", reactPropsKeys);
  }

  console.groupEnd();
}
