"""Reads a returned deck: slide count, titles, all text, notes per slide, and checks the 24 memo facts. Usage: python3.13 check_deck.py returned/<tool>.pptx"""
import sys, re
from pptx import Presentation
FACTS = {"120 orders":["120 orders","120 order"], "20 customers":["20 customers","20 custom"], "avg 28.30":["28.30","28,30"],
 "April 1,538.60":["1,538.60","1538.60","1 538.60","1538.6"], "May 847.40":["847.40","847,40","847.4"], "June 1,009.50":["1,009.50","1009.50","1 009.50","1009.5"], "total 3,395.50":["3,395.50","3395.50","3 395.50"],
 "Home 1,399.00":["1,399.00","1399.00","1,399","1 399","1399.0"], "Pantry 1,109.70":["1,109.70","1109.70","1 109.70","1109.7"], "Drinks 886.80":["886.80","886,80","886.8"],
 "Vinho Verde 42":[r"vinho verde[^\n]{0,20}\b42\b", r"\b42\b[^\n]{0,20}vinho verde"], "Ceramic Bowl 40":[r"ceramic bowl[^\n]{0,20}\b40\b", r"\b40\b[^\n]{0,20}ceramic bowl"], "Ginjinha 38":[r"ginjinha[^\n]{0,20}\b38\b", r"\b38\b[^\n]{0,20}ginjinha"],
 "Braga 31":[r"braga[^\n]{0,12}\b31\b", r"\b31\b[^\n]{0,12}braga"], "Lisboa 29":[r"lisboa[^\n]{0,12}\b29\b", r"\b29\b[^\n]{0,12}lisboa"], "Coimbra 24":[r"coimbra[^\n]{0,12}\b24\b", r"\b24\b[^\n]{0,12}coimbra"], "Algarve 21":[r"algarve[^\n]{0,12}\b21\b", r"\b21\b[^\n]{0,12}algarve"], "Porto 13":[r"porto[^\n]{0,12}\b13\b", r"\b13\b[^\n]{0,12}porto"],
 "Lisboa 947.90":["947.90","947,90"], "Braga 790.50":["790.50","790,50"],
 "4 duplicates":[r"\b4\b[^\n]{0,15}duplicate", r"four duplicate"], "5 mismatches":[r"\b5\b[^\n]{0,15}(order|total|mismatch)", r"five (order|mismatch)"],
 "action 1 date format":["date format"], "action 2 bundle":["bundle"], "action 3 reorder bowls":[r"reorder[^\n]{0,20}bowl", r"bowl[^\n]{0,30}before august"]}
prs = Presentation(sys.argv[1])
print("slides:", len(prs.slides))
alltext=[]; notes=0
for i, s in enumerate(prs.slides, 1):
    texts=[]
    for sh in s.shapes:
        if sh.has_text_frame: texts.append(sh.text_frame.text)
        if getattr(sh, "has_table", False) and sh.has_table:
            for r in sh.table.rows: texts.append(" | ".join(c.text for c in r.cells))
        if getattr(sh, "has_chart", False) and sh.has_chart:
            ch=sh.chart
            try:
                cats=list(ch.plots[0].categories); vals=list(ch.plots[0].series[0].values)
                texts.append("CHART " + ", ".join(f"{c} {v}" for c,v in zip(cats,vals)))
            except Exception as e: texts.append(f"CHART ({e})")
    n = s.notes_slide.notes_text_frame.text.strip() if s.has_notes_slide else ""
    if n: notes+=1
    title = texts[0].split("\n")[0][:60] if texts else ""
    print(f"--- slide {i}: {title!r} | notes: {len(n)} chars")
    alltext.append("\n".join(texts)+"\nNOTES: "+n)
blob="\n".join(alltext).lower()
hit=[]; miss=[]
for k,pats in FACTS.items():
    ok=any((re.search(p.lower(), blob) if any(ch in p for ch in "\\[(") else p.lower() in blob) for p in pats)
    (hit if ok else miss).append(k)
print(f"\nfacts on slides+notes: {len(hit)} of {len(FACTS)} | missing: {miss}")
print("notes on", notes, "of", len(prs.slides), "slides")
if "--dump" in sys.argv:
    for i,t in enumerate(alltext,1): print(f"\n===== SLIDE {i} =====\n{t}")
