"""Local, fictional merchant checklist; not marketplace policy or an AI run."""
import json
import re

def check_listing(listing: dict) -> dict:
    for field in ("sku", "title", "material", "capacity_ml"):
        if field not in listing:
            raise ValueError(f"Missing field: {field}")
    if not all(isinstance(listing[k], str) for k in ("sku", "title", "material")):
        raise ValueError("sku, title and material must be text")
    if not listing["sku"].strip() or len(listing["title"]) > 200:
        raise ValueError("Invalid SKU or title")
    if type(listing["capacity_ml"]) is not int or listing["capacity_ml"] <= 0:
        raise ValueError("capacity_ml must be a positive integer")
    issues = []
    if not listing["material"].strip():
        issues.append({"field": "material", "reason": "Material is missing",
                       "action": "Ask the supplier; do not invent it"})
    # Demo supports one whole-number ml quantity, not packs, decimals or other units.
    capacities = re.findall(r"(?<![\w.,])(\d+)\s*ml\b", listing["title"], re.IGNORECASE)
    if len(capacities) > 1:
        raise ValueError("Multiple title capacities need manual review")
    if capacities and listing["capacity_ml"] != int(capacities[0]):
        issues.append({"field": "capacity_ml", "reason": f"Title says {capacities[0]} ml but specification differs",
                       "action": "Confirm capacity and update both fields"})
    return {"sku": listing["sku"], "rules_version": "demo-1",
            "issues": issues, "needs_review": bool(issues)}

if __name__ == "__main__":
    print(json.dumps(check_listing({"sku": "CUP-17", "title": "500 ml travel cup",
                                   "material": "", "capacity_ml": 350}), indent=2))
