import 'package:flutter/services.dart';

/// 한국 전화번호 자동 포맷팅 (010-0000-0000)
class KoreanPhoneFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {
    // 숫자만 추출
    final digitsOnly = newValue.text.replaceAll(RegExp(r'[^\d]'), '');
    
    // 최대 11자리 제한 (010-0000-0000 = 11자리)
    final truncated = digitsOnly.length > 11 
        ? digitsOnly.substring(0, 11) 
        : digitsOnly;
    
    // 포맷팅
    String formatted = '';
    for (int i = 0; i < truncated.length; i++) {
      if ((i == 3 || i == 7) && i < truncated.length) {
        formatted += '-';
      }
      formatted += truncated[i];
    }
    
    // 커서 위치 계산
    int cursorPosition = formatted.length;
    
    // 백스페이스 처리: 하이픈 앞에서 백스페이스를 누르면 하이픈도 함께 삭제
    if (oldValue.text.length > newValue.text.length) {
      if (newValue.selection.baseOffset == 3 || newValue.selection.baseOffset == 8) {
        formatted = formatted.substring(0, formatted.length - 1);
        cursorPosition = formatted.length;
      }
    }
    
    // 입력 중 커서 위치 조정
    if (newValue.selection.baseOffset < newValue.text.length) {
      // 사용자가 중간에 입력하는 경우
      final beforeCursor = newValue.text.substring(0, newValue.selection.baseOffset);
      final digitsBeforeCursor = beforeCursor.replaceAll(RegExp(r'[^\d]'), '').length;
      
      cursorPosition = 0;
      int digitCount = 0;
      for (int i = 0; i < formatted.length; i++) {
        if (formatted[i] != '-') {
          digitCount++;
        }
        cursorPosition++;
        if (digitCount == digitsBeforeCursor) {
          break;
        }
      }
    }
    
    return TextEditingValue(
      text: formatted,
      selection: TextSelection.collapsed(offset: cursorPosition),
    );
  }
}

/// 전화번호 유효성 검증
class PhoneValidator {
  static String? validate(String? value) {
    if (value == null || value.isEmpty) {
      return '전화번호를 입력하세요';
    }
    
    // 하이픈 제거 후 검증
    final digitsOnly = value.replaceAll(RegExp(r'[^\d]'), '');
    
    // 한국 전화번호 패턴
    // 휴대폰: 010, 011, 016, 017, 018, 019
    // 일반전화: 02, 031, 032, 033, 041, 042, 043, 044, 051, 052, 053, 054, 055, 061, 062, 063, 064
    final mobilePattern = RegExp(r'^01[0-9]\d{7,8}$');
    final landlinePattern = RegExp(r'^0(2|3[1-3]|4[1-4]|5[1-5]|6[1-4])\d{7,8}$');
    
    if (!mobilePattern.hasMatch(digitsOnly) && !landlinePattern.hasMatch(digitsOnly)) {
      return '올바른 전화번호 형식이 아닙니다';
    }
    
    return null;
  }
  
  /// 전화번호에서 지역 코드 추출
  static String? extractAreaCode(String phoneNumber) {
    final digitsOnly = phoneNumber.replaceAll(RegExp(r'[^\d]'), '');
    
    // 서울
    if (digitsOnly.startsWith('02')) return '서울';
    // 경기
    if (digitsOnly.startsWith('031')) return '경기';
    // 인천
    if (digitsOnly.startsWith('032')) return '인천';
    // 강원
    if (digitsOnly.startsWith('033')) return '강원';
    // 충남
    if (digitsOnly.startsWith('041')) return '충남';
    // 대전
    if (digitsOnly.startsWith('042')) return '대전';
    // 충북
    if (digitsOnly.startsWith('043')) return '충북';
    // 세종
    if (digitsOnly.startsWith('044')) return '세종';
    // 부산
    if (digitsOnly.startsWith('051')) return '부산';
    // 울산
    if (digitsOnly.startsWith('052')) return '울산';
    // 대구
    if (digitsOnly.startsWith('053')) return '대구';
    // 경북
    if (digitsOnly.startsWith('054')) return '경북';
    // 경남
    if (digitsOnly.startsWith('055')) return '경남';
    // 전남
    if (digitsOnly.startsWith('061')) return '전남';
    // 광주
    if (digitsOnly.startsWith('062')) return '광주';
    // 전북
    if (digitsOnly.startsWith('063')) return '전북';
    // 제주
    if (digitsOnly.startsWith('064')) return '제주';
    // 휴대폰
    if (digitsOnly.startsWith('01')) return '휴대폰';
    
    return null;
  }
}