"""Check a small UTF-8 CSV locally. No model, network, or input modification.

Expected columns: sales_id,amount_yen. Amounts must be nonnegative integer yen.
Refunds are outside this example's input contract.
Exit 0: checks passed; 1: data issues; 2: unreadable/invalid CSV or CLI usage.
"""
import argparse
import csv
import hashlib
import io
import json
import re
import sys
from collections import Counter
from datetime import datetime, timezone
from pathlib import Path

MAX_BYTES = 5_000_000


def check(path):
    with Path(path).open("rb") as source:
        data = source.read(MAX_BYTES + 1)
    if len(data) > MAX_BYTES:
        raise ValueError("input too large")
    reader = csv.DictReader(io.StringIO(data.decode("utf-8-sig")), strict=True)
    if reader.fieldnames != ["sales_id", "amount_yen"]:
        raise ValueError("expected columns: sales_id,amount_yen")
    issues = []
    seen = set()
    rows = 0
    amount_sum = 0
    for row_number, row in enumerate(reader, start=2):
        rows += 1
        if None in row or any(value is None for value in row.values()):
            issues.append({"row": row_number, "code": "COLUMN_COUNT"})
            continue
        sales_id = row["sales_id"].strip()
        if not sales_id:
            issues.append({"row": row_number, "code": "MISSING_ID"})
        elif sales_id in seen:
            issues.append({"row": row_number, "code": "DUPLICATE_ID"})
        seen.add(sales_id)
        amount = row["amount_yen"].strip()
        if not re.fullmatch(r"[0-9]{1,12}", amount):
            issues.append({"row": row_number, "code": "INVALID_AMOUNT"})
        else:
            amount_sum += int(amount)
    if rows == 0:
        issues.append({"row": None, "code": "EMPTY_DATA"})
    return {
        "checked_at": datetime.now(timezone.utc).isoformat(),
        "source_sha256": hashlib.sha256(data).hexdigest(),
        "rules_version": "sales-v1",
        "rows": rows,
        "status": "needs_review" if issues else "passed",
        "issue_counts": dict(Counter(issue["code"] for issue in issues)),
        "issues": issues,
        # Do not publish a plausible-looking sales total from invalid input.
        "total_yen": None if issues else amount_sum,
        "external_actions": [],
    }


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("csv_path")
    args = parser.parse_args()
    try:
        report = check(args.csv_path)
    except (OSError, UnicodeError, csv.Error, ValueError):
        print(json.dumps({"status": "input_error", "message": "CSVを読み込めないか形式が不正です。"},
                         ensure_ascii=False))
        return 2
    print(json.dumps(report, ensure_ascii=False, indent=2))
    return 1 if report["status"] == "needs_review" else 0


if __name__ == "__main__":
    sys.exit(main())
