extractunknown static method

Future<IDCardInfo> extractunknown(
  1. List<String> lines
)

Implementation

static Future<IDCardInfo> extractunknown(List<String> lines) async {
  var idNumber;
  var firstName;
  var lastName;
  var middleName;
  var dob;
  var fullName;

  // GENERIC FALLBACK LOGIC (try to extract what we can)
  // Try to extract DOB
  final dobRegex = RegExp(
    r'(\d{2})[ /-]([A-Z]{3})[ /-](\d{2,4})|(\d{2})[ /-](\d{2})[ /-](\d{2,4})',
  );
  for (final line in lines) {
    final match = dobRegex.firstMatch(line.toUpperCase());
    if (match != null) {
      if (match.group(2) != null) {
        final day = match.group(1);
        final monStr = match.group(2);
        final year = match.group(3);
        final months = {
          'JAN': '01',
          'FEB': '02',
          'MAR': '03',
          'APR': '04',
          'MAY': '05',
          'JUN': '06',
          'JUL': '07',
          'AUG': '08',
          'SEP': '09',
          'OCT': '10',
          'NOV': '11',
          'DEC': '12',
        };
        final mon = months[monStr] ?? monStr;
        dob = '$day-$mon-$year';
      } else if (match.group(4) != null &&
          match.group(5) != null &&
          match.group(6) != null) {
        dob = '${match.group(4)}-${match.group(5)}-${match.group(6)}';
      }
      break;
    }
  }
  // Try to extract ID number (longest digit/letter sequence)
  String idText = lines.join(' ');
  final idMatch = RegExp(
    r'[A-Z0-9]{10,}',
  ).firstMatch(idText.replaceAll(' ', ''));
  if (idMatch != null) {
    idNumber = idMatch.group(0);
  }
  // Try to extract name (first all-uppercase 2-3 word line)
  for (final line in lines) {
    final upper = line.toUpperCase().trim();
    final parts = upper.split(RegExp(r'\s+'));
    if ((parts.length == 2 || parts.length == 3) &&
        RegExp(r'^[A-Z ]+$').hasMatch(upper)) {
      lastName = parts[0].trim();
      if (parts.length > 1) firstName = parts[1].trim();
      if (parts.length > 2) middleName = parts[2].trim();
      fullName = line.trim();
      break;
    }
  }
  return IDCardInfo(
    firstName: firstName,
    lastName: lastName,
    middleName: middleName,
    dateOfBirth: dob,
    idNumber: idNumber,
  );
}