from __future__ import annotations

import json
import struct
import subprocess
import tempfile
import unittest
from pathlib import Path


REPO_ROOT = Path(__file__).resolve().parents[5]
DUAL_BUILDER = REPO_ROOT / "standards-stack/agent-skills/skills/smart-canteen-sku-dual-xmind/scripts/build_dual_xmind.py"
SOURCE_BUILDER = REPO_ROOT / "standards-stack/agent-skills/skills/smart-canteen-sku-notebooklm-infographic/scripts/build_notebook_sources.py"
RELEASE_GATE = REPO_ROOT / "standards-stack/agent-skills/skills/smart-canteen-sku-release-gate/scripts/validate_sku_release.py"


def sample_manifest() -> dict:
    return {
        "sequence": "01",
        "spu_sequence": "01",
        "sku_sequence": "01",
        "release_code": "SPU01-SKU01",
        "release_name": "SPU01-SKU01-测试SKU",
        "sku": "SPU01-SKU01",
        "name": "测试SKU",
        "buyer": "测试购买人",
        "one_liner": "一句话产品。",
        "primary_buying_point": "一个购买理由。",
        "suitable_for": ["客户A", "客户B"],
        "standard_combo": ["PC端", "设备端"],
        "core_modules": [
            {"name": "人员", "points": ["建档", "绑定"]},
            {"name": "账户", "points": ["充值", "补贴"]},
            {"name": "消费", "points": ["刷卡", "订单"]},
            {"name": "统计对账", "points": ["统计", "对账"]},
        ],
        "main_flow": ["建档绑卡", "充值补贴", "刷卡消费", "统计对账"],
        "customer_values": ["简单", "快速", "清楚"],
        "boundaries": ["边界A", "边界B", "边界C"],
        "forbidden_terms": ["退款", "密码", "APK"],
        "infographic_focus": "橙黄年轻化。",
    }


def write_png(path: Path, width: int = 1600, height: int = 900) -> None:
    path.write_bytes(b"\x89PNG\r\n\x1a\n" + b"\x00\x00\x00\rIHDR" + struct.pack(">II", width, height))


class SkuToolsTest(unittest.TestCase):
    def test_builders_and_release_gate_share_one_flow(self) -> None:
        with tempfile.TemporaryDirectory() as temporary:
            root = Path(temporary)
            package = root / "package"
            final_dir = package / "01-最终呈现/SPU01-SKU01-测试SKU"
            source_dir = package / "02-NotebookLM资料/SPU01-SKU01-测试SKU"
            history_dir = package / "03-历史版本"
            final_dir.mkdir(parents=True)
            source_dir.mkdir(parents=True)
            history_dir.mkdir(parents=True)
            manifest_dir = root / "manifests"
            manifest_dir.mkdir()
            manifest = manifest_dir / "NC-TST.json"
            manifest.write_text(json.dumps(sample_manifest(), ensure_ascii=False), encoding="utf-8")

            subprocess.run(["python3", str(DUAL_BUILDER), "--manifest", str(manifest), "--output-dir", str(final_dir)], check=True)
            subprocess.run(["python3", str(SOURCE_BUILDER), "--manifest", str(manifest), "--output-dir", str(source_dir)], check=True)
            write_png(final_dir / "SPU01-SKU01-主流程图.png")
            result = subprocess.run([
                "python3", str(RELEASE_GATE), "--root", str(package), "--manifests", str(manifest_dir)
            ], check=False, text=True, capture_output=True)
            self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
            report = json.loads(result.stdout)
            self.assertEqual(report["status"], "PASS")
            self.assertEqual(len(list(source_dir.glob("0[1-3]-*.md"))), 3)


if __name__ == "__main__":
    unittest.main()
