"""Demonstration: convert a messy weekly CSV export into a readable quality report.

Uses fictional records only. Never send a customer's data to an unapproved service.
Run: python csv-cleanup-demo.py sample-orders.csv demo-output
"""
import csv
import sys
from pathlib import Path

COLUMNS = ("order_id", "customer_name", "email", "total_cents")

def clean_csv(source: Path, directory: Path) -> tuple[int, int]:
    accepted = []
    rejected = []
    seen = set()
    with source.open(newline="", encoding="utf-8-sig") as handle:
        reader = csv.DictReader(handle)
        if not reader.fieldnames or not set(COLUMNS).issubset(reader.fieldnames):
            raise ValueError(f"Expected columns: {', '.join(COLUMNS)}")
        for line_number, original in enumerate(reader, start=2):
            row = {key: (original.get(key) or "").strip() for key in COLUMNS}
            row["email"] = row["email"].lower()
            reason = ""
            try:
                amount = int(row["total_cents"])
            except ValueError:
                amount = -1
            if not row["order_id"] or row["order_id"] in seen:
                reason = "missing or duplicate order ID"
            elif not row["customer_name"] or "@" not in row["email"] or row["email"].startswith("@"):
                reason = "missing customer or invalid email"
            elif amount < 0:
                reason = "missing or negative integer amount"
            if reason:
                rejected.append({**row, "source_line": str(line_number), "reason": reason})
                continue
            seen.add(row["order_id"])
            row["total_cents"] = str(amount)
            accepted.append(row)

    directory.mkdir(parents=True, exist_ok=True)
    for filename, fields, rows in (
        ("accepted.csv", COLUMNS, accepted),
        ("review.csv", (*COLUMNS, "source_line", "reason"), rejected),
    ):
        with (directory / filename).open("w", newline="", encoding="utf-8") as handle:
            writer = csv.DictWriter(handle, fieldnames=fields)
            writer.writeheader()
            writer.writerows(rows)
    return len(accepted), len(rejected)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        raise SystemExit("Usage: python csv-cleanup-demo.py input.csv output-directory")
    ok, needs_review = clean_csv(Path(sys.argv[1]), Path(sys.argv[2]))
    print(f"Accepted: {ok}; needs review: {needs_review}")

