"""结果驱动视频级切分的冻结溯源 manifest。

冻结的 pools.json 是切分产物；manifest 记录产出这份切分的关键输入
（baseline_run_id、诊断指纹、随机种子、配置）与 pools.json 的内容指纹
（pools_sha256），供后续 build_split 写溯源、以及复现校验时比对。
"""

from __future__ import annotations

import hashlib
from typing import TYPE_CHECKING

from app.harness.pools import _atomic_write_json

if TYPE_CHECKING:
    from pathlib import Path


def write_manifest(
    path: Path,
    *,
    baseline_run_id: str,
    diag_fingerprint: str,
    seed: int,
    config: dict,
    pools_json_text: str,
    coverage_report: dict,
    generated_at: str,
) -> dict:
    """写切分冻结溯源 manifest（原子写），返回写入的 dict。

    pools_sha256 = sha256(pools_json_text)，供复现时校验冻结的 pools.json 内容
    是否与本次切分一致。generated_at 由调用方传入（库内不用 datetime.now），
    以保证相同输入产出相同 manifest，可复现。

    参数:
        path: manifest 目标 JSON 文件路径。
        baseline_run_id: 产出本次切分所依据的基线 run 标识。
        diag_fingerprint: 诊断结果指纹（决定 train/val 归属的输入）。
        seed: 切分使用的随机种子。
        config: 切分相关配置快照（如 train_ratio 等）。
        pools_json_text: 冻结的 pools.json 完整文本，用于计算内容指纹。
        coverage_report: 各类别 train/val 覆盖统计报告。
        generated_at: 生成时间戳（ISO 字符串），由调用方传入。

    返回:
        写入 manifest 的 dict（与落盘内容一致）。
    """
    manifest = {
        "baseline_run_id": baseline_run_id,
        "diag_fingerprint": diag_fingerprint,
        "seed": seed,
        "config": config,
        "pools_sha256": hashlib.sha256(pools_json_text.encode("utf-8")).hexdigest(),
        "coverage_report": coverage_report,
        "generated_at": generated_at,
    }
    _atomic_write_json(path, manifest)
    return manifest
