import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;

/// 문자열 유틸리티 함수들
/// 원본 Main.pas의 문자열 처리 함수들을 포팅

/// 단어를 복수형으로 변환 (영문)
String pluralize(String s) {
  if (_ends(s, 'y')) return '${s.substring(0, s.length - 1)}ies';
  if (_ends(s, 'us')) return '${s.substring(0, s.length - 2)}i';
  if (_ends(s, 'ch') || _ends(s, 'x') || _ends(s, 's')) return '${s}es';
  if (_ends(s, 'f')) return '${s.substring(0, s.length - 1)}ves';
  if (_ends(s, 'man') || _ends(s, 'Man')) {
    return '${s.substring(0, s.length - 2)}en';
  }
  return '${s}s';
}

/// 부정관사 + 명사 (a/an + 단수 또는 수량 + 복수)
String indefinite(String s, int qty) {
  if (qty == 1) {
    const vowels = 'AEIOUÜaeiouü';
    final first = s.isNotEmpty ? s[0] : 'a';
    final article = vowels.contains(first) ? 'an' : 'a';
    return '$article $s';
  }
  return '$qty ${pluralize(s)}';
}

/// 정관사 + 명사 (the + 명사)
String definite(String s, int qty) {
  if (qty > 1) {
    s = pluralize(s);
  }
  return 'the $s';
}

/// 초 단위 시간을 사람이 읽기 쉬운 형태로 변환 (원본 Main.pas:1265-1271)
/// l10n 지원
String roughTime(int seconds) {
  if (seconds < 120) {
    return l10n.roughTimeSeconds(seconds);
  } else if (seconds < 60 * 120) {
    return l10n.roughTimeMinutes(seconds ~/ 60);
  } else if (seconds < 60 * 60 * 48) {
    return l10n.roughTimeHours(seconds ~/ 3600);
  } else {
    return l10n.roughTimeDays(seconds ~/ (3600 * 24));
  }
}

/// 문자열이 특정 접미사로 끝나는지 확인
bool _ends(String s, String suffix) {
  return s.length >= suffix.length &&
      s.substring(s.length - suffix.length) == suffix;
}
