#!/usr/bin/env python3
# 純本機錨點格式對帳；不連網、不改寫帳本，也不宣稱已重算來源內容。
# 2026-09-20 實跑：python3 build-cx/verify/verify_anchors.py（exit 0）
# stdout 摘要：總筆數：44；SHA-256 格式正確：44；SHA-256 格式錯誤：0；
# Wayback 未提供：2；非物件記錄：0。
# 帳本檔案 SHA-256：6b04619f9f92230765efa422dd3deae8bc7250a9c0450ee3d817d2766507e429
# 以上僅為本機格式對帳結果；來源下載、內容重算、Wayback 存取尚未測試。
"""Print record[].source_url / wayback / sha256 and check digest syntax."""

import argparse
import json
from pathlib import Path
import re
import sys


DEFAULT_LEDGER = Path(__file__).resolve().parents[2] / "dist/ida-tk-lin/anchors.json"
SHA256_PATTERN = re.compile(r"[0-9a-fA-F]{64}")


def display(value):
    """Keep unexpected values visible without allowing multiline table entries."""
    if value is None or value == "":
        return "（空白／未提供）"
    if isinstance(value, str):
        return value.replace("\r", r"\r").replace("\n", r"\n").replace("\t", r"\t")
    return json.dumps(value, ensure_ascii=False)


def main(argv=None):
    parser = argparse.ArgumentParser(description="本機錨點對帳：列出 URL 與 SHA-256，僅檢查指紋格式。")
    parser.add_argument("ledger", nargs="?", type=Path, default=DEFAULT_LEDGER,
                        help="帳本路徑；預設為專案 dist/ida-tk-lin/anchors.json")
    args = parser.parse_args(argv)
    try:
        data = json.loads(args.ledger.read_text(encoding="utf-8"))
        if not isinstance(data, dict) or not isinstance(data.get("record"), list):
            raise ValueError("帳本必須含有 record 陣列")
        records = data["record"]
        if not records:
            raise ValueError("record 陣列為空，沒有可對帳資料")
    except (OSError, UnicodeError, ValueError) as exc:
        print(f"讀取失敗：{exc}", file=sys.stderr)
        return 2

    print("錨點本機對帳表（僅檢查 SHA-256 格式）")
    print(f"帳本：{args.ledger.resolve()}")
    print("欄位：record[].source_url / wayback / sha256")
    valid_count = 0
    blank_wayback_count = 0
    malformed_record_count = 0
    for index, record in enumerate(records, 1):
        print("-" * 72)
        print(f"錨點 #{index:02d}")
        if not isinstance(record, dict):
            malformed_record_count += 1
            print("資料結構：錯誤（此筆不是 JSON 物件）")
            record = {}
        digest = record.get("sha256")
        valid = isinstance(digest, str) and SHA256_PATTERN.fullmatch(digest) is not None
        valid_count += int(valid)
        blank_wayback_count += int(record.get("wayback") in (None, ""))
        print(f"來源 URL    | {display(record.get('source_url'))}")
        print(f"Wayback URL | {display(record.get('wayback'))}")
        print(f"sha256      | {display(digest)}")
        print(f"指紋格式    | {'正確' if valid else '錯誤'}")

    print("=" * 72)
    print(f"總筆數：{len(records)}")
    print(f"SHA-256 格式正確：{valid_count}")
    print(f"SHA-256 格式錯誤：{len(records) - valid_count}")
    print(f"Wayback 未提供：{blank_wayback_count}")
    print(f"非物件記錄：{malformed_record_count}")
    print("驗證範圍：僅本機欄位列印與 64 位十六進位格式檢查。")
    print("未執行：來源下載、內容指紋重算、Wayback 可用性與內容真實性查核。")
    return 0 if valid_count == len(records) else 1


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