import { useState, useCallback } from "react";

/**
 * 벨리데이션 관리 커스텀 훅
 * 
 * 품목관리 디자인 시스템 표준에 따라 폼 벨리데이션을 처리합니다.
 * 
 * @example
 * ```tsx
 * const { validationErrors, setValidationErrors, clearFieldError, validateField } = useValidation();
 * 
 * // 필드 단위 벨리데이션
 * const handleInputChange = (value: string) => {
 *   setFormData({ ...formData, itemName: value });
 *   clearFieldError('itemName');
 * };
 * 
 * // 전체 벨리데이션
 * const handleSave = () => {
 *   const errors: Record<string, string> = {};
 *   
 *   if (!formData.itemName) {
 *     errors.itemName = "품목명을 입력해주세요";
 *   }
 *   
 *   if (Object.keys(errors).length > 0) {
 *     setValidationErrors(errors);
 *     return;
 *   }
 *   
 *   // 저장 로직
 * };
 * ```
 */

interface UseValidationReturn {
  /** 벨리데이션 에러 객체 */
  validationErrors: Record<string, string>;
  /** 벨리데이션 에러 설정 */
  setValidationErrors: (errors: Record<string, string>) => void;
  /** 특정 필드의 에러 제거 */
  clearFieldError: (field: string) => void;
  /** 모든 에러 제거 */
  clearAllErrors: () => void;
  /** 특정 필드의 에러 설정 */
  setFieldError: (field: string, message: string) => void;
  /** 에러가 있는지 확인 */
  hasErrors: () => boolean;
}

export function useValidation(): UseValidationReturn {
  const [validationErrors, setValidationErrors] = useState<Record<string, string>>({});

  // 특정 필드의 에러 제거
  const clearFieldError = useCallback((field: string) => {
    setValidationErrors((prev) => {
      if (prev[field]) {
        const newErrors = { ...prev };
        delete newErrors[field];
        return newErrors;
      }
      return prev;
    });
  }, []);

  // 모든 에러 제거
  const clearAllErrors = useCallback(() => {
    setValidationErrors({});
  }, []);

  // 특정 필드의 에러 설정
  const setFieldError = useCallback((field: string, message: string) => {
    setValidationErrors((prev) => ({
      ...prev,
      [field]: message,
    }));
  }, []);

  // 에러가 있는지 확인
  const hasErrors = useCallback(() => {
    return Object.keys(validationErrors).length > 0;
  }, [validationErrors]);

  return {
    validationErrors,
    setValidationErrors,
    clearFieldError,
    clearAllErrors,
    setFieldError,
    hasErrors,
  };
}

/**
 * 필드 에러 스타일 헬퍼 함수
 * 
 * @param hasError - 에러가 있는지 여부
 * @param baseClass - 기본 클래스명 (선택사항)
 * @returns 에러 상태에 따른 클래스명
 * 
 * @example
 * ```tsx
 * <Input 
 *   className={getFieldErrorClass(!!validationErrors.itemName)}
 *   name="itemName"
 * />
 * ```
 */
export function getFieldErrorClass(hasError: boolean, baseClass: string = ""): string {
  const errorClass = hasError ? "border-red-500" : "";
  return baseClass ? `${baseClass} ${errorClass}` : errorClass;
}

/**
 * Select 컴포넌트용 에러 스타일 헬퍼 함수
 * 
 * @param hasError - 에러가 있는지 여부
 * @returns 에러 상태에 따른 클래스명
 * 
 * @example
 * ```tsx
 * <SelectTrigger 
 *   className={getSelectErrorClass(!!validationErrors.itemType)}
 *   name="itemType"
 * />
 * ```
 */
export function getSelectErrorClass(hasError: boolean): string {
  return hasError ? "border-2 border-red-500" : "border-2 border-blue-500";
}
