from __future__ import annotations

import json
import re
import sys
import tempfile
import unittest
from pathlib import Path

SITE_ROOT = Path(__file__).resolve().parents[1]
REPO_ROOT = SITE_ROOT.parents[1]
PIPELINE_ROOT = REPO_ROOT / "cloudflare-pipeline"
if str(PIPELINE_ROOT) not in sys.path:
    sys.path.insert(0, str(PIPELINE_ROOT))

from static_pages.models import BuildConfig  # noqa: E402
from static_pages.paths import DEFAULT_JSON_INPUT, DEFAULT_TEMPLATE_PATH  # noqa: E402
from static_pages.pipeline import generate_site  # noqa: E402
from static_pages.qa import run_quality_check  # noqa: E402


class PagePipelineTestCase(unittest.TestCase):
    def test_sql_generation_passes_quality_gate(self) -> None:
        with tempfile.TemporaryDirectory() as temp_dir:
            root = Path(temp_dir)
            sql_fixture = root / "fixture.sql"
            cols = [""] * 32
            cols[5] = "SQL-MPN-001"
            cols[13] = "HIGH SPEED MEMORY CONTROLLER"
            cols[14] = '{"Package / Case":"48-QFN","Category":"Integrated Circuits (ICs)"}'
            cols[28] = (
                '{"Manufacturer":"Test Semiconductor","Minimum Order Quantity":"1",'
                '"Standard Package":"10","Quantity Available":"120","Series":"Alpha",'
                '"Part Status":"Active","Manufacturer Standard Lead Time":"6 weeks"}'
            )
            cols[30] = '{"RoHS Status":"ROHS3 Compliant"}'
            row = "(" + ",".join(f"'{value}'" for value in cols) + ")"
            sql_fixture.write_text(
                f"INSERT INTO spider_digikey_data VALUES {row};\n",
                encoding="utf-8",
            )

            config = BuildConfig(
                source_name="sql",
                input_path=sql_fixture,
                output_dir=root / "html",
                sitemap_dir=root / "sitemaps",
                artifacts_dir=root / "artifacts",
                template_path=DEFAULT_TEMPLATE_PATH,
                base_url="https://parts.jp.inotoday.com",
                ga_measurement_id="G-TEST123456",
                target_count=1,
                clean_output=True,
                run_qa=True,
            )

            summary = generate_site(config)

            self.assertEqual(summary.accepted_count, 1)
            self.assertEqual(len(list((root / "html").glob("*.html"))), 1)

    def test_json_generation_passes_quality_gate(self) -> None:
        with tempfile.TemporaryDirectory() as temp_dir:
            root = Path(temp_dir)
            config = BuildConfig(
                source_name="json",
                input_path=DEFAULT_JSON_INPUT,
                output_dir=root / "html",
                sitemap_dir=root / "sitemaps",
                artifacts_dir=root / "artifacts",
                template_path=DEFAULT_TEMPLATE_PATH,
                base_url="https://parts.jp.inotoday.com",
                ga_measurement_id="G-TEST123456",
                target_count=3,
                clean_output=True,
                run_qa=True,
            )

            summary = generate_site(config)

            self.assertEqual(summary.accepted_count, 3)
            self.assertEqual(summary.rejected_count, 0)
            self.assertTrue((root / "artifacts" / "quality-report.json").exists())
            self.assertEqual(len(list((root / "html").glob("*.html"))), 3)
            generated_html = root / "html" / f"{summary.samples[0]['slug']}.html"
            html = generated_html.read_text(encoding="utf-8")
            self.assertNotIn("name=keywords", html)
            json_ld_blocks = re.findall(
                r'<script type="application/ld\+json">\s*(.*?)\s*</script>',
                html,
                re.DOTALL,
            )
            self.assertGreater(len(json_ld_blocks), 0)
            schemas = []
            for block in json_ld_blocks:
                parsed = json.loads(block)
                if isinstance(parsed, list):
                    schemas.extend(parsed)
                else:
                    schemas.append(parsed)
            schema_types = {schema.get("@type") for schema in schemas}
            self.assertIn("Product", schema_types)
            self.assertIn("BreadcrumbList", schema_types)
            self.assertNotIn("FAQPage", schema_types)

    def test_quality_gate_blocks_unresolved_placeholders(self) -> None:
        with tempfile.TemporaryDirectory() as temp_dir:
            root = Path(temp_dir)
            config = BuildConfig(
                source_name="json",
                input_path=DEFAULT_JSON_INPUT,
                output_dir=root / "html",
                sitemap_dir=root / "sitemaps",
                artifacts_dir=root / "artifacts",
                template_path=DEFAULT_TEMPLATE_PATH,
                base_url="https://parts.jp.inotoday.com",
                ga_measurement_id="G-TEST123456",
                target_count=1,
                clean_output=True,
                run_qa=False,
            )

            summary = generate_site(config)
            generated_html = root / "html" / f"{summary.samples[0]['slug']}.html"
            html = generated_html.read_text(encoding="utf-8")
            generated_html.write_text(
                html.replace(
                    "content=\"",
                    "content=\"__META_DESC__ ",
                    1,
                ),
                encoding="utf-8",
            )

            report = run_quality_check(
                html_dir=root / "html",
                sitemap_dir=root / "sitemaps",
                base_url="https://parts.jp.inotoday.com",
                report_dir=root / "artifacts",
                meta_min_length=50,
                meta_max_length=220,
            )

            self.assertGreater(report.blocking_issues, 0)
            self.assertTrue(
                any(issue["type"] == "unresolved_placeholder" for issue in report.issues)
            )


if __name__ == "__main__":
    unittest.main()
