#!/usr/bin/env python3
"""Render the product-detail template from a checked-in, non-production fixture."""

from __future__ import annotations

import sys
from runpy import run_path

if "--live-html" in sys.argv:
    run_path(r"F:\\jp-inotoday-parts\\product-pages\\preview\\render_preview.py", run_name="__main__")
    raise SystemExit

import argparse
import json
import re
from html import escape
from pathlib import Path


KIT_ROOT = Path(__file__).resolve().parents[1]
DEFAULT_TEMPLATE = KIT_ROOT / "templates" / "product_detail_template.html"
DEFAULT_FIXTURE = KIT_ROOT / "fixtures" / "71v416l10beg.json"
DEFAULT_OUTPUT = KIT_ROOT / ".preview" / "71v416l10beg.html"
PLACEHOLDER_RE = re.compile(r"__[A-Z0-9_]+__")


def _spec_table(specs: list[dict[str, object]]) -> str:
    return "\n".join(
        "        <tr><th>{}</th><td>{}</td></tr>".format(
            escape(str(row["label"])), escape(str(row["value"]))
        )
        for row in specs
    )


def _price_table(tiers: list[dict[str, object]], lead_time: str) -> str:
    rows: list[str] = []
    for tier in tiers:
        minimum = int(tier["minimum"])
        maximum = tier.get("maximum")
        if maximum is None:
            quantity = f"{minimum:,} 個以上"
        else:
            quantity = f"{minimum:,} ～ {int(maximum):,} 個"
        rows.append(
            """        <tr>
          <td class="qty">{quantity}</td>
          <td class="price">${price:,.2f}</td>
          <td>{lead_time}</td>
          <td class="action"><a href="#contact">見積依頼</a></td>
        </tr>""".format(
                quantity=escape(quantity),
                price=float(tier["unit_price"]),
                lead_time=escape(lead_time),
            )
        )
    return "\n".join(rows)


def _faq_section(faqs: list[dict[str, object]]) -> str:
    return "\n".join(
        """      <div class="faq-item">
        <h3>{question}</h3>
        <p>{answer}</p>
      </div>""".format(
            question=escape(str(item["question"])),
            answer=escape(str(item["answer"])),
        )
        for item in faqs
    )


def _json_ld(data: dict[str, object], base_url: str) -> str:
    payload = {
        "@context": "https://schema.org",
        "@type": "Product",
        "name": data["sku"],
        "sku": data["sku"],
        "mpn": data["sku"],
        "description": data["description"],
        "brand": {"@type": "Brand", "name": data["manufacturer"]},
        "url": f"{base_url}/items/{data['slug']}/",
        "image": data["image_url"],
    }
    encoded = json.dumps(payload, ensure_ascii=False).replace("</", "<\\/")
    return f'<script type="application/ld+json">{encoded}</script>'


def _preview_guard() -> str:
    return """
<meta name="robots" content="noindex,nofollow">
<style>
  .preview-banner { position: sticky; top: 0; z-index: 99999; padding: 10px 16px;
    background: #7c2d12; color: #fff; text-align: center; font: 700 14px/1.4 sans-serif; }
</style>
<script>
  document.addEventListener('submit', function (event) {
    event.preventDefault();
    event.stopImmediatePropagation();
    window.alert('Preview only: form submission is disabled.');
  }, true);
</script>
""".strip()


def _price_calculator(tiers: list[dict[str, object]]) -> str:
    payload = json.dumps(tiers, ensure_ascii=False)
    return f"""
const PRICE_TIERS = {payload};
function updateCalc() {{
  const qty = parseInt(document.getElementById('calcQty').value, 10) || 0;
  const tier = PRICE_TIERS.find(t => qty >= t.minimum && (t.maximum === null || qty <= t.maximum)) || PRICE_TIERS[0];
  const unit = Number(tier.unit_price || 0);
  document.getElementById('calcUnit').value = '$' + unit.toFixed(2);
  document.getElementById('calcTotal').textContent = '$' + (qty * unit).toLocaleString('en-US', {{minimumFractionDigits: 2, maximumFractionDigits: 2}});
}}
updateCalc();
""".strip()


def render_preview(template: str, data: dict[str, object]) -> str:
    base_url = "http://127.0.0.1:4173"
    sku = str(data["sku"])
    slug = str(data["slug"])
    manufacturer = str(data["manufacturer"])
    description = str(data["description"])
    lead_time = str(data["lead_time"])
    image_url = str(data["image_url"])
    price_tiers = list(data.get("price_tiers", []))

    replacements = {
        "__BASE_URL__": escape(base_url),
        "__SLUG__": escape(slug),
        "__PAGE_TITLE__": escape(f"{sku} - {manufacturer} | INOTODAY Parts"),
        "__META_DESC__": escape(str(data["meta_description"]), quote=True),
        "__ROBOTS_META__": '<meta name="robots" content="noindex,nofollow">',
        "__JSON_LD__": _json_ld(data, base_url),
        "__GA_HEAD_SNIPPET__": _preview_guard(),
        "__BREADCRUMB__": (
            '<a href="/">ホーム</a><span>›</span>'
            '<a href="/items/">製品一覧</a><span>›</span>'
            f"<span>{escape(sku)}</span>"
        ),
        "__PRODUCT_IMAGE_HTML__": (
            f'<img src="{escape(image_url, quote=True)}" alt="{escape(sku, quote=True)} preview image" '
            'width="480" height="360">'
        ),
        "__MFR__": escape(manufacturer),
        "__SKU__": escape(sku),
        "__DESC__": escape(description),
        "__STOCK__": str(int(data["stock"])),
        "__STOCK_DISPLAY__": escape(str(data["stock_display"])),
        "__PRICE_SUMMARY__": escape(str(data["price_summary"])),
        "__LEAD_TIME__": escape(lead_time),
        "__STATUS__": escape(str(data["status"])),
        "__SPEC_TABLE__": _spec_table(list(data.get("specs", []))),
        "__PRICE_TABLE__": _price_table(price_tiers, lead_time),
        "__PRICE_CALCULATOR_JS__": _price_calculator(price_tiers),
        "__FAQ_SECTION__": _faq_section(list(data.get("faqs", []))),
        "__RECOMMEND_SECTION__": "",
    }

    rendered = template
    for placeholder in sorted(replacements, key=len, reverse=True):
        rendered = rendered.replace(placeholder, replacements[placeholder])

    unresolved = sorted(set(PLACEHOLDER_RE.findall(rendered)))
    if unresolved:
        raise ValueError(f"unresolved placeholders: {', '.join(unresolved)}")

    banner = '<div class="preview-banner">LOCAL TEMPLATE PREVIEW — NOT PRODUCTION</div>'
    return rendered.replace("<body>", f"<body>\n{banner}", 1)


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--template", type=Path, default=DEFAULT_TEMPLATE)
    parser.add_argument("--fixture", type=Path, default=DEFAULT_FIXTURE)
    parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT)
    return parser.parse_args()


def main() -> int:
    args = parse_args()
    template = args.template.read_text(encoding="utf-8")
    data = json.loads(args.fixture.read_text(encoding="utf-8"))
    rendered = render_preview(template, data)
    args.output.parent.mkdir(parents=True, exist_ok=True)
    args.output.write_text(rendered, encoding="utf-8")
    print(args.output.resolve())
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
