import re
from extractors.base import ExtractResult

def extract_land(text: str) -> ExtractResult:
    trans = str.maketrans('০১২৩৪৫৬৭৮৯', '0123456789')
    text = text.translate(trans)
    lines = [l.strip() for l in text.splitlines() if l.strip()]

    fields = {
        'district': None, 'mouza': None, 'khatian_no': None, 'plot_no': None,
        'owner': None, 'father': None, 'address': None, 'area': None
    }

    for l in lines:
        if not fields['district']:
            m = re.search(r"(?:জেলা|district)[:\-]?\s*(.+)$", l, re.I)
            if m: fields['district'] = m.group(1).strip()
        if not fields['mouza']:
            m = re.search(r"(?:মৌজা|mouza)[:\-]?\s*(.+)$", l, re.I)
            if m: fields['mouza'] = m.group(1).strip()
        if not fields['khatian_no']:
            m = re.search(r"(?:খত(?:ি|িয়)?|khatian|khata)\s*(?:নং|no\.?|no)?[:\-]?\s*([0-9/]+)", l, re.I)
            if m: fields['khatian_no'] = m.group(1).strip()
        if not fields['plot_no']:
            m = re.search(r"(?:দাগ|plot|dag)\s*(?:নং|no\.?|no)?[:\-]?\s*([0-9/\-]+)", l, re.I)
            if m: fields['plot_no'] = m.group(1).strip()
        if not fields['owner']:
            m = re.search(r"(?:নাম|owner|name)[:\-]?\s*(.+)$", l, re.I)
            if m: fields['owner'] = m.group(1).strip()
        if not fields['father']:
            m = re.search(r"(?:পিতা|father|s/o|son of)[:\-]?\s*(.+)$", l, re.I)
            if m: fields['father'] = m.group(1).strip()
        if not fields['address']:
            m = re.search(r"(?:ঠিকানা|address)[:\-]?\s*(.+)$", l, re.I)
            if m: fields['address'] = m.group(1).strip()
        if not fields['area']:
            m = re.search(r"(?:মোট|মোট জমি|area|একর|decimal|sq\.m|sqm)[:\-]?\s*([0-9\.]+)", l, re.I)
            if m: fields['area'] = m.group(1).strip()

    if not fields['owner']:
        for l in lines[:40]:
            m = re.search(r"registered in favour of[:\-]?\s*(.+)$", l, re.I)
            if m:
                fields['owner'] = m.group(1).strip()
                break

    filled = sum(1 for v in fields.values() if v)
    conf = min(0.95, 0.3 + 0.12*filled)
    return ExtractResult('land', fields, conf)
