#!/usr/bin/env python3
from __future__ import annotations

import importlib.util
import tempfile
import unittest
from pathlib import Path


SCRIPT = Path(__file__).resolve().parents[1] / "tools/build_deliverables.py"
SPEC = importlib.util.spec_from_file_location("build_deliverables", SCRIPT)
MODULE = importlib.util.module_from_spec(SPEC)
assert SPEC and SPEC.loader
SPEC.loader.exec_module(MODULE)


class DeliverableTest(unittest.TestCase):
    def test_build_contract(self) -> None:
        with tempfile.TemporaryDirectory() as tmp:
            result = MODULE.build_all(Path(tmp), user_copy=None)
            data = result["data"]
            self.assertEqual(30, len(data["projects"]))
            self.assertEqual(30, len({r["项目单元ID"] for r in data["projects"]}))
            self.assertEqual(20, len(data["skus"]))
            self.assertEqual(20, len({r["SKU编码"] for r in data["skus"]}))
            self.assertEqual(20, len({r["SKU唯一规格键"] for r in data["skus"]}))
            self.assertNotIn("P024", {r["项目单元ID"] for r in data["projects"]})
            self.assertTrue({"P024-A", "P024-B", "P024-C"}.issubset({r["项目单元ID"] for r in data["projects"]}))
            self.assertTrue(result["validation"]["passed"])
            self.assertFalse(any(r["当前复刻等级"].startswith("R3") for r in data["skus"]))

    def test_every_project_is_mapped(self) -> None:
        projects = MODULE.base_projects()
        mapped = set(MODULE.PROJECT_SKU_MAP)
        self.assertEqual({r["项目单元ID"] for r in projects}, mapped)

    def test_every_sku_has_real_project_anchor(self) -> None:
        project_ids = {r["项目单元ID"] for r in MODULE.base_projects()}
        for sku in MODULE.SKU_ROWS:
            anchors = set(sku["母项目ID"].split("/"))
            self.assertTrue(anchors.intersection(project_ids), sku["SKU编码"])


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