/// 폼 필드 검증 함수 및 유틸리티 (SRP, 재사용성, 테스트 용이성 중심)
library;

/// 필수 입력값 검증
String? validateRequired(String? value, String fieldName) {
  if (value == null || value.isEmpty) {
    return '$fieldName을(를) 입력해주세요';
  }
  return null;
}

/// 이메일 형식 검증
String? validateEmail(String? value) {
  if (value == null || value.isEmpty) {
    return '이메일을 입력해주세요';
  }
  final emailRegex = RegExp(
    r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
  );
  if (!emailRegex.hasMatch(value)) {
    return '유효한 이메일 주소를 입력해주세요';
  }
  return null;
}

/// 전화번호 형식 검증 (숫자, 하이픈만 허용)
String? validatePhoneNumber(String? value) {
  if (value == null || value.isEmpty) {
    return null; // 필수 입력 아님
  }
  final phoneRegex = RegExp(r'^[0-9\-]+$');
  if (!phoneRegex.hasMatch(value)) {
    return '전화번호는 숫자와 하이픈(-)만 입력 가능합니다';
  }
  return null;
}

/// 숫자 검증
String? validateNumber(String? value, String fieldName) {
  if (value == null || value.isEmpty) {
    return '$fieldName을(를) 입력해주세요';
  }
  final numberRegex = RegExp(r'^[0-9]+$');
  if (!numberRegex.hasMatch(value)) {
    return '$fieldName은(는) 숫자만 입력 가능합니다';
  }
  return null;
}

/// 최소 길이 검증
String? validateMinLength(String? value, String fieldName, int minLength) {
  if (value == null || value.isEmpty) {
    return '$fieldName을(를) 입력해주세요';
  }
  if (value.length < minLength) {
    return '$fieldName은(는) 최소 $minLength자 이상이어야 합니다';
  }
  return null;
}

/// 최대 길이 검증
String? validateMaxLength(String? value, String fieldName, int maxLength) {
  if (value == null || value.isEmpty) {
    return null; // 필수 입력 아님
  }
  if (value.length > maxLength) {
    return '$fieldName은(는) 최대 $maxLength자 이하여야 합니다';
  }
  return null;
}

/// 시리얼 넘버 검증 (알파벳, 숫자, 하이픈만 허용)
String? validateSerialNumber(String? value) {
  if (value == null || value.isEmpty) {
    return null; // 필수 입력 아님
  }
  final serialRegex = RegExp(r'^[a-zA-Z0-9\-]+$');
  if (!serialRegex.hasMatch(value)) {
    return '시리얼 번호는 알파벳, 숫자, 하이픈(-)만 입력 가능합니다';
  }
  return null;
}

/// 바코드 검증 (숫자만 허용)
String? validateBarcode(String? value) {
  if (value == null || value.isEmpty) {
    return null; // 필수 입력 아님
  }
  final barcodeRegex = RegExp(r'^[0-9]+$');
  if (!barcodeRegex.hasMatch(value)) {
    return '바코드는 숫자만 입력 가능합니다';
  }
  return null;
}

/// FormValidator: 폼 필드 검증 유틸리티 클래스
class FormValidator {
  /// 필수 입력 검증
  static String? Function(String?) required(String errorMessage) {
    return (String? value) {
      if (value == null || value.trim().isEmpty) {
        return errorMessage;
      }
      return null;
    };
  }

  /// 이메일 형식 검증
  static String? Function(String?) email([String? errorMessage]) {
    return (String? value) {
      if (value == null || value.isEmpty) {
        return null; // 빈 값은 허용
      }
      final bool emailValid = RegExp(
        r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
      ).hasMatch(value);
      if (!emailValid) {
        return errorMessage ?? '유효한 이메일 주소를 입력하세요';
      }
      return null;
    };
  }

  /// 전화번호 형식 검증
  static String? Function(String?) phone([String? errorMessage]) {
    return (String? value) {
      if (value == null || value.isEmpty) {
        return null; // 빈 값은 허용
      }
      final bool phoneValid = RegExp(r'^[0-9\-\s]+$').hasMatch(value);
      if (!phoneValid) {
        return errorMessage ?? '유효한 전화번호를 입력하세요';
      }
      return null;
    };
  }
}
