import argparse
import json
import re
from decimal import Decimal
from pathlib import Path


def amount(value):
    if not isinstance(value, str) or not re.fullmatch(r"\d{1,8}\.\d{2}", value):
        raise ValueError("Use a decimal string with two places; do not infer unreadable amounts")
    return Decimal(value)


def check(data):
    if not isinstance(data, dict) or data.get("currency") != "CNY":
        raise ValueError("Example contract requires currency CNY")
    items = data.get("items")
    if not isinstance(items, list) or not 1 <= len(items) <= 100:
        raise ValueError("Example accepts one to 100 item rows")
    issues = []
    subtotal_sum, tax_sum = Decimal("0.00"), Decimal("0.00")
    for index, item in enumerate(items):
        if not isinstance(item, dict):
            raise ValueError("Each item must be an object")
        subtotal, tax = amount(item.get("subtotal")), amount(item.get("tax"))
        subtotal_sum += subtotal
        tax_sum += tax
        rate = item.get("tax_rate")
        if not isinstance(rate, str) or not re.fullmatch(r"\d{1,2}(?:\.\d{1,2})?%", rate):
            raise ValueError("Use the visible percent text; do not infer a rate")
        numeric_rate = Decimal(rate[:-1]) / Decimal("100")
        if (subtotal * numeric_rate).quantize(Decimal("0.01")) != tax:
            issues.append(f"Row {index + 1}: subtotal × visible rate does not match tax")
    subtotal, tax, total = amount(data.get("subtotal")), amount(data.get("tax")), amount(data.get("total"))
    if subtotal_sum != subtotal:
        issues.append("Sum of item subtotals differs from subtotal")
    if tax_sum != tax:
        issues.append("Sum of item tax differs from tax")
    if subtotal + tax != total:
        issues.append("Subtotal plus tax differs from total")
    return {"arithmetic_ok": not issues, "issues": issues, "subtotal": str(subtotal), "tax": str(tax), "total": str(total), "invoice_authenticity_verified": False, "reimbursement_approved": False}


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("json_file", type=Path)
    args = parser.parse_args()
    if args.json_file.stat().st_size > 256 * 1024:
        raise ValueError("Local example JSON limit: 256 KiB")
    data = json.loads(args.json_file.read_text(encoding="utf-8"))
    print(json.dumps(check(data), ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
