"""Build a versioned release while preserving the previous deliverables."""

import hashlib
import json

import analyze_private
import build_dashboard
from release_config import ROOT, OUTPUT, EVIDENCE, VERSION, prepare


def digest(path):
    return hashlib.sha256(path.read_bytes()).hexdigest()


def main():
    prepare()
    (EVIDENCE / "playwright").mkdir(exist_ok=True)
    previous_files = [
        p for p in ROOT.glob("饮水用具*")
        if p.is_file() and p.suffix in (".csv", ".html", ".md")
    ]
    previous = {p.name: digest(p) for p in previous_files}
    analyze_private.main()
    build_dashboard.main()
    assert previous == {p.name: digest(p) for p in previous_files}
    a = json.loads((EVIDENCE / "analysis.json").read_text(encoding="utf-8"))
    selected = a["plan"]
    manifest = {
        "version": VERSION, "date": "2026-09-21", "capacity": 122,
        "scope": "饮水用具", "snapshot": a["snapshot"],
        "factSource": a["sourceFile"], "factSha256": digest(ROOT / a["sourceFile"]),
        "previousVersion": "V1.0", "previousDeliverableHashes": previous,
        "deliveryHashes": {p.name: digest(p) for p in OUTPUT.iterdir() if p.is_file()},
    }
    (EVIDENCE / "版本清单.json").write_text(
        json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8")
    lines = [
        f"# 饮水用具品类规划 {VERSION}", "",
        "规划期：2026年9月至2027年2月。规划容量：122个SPU。",
        "在售基线：2026年9月21日08:00:01。销售窗口：2025年9月1日至2026年8月31日。",
        "", f"规划结果：保留{selected['kept']}个现架SPU，恢复引入{selected['historicalGroups']}个商品，合计122个规划位。",
        "", "## 主要文件", "",
        "- [行业情报看板](饮水用具行业情报看板.html)",
        "- [完整经营诊断与规划](饮水用具全年经营与品类规划.md)",
    ]
    lines += [f"- [{x['file']}]({x['file']})" for x in a["exports"].values()]
    lines += [
        "", "## 执行口径", "",
        a["plan"]["identityRule"], "", a["plan"]["skuRule"], "", a["plan"]["evidenceRule"],
        "", "历史恢复商品按清单完成主档归并与可售状态核验后执行。当前在售规格表提供快照商品状态与频道信息。",
        "", "## 版本与来源", "",
        "本目录为V2.0。上一版交付文件保留在工作区原位置；版本清单记录来源与上一版文件哈希。",
        "数据与校验目录保存计算数据、来源快照、核对结果与浏览器验收截图。",
        "看板采用离线HTML，原始资料与证据页链接指向工作区已有文件。",
    ]
    (OUTPUT / "交付说明.md").write_text("\n".join(lines) + "\n", encoding="utf-8")
    print(json.dumps({"version": VERSION, "output": str(OUTPUT), "plan": selected}, ensure_ascii=False))


if __name__ == "__main__":
    main()

