"""验证结构化报告；权威输入由可信控制器读取，不从报告反推。

这里的规则仅覆盖教学订单和 P7-v2 政策，不是现实商家售后判断系统。
所有返回值可序列化，便于保存和作为模型修复反馈。
"""
from contracts import REPORT_FIELDS

def verify(report, source):
    errors = []
    def fail(check, expected, actual):
        # 保存明确的预期/实际差异，避免只有“请重试”的模糊反馈。
        errors.append({"check": check, "expected": expected, "actual": actual})
    if type(report) is not dict:
        return {"passed": False, "errors": [{"check": "object_required"}]}
    if set(report) != REPORT_FIELDS:
        fail("exact_fields", sorted(REPORT_FIELDS), sorted(report))
        return {"passed": False, "errors": errors}
    types = {
        "order_id": str, "status": str, "days_since_delivery": int,
        "quality_verified": bool, "policy_id": str, "freight_decision": str,
    }
    for field, expected_type in types.items():
        # bool 是 int 的子类；精确类型检查防止 True 被当成签收天数 1。
        if type(report[field]) is not expected_type:
            fail(field + "_type", expected_type.__name__, type(report[field]).__name__)
    if errors:
        return {"passed": False, "errors": errors}
    order = source["order"]
    for field in ("order_id", "status", "days_since_delivery", "quality_verified"):
        if report[field] != order[field]:
            fail(field + "_matches_source", order[field], report[field])
    if report["policy_id"] != source["policy"]["policy_id"]:
        fail("policy_matches_source", source["policy"]["policy_id"], report["policy_id"])
    # 未核验时保留未知，不推断客户没有质量问题，也不提前判定商家承担。
    decision = "merchant" if order["quality_verified"] else "pending_verification"
    if report["freight_decision"] != decision:
        fail("decision_matches_evidence", decision, report["freight_decision"])
    return {"passed": not errors, "errors": errors}
