'use client';

import { useEffect, useRef } from 'react';
import type { DynamicFormData, DynamicFieldValue, ItemType, StructuredFieldConfig } from '../types';
import type { BendingFieldKeys, CategoryKeyWithId } from './useItemCodeGeneration';
import type { BendingDetail } from '@/types/item';

/**
 * usePartTypeHandling 훅 입력 파라미터
 */
export interface UsePartTypeHandlingParams {
  /** 폼 구조 정보 */
  structure: StructuredFieldConfig | null;
  /** 현재 선택된 품목 유형 */
  selectedItemType: ItemType | '';
  /** 부품 유형 필드 키 */
  partTypeFieldKey: string;
  /** 현재 선택된 부품 유형 */
  selectedPartType: string;
  /** 품목명 필드 키 */
  itemNameKey: string;
  /** 필드 값 설정 함수 */
  setFieldValue: (key: string, value: DynamicFieldValue) => void;
  /** 현재 폼 데이터 */
  formData: DynamicFormData;
  /** 절곡부품 필드 키 정보 */
  bendingFieldKeys: BendingFieldKeys;
  /** 절곡 부품 여부 */
  isBendingPart: boolean;
  /** 모든 종류 필드 키와 ID */
  allCategoryKeysWithIds: CategoryKeyWithId[];
  /** 폼 모드 (create/edit) */
  mode: 'create' | 'edit';
  /** 절곡 상세 정보 배열 */
  bendingDetails: BendingDetail[];
}

/**
 * 부품 유형 처리 커스텀 훅
 *
 * 부품 유형 변경 시 관련 필드 초기화 로직을 처리합니다:
 * 1. 부품 유형 변경 시 조건부 표시 관련 필드 초기화
 * 2. 품목명 변경 시 종류 필드 초기화 (절곡 부품)
 * 3. bendingDetails 로드 후 폭 합계 동기화 (edit 모드)
 *
 * @param params - 훅 입력 파라미터
 */
export function usePartTypeHandling({
  structure,
  selectedItemType,
  partTypeFieldKey,
  selectedPartType,
  itemNameKey,
  setFieldValue,
  formData,
  bendingFieldKeys,
  isBendingPart,
  allCategoryKeysWithIds,
  mode,
  bendingDetails,
}: UsePartTypeHandlingParams): void {
  // 이전 부품 유형 값 추적 (부품 유형 변경 감지용)
  const prevPartTypeRef = useRef<string>('');

  // 부품 유형 변경 시 조건부 표시 관련 필드 초기화
  // 2025-12-04: 절곡 ↔ 조립 부품 전환 시 formData 값이 유지되어
  // 조건부 표시가 잘못 트리거되는 버그 수정
  // 2025-12-04: setTimeout으로 초기화를 다음 틱으로 미뤄서 Select 두 번 클릭 문제 해결
  useEffect(() => {
    if (selectedItemType !== 'PT' || !partTypeFieldKey) return;

    const currentPartType = selectedPartType;
    const prevPartType = prevPartTypeRef.current;

    // 이전 값이 있고, 현재 값과 다른 경우에만 초기화
    if (prevPartType && prevPartType !== currentPartType) {
      //
      // setTimeout으로 다음 틱에서 초기화 실행
      // → 부품 유형 Select 값 변경이 먼저 완료된 후 초기화
      setTimeout(() => {
        // 조건부 표시 대상이 될 수 있는 필드들 수집 및 초기화
        // (품목명, 재질, 종류, 폭 합계, 모양&길이 등)
        const fieldsToReset: string[] = [];

        // structure에서 조건부 표시 설정이 있는 필드들 찾기
        if (structure) {
          structure.sections.forEach((section) => {
            section.fields.forEach((f) => {
              const field = f.field;
              const fieldKey = field.field_key || `field_${field.id}`;
              const fieldName = field.field_name || '';

              // 부품 유형 필드는 초기화에서 제외
              if (fieldKey === partTypeFieldKey) return;

              // 조건부 표시 트리거 필드 (display_condition이 있는 필드)
              if (field.display_condition) {
                fieldsToReset.push(fieldKey);
              }

              // 조건부 표시 대상 필드 (재질, 종류, 폭 합계, 모양&길이 등)
              const isBendingRelated =
                fieldName.includes('재질') || fieldName.includes('종류') ||
                fieldName.includes('폭') || fieldName.includes('모양') ||
                fieldName.includes('길이') || fieldKey.includes('material') ||
                fieldKey.includes('category') || fieldKey.includes('width') ||
                fieldKey.includes('shape') || fieldKey.includes('length');

              if (isBendingRelated) {
                fieldsToReset.push(fieldKey);
              }
            });
          });

          // 품목명 필드도 초기화 (조건부 표시 트리거 역할)
          if (itemNameKey) {
            fieldsToReset.push(itemNameKey);
          }
        }

        // 중복 제거 후 초기화
        const uniqueFields = [...new Set(fieldsToReset)];
        //
        uniqueFields.forEach((fieldKey) => {
          setFieldValue(fieldKey, '');
        });
      }, 0);
    }

    // 현재 값을 이전 값으로 저장
    prevPartTypeRef.current = currentPartType;
  }, [selectedItemType, partTypeFieldKey, selectedPartType, structure, itemNameKey, setFieldValue]);

  // 2025-12-16: bendingDetails 로드 후 폭 합계를 formData에 동기화
  // bendingFieldKeys.widthSum이 결정된 후에 실행되어야 함
  const bendingWidthSumSyncedRef = useRef(false);
  useEffect(() => {
    // edit 모드이고, bendingDetails가 있고, widthSum 필드 키가 결정되었을 때만 실행
    if (mode !== 'edit' || bendingDetails.length === 0 || !bendingFieldKeys.widthSum) {
      return;
    }

    // 이미 동기화했으면 스킵 (중복 실행 방지)
    if (bendingWidthSumSyncedRef.current) {
      return;
    }

    const totalSum = bendingDetails.reduce((acc, detail) => {
      return acc + detail.input + detail.elongation;
    }, 0);

    const sumString = totalSum.toString();

    setFieldValue(bendingFieldKeys.widthSum, sumString);
    bendingWidthSumSyncedRef.current = true;
  }, [mode, bendingDetails, bendingFieldKeys.widthSum, setFieldValue]);

  // 2025-12-04: 품목명 변경 시 종류 필드 값 초기화
  // 품목명(A)→종류(A1) 선택 후 품목명(B)로 변경 시, 이전 종류(A1) 값이 남아있어서
  // 새 종류(B1) 선택해도 이전 값이 품목코드에 적용되는 버그 수정
  const prevItemNameValueRef = useRef<string>('');

  useEffect(() => {
    if (!isBendingPart || !bendingFieldKeys.itemName) return;

    const currentItemNameValue = (formData[bendingFieldKeys.itemName] as string) || '';
    const prevItemNameValue = prevItemNameValueRef.current;

    // 품목명이 변경되었고, 이전 값이 있었을 때만 종류 필드 초기화
    if (prevItemNameValue && prevItemNameValue !== currentItemNameValue) {
      //
      // 모든 종류 필드 값 초기화
      allCategoryKeysWithIds.forEach(({ key }) => {
        const currentVal = (formData[key] as string) || '';
        if (currentVal) {
          //          setFieldValue(key, '');
        }
      });
    }

    // 현재 값을 이전 값으로 저장
    prevItemNameValueRef.current = currentItemNameValue;
  }, [isBendingPart, bendingFieldKeys.itemName, formData, allCategoryKeysWithIds, setFieldValue]);
}