import argparse
import json
from pathlib import Path


def read_json(path):
    file_path = Path(path)
    if file_path.stat().st_size > 1024 * 1024:
        raise ValueError("文件不能超过 1 MiB")
    return json.loads(file_path.read_text(encoding="utf-8"))


def check_results(rows, fixture):
    if not isinstance(rows, list) or not isinstance(fixture, list):
        raise ValueError("输入必须为 JSON 数组")
    if not fixture:
        raise ValueError("输入夹具不能为空")
    expected = {item["row_id"]: item for item in fixture}
    if len(expected) != len(fixture):
        raise ValueError("夹具包含重复 row_id")
    seen = set()
    failures = []
    for row in rows:
        if not isinstance(row, dict):
            raise ValueError("每条结果必须为对象")
        row_id = row.get("row_id")
        if not isinstance(row_id, str) or row_id not in expected:
            failures.append("发现未知或无效 row_id")
            continue
        if row_id in seen:
            failures.append(f"{row_id}: 重复行")
            continue
        seen.add(row_id)
        case = expected[row_id]
        if row.get("sku") != case["sku"]:
            failures.append(f"{row_id}: sku 串行")
        if row.get("status") != case["expected_status"]:
            failures.append(f"{row_id}: status 错配或缺失")
    for row_id in sorted(set(expected) - seen):
        failures.append(f"{row_id}: 缺少结果")
    return failures


def main():
    parser = argparse.ArgumentParser(description="按 row_id 离线核对 n8n 三行结果，无 API 请求。")
    parser.add_argument("results")
    parser.add_argument("--fixture", default=str(Path(__file__).with_name("n8n-item-fixture.json")))
    args = parser.parse_args()
    try:
        fixture = read_json(args.fixture)
        failures = check_results(read_json(args.results), fixture)
    except (OSError, ValueError, KeyError, TypeError) as error:
        parser.exit(2, f"无法检查：{error}\n")
    if failures:
        for failure in failures:
            print(failure)
        raise SystemExit(1)
    print(f"{len(fixture)} 行 ID、sku 和 status 检查通过；仍需核对 n8n 实际输入、回路与账单。")


if __name__ == "__main__":
    main()
