/**
 * Material(SM, RM, CS) 데이터 변환 유틸리티
 *
 * 프론트엔드 폼 데이터 ↔ 백엔드 API 데이터 변환
 * 2025-12-05: 등록/수정 페이지 공통 사용
 */

import type { DynamicFormData } from '@/components/items/DynamicItemForm/types';

// Material 타입 상수
export const MATERIAL_TYPES = ['SM', 'RM', 'CS'] as const;
export type MaterialType = typeof MATERIAL_TYPES[number];

/**
 * Material 타입인지 확인
 */
export function isMaterialType(itemType: string | null | undefined): itemType is MaterialType {
  if (!itemType) return false;
  return (MATERIAL_TYPES as readonly string[]).includes(itemType);
}

/**
 * 프론트엔드 폼 데이터에서 standard_* 필드들을 추출하여 options 배열로 변환
 *
 * 입력: { standard_1: "옵션1-1", standard_3: "옵션3-2", name: "품목명", ... }
 * 출력: { options: [{label: "standard_1", value: "옵션1-1"}, {label: "standard_3", value: "옵션3-2"}], ... }
 */
export function convertStandardFieldsToOptions(data: DynamicFormData): {
  options: Array<{ label: string; value: string }>;
  specification: string;
  remainingData: DynamicFormData;
} {
  const options: Array<{ label: string; value: string }> = [];
  const specValues: string[] = [];
  const remainingData: DynamicFormData = {};

  Object.entries(data).forEach(([key, value]) => {
    // 규격 옵션 필드 탐지 (specification_*, standard_*, option_* 패턴)
    const isStandardField = key.startsWith('specification_') ||  // specification_1, specification_2
                           key.startsWith('standard_') ||        // standard_1, standard_2
                           key.startsWith('option_') ||          // option_1, option_2
                           /^[0-9]+_specification_/.test(key) || // "{id}_specification_1" 형식
                           /^[0-9]+_standard_/.test(key) ||      // "{id}_standard_1" 형식
                           /^[0-9]+_option_/.test(key);          // "{id}_option_1" 형식

    if (isStandardField && value && typeof value === 'string' && value.trim()) {
      // standard_* 필드는 options 배열로 변환
      options.push({ label: key, value: value.trim() });
      specValues.push(value.trim());
    } else {
      // 나머지 필드는 그대로 유지
      remainingData[key] = value;
    }
  });

  // 선택된 옵션 값들을 '-'로 연결하여 specification 생성
  const specification = specValues.join('-');

  return { options, specification, remainingData };
}

/**
 * 백엔드 API 응답의 options 배열을 프론트엔드 폼 필드로 변환
 *
 * 입력: options: [{label: "standard_1", value: "옵션1-1"}, {label: "standard_3", value: "옵션3-2"}]
 * 출력: { standard_1: "옵션1-1", standard_3: "옵션3-2" }
 */
export function convertOptionsToStandardFields(
  options: Array<{ label: string; value: string }> | null | undefined
): DynamicFormData {
  const formData: DynamicFormData = {};

  if (options && Array.isArray(options)) {
    options.forEach((opt) => {
      if (opt.label && opt.value) {
        formData[opt.label] = opt.value;
      }
    });
  }

  return formData;
}

/**
 * Material 저장 데이터 변환 (등록/수정 공통)
 *
 * 프론트엔드 폼 데이터를 백엔드 Material API 형식으로 변환
 *
 * - SM(철판), RM(원자재): standard_* 필드 조합으로 specification 자동 생성
 * - CS(소모품): spec 필드에 직접 입력한 값 사용
 */
export function transformMaterialDataForSave(
  data: DynamicFormData,
  itemType: string
): DynamicFormData {
  // standard_* 필드들을 options 배열로 변환
  const { options, specification: optionSpecification, remainingData } = convertStandardFieldsToOptions(data);

  // CS(소모품)은 spec 필드 직접 입력, SM/RM은 옵션 조합
  const isConsumable = itemType === 'CS';
  const directSpec = (remainingData.spec || remainingData.specification || '') as string;
  const finalSpecification = isConsumable
    ? (directSpec || null)  // CS: 직접 입력한 spec 값 사용
    : (optionSpecification || null);  // SM, RM: 옵션 조합값 사용

  // Material 품목코드 생성: 품목명-규격
  const materialName = (remainingData.name || remainingData.item_name || '') as string;
  const specForCode = finalSpecification || '';
  const materialCode = remainingData.code ||
    (specForCode ? `${materialName}-${specForCode}` : materialName);

  return {
    ...remainingData,
    // Material API 필드명 매핑
    material_type: (remainingData.product_type as string) || itemType,
    remarks: remainingData.note as string,  // note → remarks 변환
    material_code: materialCode,
    specification: finalSpecification,   // CS: 직접 입력값, SM/RM: 옵션 조합값
    options: options.length > 0 ? options : null,  // options 배열로 저장
    // 불필요한 필드 제거
    code: undefined,
    product_type: undefined,
    note: undefined,
    spec: undefined,  // spec → specification으로 통합됨
  };
}
