"""Lesson 6: regular expressions - parse UPI narrations and validate GSTIN and PAN."""
import re
from pathlib import Path
HERE = Path(__file__).resolve().parent
UPI = re.compile(r"^UPI/(?P<dir>DR|CR)/(?P<ref>\d{12})/(?P<payee>[^/]+)/(?P<bank>[A-Z]{4})/(?P<vpa>[^/]+)/(?P<note>.*)$")
for line in (HERE / "statement.txt").read_text(encoding="utf-8").splitlines():
    m = UPI.match(line)
    if m:
        kind = "phone-number UPI ID" if m["vpa"].split("@")[0].isdigit() else "named UPI ID"
        print(f"{m['dir']} {m['payee']:<14} {m['vpa']:<18} ref {m['ref']} ({kind})")
    else:
        print("not UPI:", line[:40])

GSTIN = re.compile(r"^\d{2}[A-Z]{5}\d{4}[A-Z][1-9A-Z]Z[0-9A-Z]$")
PAN = re.compile(r"^[A-Z]{5}\d{4}[A-Z]$")
for g in ["27ABCDE1234F1Z5", "27abcde1234f1z5", "27ABCDE1234F1X5"]:
    print(g, "valid GSTIN" if GSTIN.match(g) else "invalid")
print("PAN inside GSTIN:", GSTIN.match("27ABCDE1234F1Z5") and "27ABCDE1234F1Z5"[2:12], bool(PAN.match("ABCDE1234F")))
print("Digits only:", re.sub(r"\D", "", "+91-98765 43210"))
