"""
MRZ line generation for Myanmar passports.
"""
import re

def build_line1(surname, given, dtype="PV", country="MMR"):
    """Build MRZ line 1 (surname + given names)."""
    surname = surname.upper().replace(" ", "<")
    given = given.upper().replace(" ", "<")
    country = country.upper()[:3]
    dtype = dtype.upper()[:2]
    
    # Format: P<MMRSURNAME<<GIVEN<NAMES<<<<<<<<<<<<<<<<<<
    # Total 44 chars
    name_part = f"{surname}<<{given}"
    name_part = name_part.replace(" ", "<")
    
    line = f"{dtype}{country}{name_part}"
    line = line[:44].ljust(44, "<")
    return line


def build_line2(passport_no, dob_yyyymmdd, expiry_yyyymmdd, sex, country="MMR"):
    """Build MRZ line 2 (passport number, dates, sex, etc.)."""
    passport_no = passport_no.upper().replace(" ", "").replace("<", "")[:9]
    country = country.upper()[:3]
    sex = sex.upper()[:1]
    if sex not in ("M", "F"):
        sex = "F"
    
    # Format: PASSPORT_NO<COUNTRY<DOB<SEX<EXPIRY<COUNTRY<<<<<<<<<<<<<<<
    # Example: MK123456<7MMR000206F3011238<<<<<<<<<<<<<<
    
    # Check digit calculation
    def check_digit(s):
        weights = [7, 3, 1]
        total = 0
        for i, ch in enumerate(s):
            if ch.isdigit():
                val = int(ch)
            elif ch == "<":
                val = 0
            else:
                val = ord(ch) - 55
            total += val * weights[i % 3]
        return str(total % 10)
    
    # Passport number + check digit
    pn = passport_no.ljust(9, "<")
    pn_cd = check_digit(pn)
    
    # DOB + check digit
    dob_cd = check_digit(dob_yyyymmdd)
    
    # Expiry + check digit
    exp_cd = check_digit(expiry_yyyymmdd)
    
    # Composite for final check digit
    composite = f"{pn}{pn_cd}{dob_yyyymmdd}{dob_cd}{sex}{expiry_yyyymmdd}{exp_cd}{country}{'<<<<<<<<<'}"
    comp_cd = check_digit(composite)
    
    line2 = f"{pn}{pn_cd}{dob_yyyymmdd}{dob_cd}{sex}{expiry_yyyymmdd}{exp_cd}{country}<<<<<<<<<{comp_cd}"
    line2 = line2[:44].ljust(44, "<")
    return line2