extractVoter static method

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

Implementation

static Future<IDCardInfo> extractVoter(List<String> lines) async {
  String? idNumber;
  String? firstName;
  String? lastName;
  String? middleName;
  String? dob;
  String? fullName;
  String? extractedDetails;

  // VOTER'S CARD LOGIC
  for (final line in lines) {
    if (extractedDetails == null){
      extractedDetails = line;
    }else{
      extractedDetails += " ***videx*** $line";
    }
  }

  // ID Number (VIN)
  for (final line in lines) {
    final upper = line.toUpperCase();
    if (upper.contains('VIN')) {
      final vinMatch = RegExp(r'VIN\s*([A-Z0-9 ]+)').firstMatch(upper);
      if (vinMatch != null) {
        final vinNumber = vinMatch
            .group(1)!
            .replaceAll(RegExp(r'[^A-Z0-9]'), '');
        if (vinNumber.length >= 16) {
          idNumber = vinNumber;
          break;
        }
      }
    }
  }
  // Name
  const nonNameKeywords = ['DELIM', 'STATE', 'LGA', 'OSUN', 'IREWOLE'];
  for (final line in lines) {
    final upper = line.toUpperCase().trim();
    final parts = upper.split(RegExp(r'\s+'));
    if (parts.length == 3 &&
        RegExp(r'^[A-Z ]+$').hasMatch(upper) &&
        !nonNameKeywords.any((kw) => upper.contains(kw)) &&
        !upper.contains('OCCUPATION')) {
      lastName = parts[0].trim();
      firstName = parts[1].trim();
      middleName = parts[2].trim();
      fullName = line.trim();
      break;
    }
  }

  // DOB
  for (final line in lines) {
    if (line.toUpperCase().contains('DATE OF BIRTH')) {
      String dobLine = line;
      int idx = lines.indexOf(line);
      if (!RegExp(r'\d').hasMatch(dobLine) && idx + 1 < lines.length) {
        dobLine = lines[idx + 1];
      }

      final dobRegex = RegExp(
        r'(\d{2})[ /-]([A-Z]{3}|\d{2})[ /-](\d{2,4})',
        caseSensitive: false,
      );
      final match = dobRegex.firstMatch(dobLine.toUpperCase());
      if (match != null) {
        String day = match.group(1)!;
        String month = match.group(2)!;
        String 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',
        };
        if (months.containsKey(month)) {
          month = months[month]!;
        }
        dob = '$day-$month-$year';
        break;
      }
    } else if (RegExp(r'\d{2}[-/]\d{2}[-/]\d{4}').hasMatch(line.trim())) {
      dob = RegExp(r'\d{2}[-/]\d{2}[-/]\d{4}').firstMatch(line.trim())!.group(0);
      break;
    }
  }

  // Return the final data - with the constructor fixed
  return IDCardInfo(
    firstName: firstName,
    lastName: lastName,
    middleName: middleName,
    dateOfBirth: dob,
    idNumber: idNumber,
    extracteddetails: extractedDetails,
  );
}