File size: 1,368 Bytes
efd7cfc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"""Parse Vietnamese address strings into components."""

from .models import AdminUnit
from .normalizer import expand_abbreviations

# Ward-level prefixes
WARD_PREFIXES = ("phường", "xã", "thị trấn")


def parse_address(address: str) -> AdminUnit:
    """
    Parse Vietnamese address string into AdminUnit components.

    Expected format: "street, ward, district, province"
    Parsing is right-to-left (province is rightmost).
    """
    # Expand abbreviations first
    expanded = expand_abbreviations(address)

    # Split by comma
    parts = [p.strip() for p in expanded.split(",") if p.strip()]

    if not parts:
        return AdminUnit()

    unit = AdminUnit()

    # Right-to-left assignment
    if len(parts) >= 1:
        unit.province = parts[-1].strip()
    if len(parts) >= 2:
        unit.district = parts[-2].strip()
    if len(parts) >= 3:
        unit.ward = parts[-3].strip()
    if len(parts) >= 4:
        # Everything before ward is street
        unit.street = ", ".join(parts[:-3]).strip()

    # Handle 2-part addresses: could be "ward, province" or "district, province"
    if len(parts) == 2:
        lower = parts[0].lower().strip()
        for prefix in WARD_PREFIXES:
            if lower.startswith(prefix):
                unit.ward = unit.district
                unit.district = ""
                break

    return unit