#!/usr/bin/env python3
"""Inventory image assets without changing or deleting them."""

from __future__ import annotations

import csv
import hashlib
import struct
from pathlib import Path


ROOT = Path(__file__).resolve().parents[1]
OUTPUT = ROOT / "data" / "concept-asset-inventory.csv"


def png_size(path: Path) -> tuple[int | str, int | str]:
    data = path.read_bytes()[:24]
    if data.startswith(b"\x89PNG\r\n\x1a\n") and len(data) >= 24:
        return struct.unpack(">II", data[16:24])
    return "", ""


def sha256(path: Path) -> str:
    digest = hashlib.sha256()
    with path.open("rb") as handle:
        for block in iter(lambda: handle.read(1024 * 1024), b""):
            digest.update(block)
    return digest.hexdigest()


def main() -> None:
    source = ROOT / "assets" / "drafts" / "concept-v1"
    rows = []
    for path in sorted(source.glob("*")):
        if not path.is_file():
            continue
        width, height = png_size(path)
        rows.append(
            {
                "文件名": path.name,
                "相对路径": path.relative_to(ROOT).as_posix(),
                "字节数": path.stat().st_size,
                "宽": width,
                "高": height,
                "SHA256": sha256(path),
                "状态": "概念资产-永久保留",
                "可作正式现场证据": "否",
                "用途": "审美参考/提示词复盘/售前概念/失败经验",
            }
        )
    OUTPUT.parent.mkdir(parents=True, exist_ok=True)
    with OUTPUT.open("w", encoding="utf-8-sig", newline="") as handle:
        writer = csv.DictWriter(handle, fieldnames=list(rows[0]) if rows else [])
        if rows:
            writer.writeheader()
            writer.writerows(rows)
    print(f"inventoried={len(rows)} output={OUTPUT}")


if __name__ == "__main__":
    main()
