from __future__ import annotations

import importlib.util
import json
import re
import unittest
from pathlib import Path


REPO_ROOT = Path(__file__).resolve().parents[1]
KIT_ROOT = REPO_ROOT / "product-pages"
TEMPLATE_PATH = KIT_ROOT / "templates" / "product_detail_template.html"
FIXTURE_PATH = KIT_ROOT / "fixtures" / "71v416l10beg.json"
RENDERER_PATH = KIT_ROOT / "preview" / "render_preview.py"


def _load_renderer():
    spec = importlib.util.spec_from_file_location("product_page_preview", RENDERER_PATH)
    if spec is None or spec.loader is None:
        raise RuntimeError("unable to load preview renderer")
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module


class ProductPageTemplateKitTests(unittest.TestCase):
    def setUp(self) -> None:
        self.template = TEMPLATE_PATH.read_text(encoding="utf-8")
        self.fixture = json.loads(FIXTURE_PATH.read_text(encoding="utf-8"))
        self.renderer = _load_renderer()

    def test_template_keeps_required_rendering_contract(self) -> None:
        required = {
            "__BASE_URL__",
            "__SLUG__",
            "__PAGE_TITLE__",
            "__META_DESC__",
            "__JSON_LD__",
            "__SKU__",
            "__MFR__",
            "__DESC__",
            "__SPEC_TABLE__",
            "__PRICE_TABLE__",
            "__FAQ_SECTION__",
            "__PRICE_CALCULATOR_JS__",
        }
        self.assertTrue(required.issubset(set(re.findall(r"__[A-Z0-9_]+__", self.template))))

    def test_preview_renders_without_unresolved_placeholders(self) -> None:
        rendered = self.renderer.render_preview(self.template, self.fixture)
        self.assertNotRegex(rendered, r"__[A-Z0-9_]+__")
        self.assertIn("LOCAL TEMPLATE PREVIEW — NOT PRODUCTION", rendered)
        self.assertIn("71V416L10BEG", rendered)
        self.assertIn('<meta name="robots" content="noindex,nofollow">', rendered)
        self.assertIn("Preview only: form submission is disabled.", rendered)

    def test_kit_does_not_contain_production_publish_commands(self) -> None:
        checked_files = [
            KIT_ROOT / "README.md",
            RENDERER_PATH,
            FIXTURE_PATH,
        ]
        content = "\n".join(path.read_text(encoding="utf-8") for path in checked_files)
        forbidden = ["rclone copy", "wrangler r2", "CLOUDFLARE_API_TOKEN", "R2_SECRET_ACCESS_KEY"]
        for token in forbidden:
            self.assertNotIn(token, content)


if __name__ == "__main__":
    unittest.main()
