from __future__ import annotations

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


SCRIPT = Path(__file__).resolve().parents[1] / "scripts" / "audit_manifest_portfolio.py"


def manifest() -> dict:
    return {
        "sequence": "01", "spu_sequence": "01", "sku_sequence": "01",
        "release_code": "SPU01-SKU01", "release_name": "SPU01-SKU01-测试SKU",
        "spu": "营养结算", "sku": "SPU01-SKU01", "name": "测试SKU", "buyer": "购买人",
        "one_liner": "一句话。", "primary_buying_point": "唯一买点。",
        "suitable_for": ["客户A"], "standard_combo": ["PC", "设备"],
        "core_modules": [
            {"name": "一", "points": ["点1"]}, {"name": "二", "points": ["点2"]},
            {"name": "三", "points": ["点3"]}, {"name": "四", "points": ["点4"]},
        ],
        "main_flow": ["步骤1", "步骤2", "步骤3", "步骤4"],
        "customer_values": ["价值1", "价值2", "价值3"],
        "boundaries": ["边界1", "边界2", "边界3"],
        "forbidden_terms": ["密码"], "infographic_focus": "橙黄年轻化。",
        "representative_projects": "项目A", "deployment": "公有云", "entry_points": "PC＋设备",
        "options": "接口选配", "evidence_status": "B-内部产品证据",
    }


class PortfolioAuditTest(unittest.TestCase):
    def test_count_pass_and_mismatch_block(self) -> None:
        with tempfile.TemporaryDirectory() as temporary:
            folder = Path(temporary)
            (folder / "NC-TST.json").write_text(json.dumps(manifest(), ensure_ascii=False), encoding="utf-8")
            passed = subprocess.run(["python3", str(SCRIPT), "--manifests", str(folder), "--expected-count", "1"], text=True, capture_output=True)
            blocked = subprocess.run(["python3", str(SCRIPT), "--manifests", str(folder), "--expected-count", "2"], text=True, capture_output=True)
            self.assertEqual(passed.returncode, 0, passed.stdout + passed.stderr)
            self.assertEqual(json.loads(passed.stdout)["status"], "PASS")
            self.assertEqual(blocked.returncode, 2, blocked.stdout + blocked.stderr)
            self.assertIn("expected 2, found 1", blocked.stdout)


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