/**
 * 폼 유효성 검사 유틸리티
 */

export interface ValidationRule {
  required?: boolean;
  min?: number;
  max?: number;
  minLength?: number;
  maxLength?: number;
  pattern?: RegExp;
  email?: boolean;
  phone?: boolean;
  number?: boolean;
  custom?: (value: any) => boolean;
  message?: string;
}

export interface FieldError {
  field: string;
  message: string;
}

/**
 * 필드 유효성 검사
 */
export const validateField = (
  value: any,
  rules: ValidationRule
): string | null => {
  // 필수 체크
  if (rules.required) {
    if (
      value === null ||
      value === undefined ||
      value === "" ||
      (Array.isArray(value) && value.length === 0)
    ) {
      return rules.message || "필수 입력 항목입니다";
    }
  }

  // 값이 없으면 나머지 검사 스킵
  if (!value && value !== 0) {
    return null;
  }

  // 최소값 체크
  if (rules.min !== undefined && Number(value) < rules.min) {
    return rules.message || `최소값은 ${rules.min}입니다`;
  }

  // 최대값 체크
  if (rules.max !== undefined && Number(value) > rules.max) {
    return rules.message || `최대값은 ${rules.max}입니다`;
  }

  // 최소 길이 체크
  if (rules.minLength !== undefined && String(value).length < rules.minLength) {
    return rules.message || `최소 ${rules.minLength}자 이상 입력해주세요`;
  }

  // 최대 길이 체크
  if (rules.maxLength !== undefined && String(value).length > rules.maxLength) {
    return rules.message || `최대 ${rules.maxLength}자까지 입력 가능합니다`;
  }

  // 이메일 형식 체크
  if (rules.email) {
    const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailPattern.test(String(value))) {
      return rules.message || "올바른 이메일 형식이 아닙니다";
    }
  }

  // 전화번호 형식 체크
  if (rules.phone) {
    const phonePattern = /^0\d{1,2}-?\d{3,4}-?\d{4}$/;
    if (!phonePattern.test(String(value).replace(/\s/g, ""))) {
      return rules.message || "올바른 전화번호 형식이 아닙니다";
    }
  }

  // 숫자 형식 체크
  if (rules.number && isNaN(Number(value))) {
    return rules.message || "숫자만 입력 가능합니다";
  }

  // 패턴 체크
  if (rules.pattern && !rules.pattern.test(String(value))) {
    return rules.message || "올바른 형식이 아닙니다";
  }

  // 커스텀 검증
  if (rules.custom && !rules.custom(value)) {
    return rules.message || "유효하지 않은 값입니다";
  }

  return null;
};

/**
 * 여러 필드 유효성 검사
 */
export const validateForm = (
  data: Record<string, any>,
  rules: Record<string, ValidationRule>
): Record<string, string> => {
  const errors: Record<string, string> = {};

  Object.keys(rules).forEach((field) => {
    const error = validateField(data[field], rules[field]);
    if (error) {
      errors[field] = error;
    }
  });

  return errors;
};

/**
 * 에러가 있는지 확인
 */
export const hasErrors = (errors: Record<string, string>): boolean => {
  return Object.keys(errors).length > 0;
};

/**
 * 특정 필드의 에러 메시지 가져오기
 */
export const getFieldError = (
  errors: Record<string, string>,
  field: string
): string | undefined => {
  return errors[field];
};

/**
 * 에러 초기화
 */
export const clearErrors = (): Record<string, string> => {
  return {};
};

/**
 * 특정 필드 에러 제거
 */
export const clearFieldError = (
  errors: Record<string, string>,
  field: string
): Record<string, string> => {
  const newErrors = { ...errors };
  delete newErrors[field];
  return newErrors;
};
