/**
 * BOM 관리 커스텀 훅
 *
 * BOM 라인 추가, 수정, 삭제 및 검색 상태 관리
 */

import { useState, useCallback } from 'react';
import type { BOMLine } from '@/types/item';

export interface BOMSearchState {
  searchValue: string;
  isOpen: boolean;
}

export interface UseBOMManagementProps {
  initialBomLines?: BOMLine[];
}

export function useBOMManagement({ initialBomLines = [] }: UseBOMManagementProps = {}) {
  const [bomLines, setBomLines] = useState<BOMLine[]>(initialBomLines);
  const [bomSearchStates, setBomSearchStates] = useState<Record<string, BOMSearchState>>({});

  /**
   * 새 BOM 라인 추가
   */
  const addBomLine = useCallback(() => {
    const newLine: BOMLine = {
      id: `bom-${Date.now()}`,
      childItemCode: '',
      childItemName: '',
      quantity: 1,
      unit: 'EA',
    };
    setBomLines((prev) => [...prev, newLine]);
    return newLine;
  }, []);

  /**
   * BOM 라인 삭제
   */
  const removeBomLine = useCallback((lineId: string) => {
    setBomLines((prev) => prev.filter((line) => line.id !== lineId));
    // 검색 상태도 제거
    setBomSearchStates((prev) => {
      const newStates = { ...prev };
      delete newStates[lineId];
      return newStates;
    });
  }, []);

  /**
   * BOM 라인 업데이트
   */
  const updateBomLine = useCallback((lineId: string, updates: Partial<BOMLine>) => {
    setBomLines((prev) =>
      prev.map((line) =>
        line.id === lineId ? { ...line, ...updates } : line
      )
    );
  }, []);

  /**
   * 품목 선택 시 BOM 라인 데이터 채우기
   */
  const selectItemForBomLine = useCallback((
    lineId: string,
    item: {
      itemCode?: string;
      itemName?: string;
      specification?: string;
      material?: string;
      unit?: string;
      partType?: string;
      bendingDiagram?: string;
    }
  ) => {
    const isBendingPart = item.partType === 'BENDING';

    setBomLines((prev) =>
      prev.map((line) =>
        line.id === lineId
          ? {
              ...line,
              childItemCode: item.itemCode || '',
              childItemName: item.itemName || '',
              specification: item.specification || '',
              material: item.material || '',
              unit: item.unit || 'EA',
              unitPrice: 0, // TODO: pricing에서 가져오기
              isBending: isBendingPart,
              bendingDiagram: isBendingPart ? item.bendingDiagram : undefined,
            }
          : line
      )
    );

    // 검색 팝오버 닫기
    setBomSearchStates((prev) => ({
      ...prev,
      [lineId]: { searchValue: '', isOpen: false },
    }));
  }, []);

  /**
   * 검색 상태 업데이트
   */
  const updateSearchState = useCallback((lineId: string, updates: Partial<BOMSearchState>) => {
    setBomSearchStates((prev) => ({
      ...prev,
      [lineId]: { ...(prev[lineId] || { searchValue: '', isOpen: false }), ...updates },
    }));
  }, []);

  /**
   * 검색 팝오버 열기
   */
  const openSearch = useCallback((lineId: string) => {
    setBomSearchStates((prev) => ({
      ...prev,
      [lineId]: { searchValue: '', isOpen: true },
    }));
  }, []);

  /**
   * 검색 팝오버 닫기
   */
  const closeSearch = useCallback((lineId: string) => {
    setBomSearchStates((prev) => ({
      ...prev,
      [lineId]: { ...(prev[lineId] || { searchValue: '' }), isOpen: false },
    }));
  }, []);

  /**
   * 모든 BOM 라인 초기화
   */
  const resetBomLines = useCallback(() => {
    setBomLines([]);
    setBomSearchStates({});
  }, []);

  /**
   * BOM 라인 수량 변경
   */
  const updateQuantity = useCallback((lineId: string, quantity: number) => {
    updateBomLine(lineId, { quantity });
  }, [updateBomLine]);

  /**
   * BOM 라인 단가 변경
   */
  const updateUnitPrice = useCallback((lineId: string, unitPrice: number) => {
    updateBomLine(lineId, { unitPrice });
  }, [updateBomLine]);

  /**
   * BOM 라인 재질 변경
   */
  const updateMaterial = useCallback((lineId: string, material: string) => {
    updateBomLine(lineId, { material });
  }, [updateBomLine]);

  /**
   * BOM 라인 비고 변경
   */
  const updateNote = useCallback((lineId: string, note: string) => {
    updateBomLine(lineId, { note });
  }, [updateBomLine]);

  /**
   * 특정 라인의 검색 상태 가져오기
   */
  const getSearchState = useCallback((lineId: string): BOMSearchState => {
    return bomSearchStates[lineId] || { searchValue: '', isOpen: false };
  }, [bomSearchStates]);

  /**
   * BOM 합계 계산
   */
  const calculateTotal = useCallback(() => {
    return bomLines.reduce((total, line) => {
      return total + (line.quantity * (line.unitPrice || 0));
    }, 0);
  }, [bomLines]);

  return {
    // 상태
    bomLines,
    setBomLines,
    bomSearchStates,
    setBomSearchStates,

    // BOM 라인 조작
    addBomLine,
    removeBomLine,
    updateBomLine,
    selectItemForBomLine,

    // 필드 업데이트 헬퍼
    updateQuantity,
    updateUnitPrice,
    updateMaterial,
    updateNote,

    // 검색 상태 관리
    updateSearchState,
    openSearch,
    closeSearch,
    getSearchState,

    // 유틸리티
    resetBomLines,
    calculateTotal,

    // 상태 체크
    hasBomLines: bomLines.length > 0,
    bomLinesCount: bomLines.length,
  };
}

export type UseBOMManagementReturn = ReturnType<typeof useBOMManagement>;
