"""HTML Generator for LandingForge."""
import html
from datetime import date


class HTMLGenerator:
    """Generates all HTML pages for the landing site."""

    def __init__(self, config: dict):
        self.config = config
        self.site = config["site"]
        self.keywords = config.get("keywords", {})
        self.seo_cfg = config.get("seo", {})
        self.languages = config.get("languages", {})
        self.design = config.get("design", {})
        self.content = config.get("content", {})
        self.gdpr = config.get("gdpr", {})

    # ── Helpers ──────────────────────────────────────────────────────────────

    def _primary_keyword(self) -> str:
        primary = self.keywords.get("primary", [""])
        return primary[0] if primary else ""

    def _all_keywords(self) -> list:
        kw = []
        kw.extend(self.keywords.get("primary", []))
        kw.extend(self.keywords.get("secondary", []))
        kw.extend(self.keywords.get("long_tail", []))
        return kw

    def _meta_title(self, page: str = "") -> str:
        brand = self.site["brand_name"]
        primary = self._primary_keyword()
        tagline = self.site.get("tagline", "")
        tpl = self.seo_cfg.get("title_template", "{brand} — {primary_keyword} | {tagline}")
        title = tpl.format(brand=brand, primary_keyword=primary, tagline=tagline)
        if page:
            return f"{page} | {brand}"
        return title

    def _meta_description(self, extra: str = "") -> str:
        brand = self.site["brand_name"]
        kws = self.keywords.get("primary", [])
        sec = self.keywords.get("secondary", [])
        kw_str = ", ".join(kws[:2])
        sec_str = sec[0] if sec else ""
        base = (
            f"{brand} — {kws[0] if kws else 'AI solution'}. "
            f"Powered by {sec_str}. {extra}".strip()
        )
        max_len = self.seo_cfg.get("description_length", 155)
        return base[:max_len]

    def _base_url(self) -> str:
        return f"https://{self.site['domain']}"

    def _hreflang_links(self, path: str = "") -> str:
        base = self._base_url()
        supported = self.languages.get("supported", [])
        default_lang = self.languages.get("default", "en")
        lines = []
        for lang in supported:
            code = lang["code"]
            if code == default_lang:
                href = f"{base}/{path}" if path else f"{base}/"
            else:
                href = f"{base}/lang/{code}/{path}" if path else f"{base}/lang/{code}/"
            lines.append(f'  <link rel="alternate" hreflang="{code}" href="{href}">')
        lines.append(f'  <link rel="alternate" hreflang="x-default" href="{base}/{path}">')
        return "\n".join(lines)

    def _og_tags(self, title: str, description: str, url: str, og_type: str = "website") -> str:
        og_image = self.seo_cfg.get("og_image", "/assets/images/og-default.jpg")
        brand = self.site["brand_name"]
        supported = self.languages.get("supported", [])
        default_lang = self.languages.get("default", "en")
        base = self._base_url()
        full_image = og_image if og_image.startswith("http") else f"{base}{og_image}"
        lines = [
            f'  <meta property="og:type" content="{og_type}">',
            f'  <meta property="og:url" content="{url}">',
            f'  <meta property="og:title" content="{html.escape(title)}">',
            f'  <meta property="og:description" content="{html.escape(description)}">',
            f'  <meta property="og:image" content="{full_image}">',
            f'  <meta property="og:site_name" content="{html.escape(brand)}">',
            f'  <meta property="og:locale" content="{default_lang}">',
        ]
        for lang in supported:
            if lang["code"] != default_lang:
                lines.append(f'  <meta property="og:locale:alternate" content="{lang["code"]}">')
        return "\n".join(lines)

    def _twitter_tags(self, title: str, description: str) -> str:
        og_image = self.seo_cfg.get("og_image", "/assets/images/og-default.jpg")
        handle = self.seo_cfg.get("twitter_handle", "")
        base = self._base_url()
        full_image = og_image if og_image.startswith("http") else f"{base}{og_image}"
        lines = [
            '  <meta name="twitter:card" content="summary_large_image">',
            f'  <meta name="twitter:title" content="{html.escape(title)}">',
            f'  <meta name="twitter:description" content="{html.escape(description)}">',
            f'  <meta name="twitter:image" content="{full_image}">',
        ]
        if handle:
            lines.append(f'  <meta name="twitter:site" content="{handle}">')
        return "\n".join(lines)

    def _json_ld_software_app(self, title: str, description: str) -> str:
        brand = self.site["brand_name"]
        domain = self.site["domain"]
        kws = self._all_keywords()
        schema_type = self.seo_cfg.get("schema_type", "SoftwareApplication")
        data = {
            "@context": "https://schema.org",
            "@type": schema_type,
            "name": brand,
            "description": description,
            "url": f"https://{domain}/",
            "applicationCategory": "BusinessApplication",
            "operatingSystem": "Web",
            "keywords": ", ".join(kws[:10]),
            "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"},
        }
        import json  # noqa: PLC0415
        return json.dumps(data, indent=2, ensure_ascii=False)

    def _json_ld_breadcrumbs(self, crumbs: list) -> str:
        """crumbs = list of (name, url) tuples"""
        import json  # noqa: PLC0415
        items = []
        for i, (name, url) in enumerate(crumbs, 1):
            items.append({"@type": "ListItem", "position": i, "name": name, "item": url})
        data = {"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": items}
        return json.dumps(data, indent=2, ensure_ascii=False)

    def _json_ld_faq(self) -> str:
        import json  # noqa: PLC0415
        faq_items = self.content.get("faq", {}).get("items", [])
        brand = self.site["brand_name"]
        entities = []
        for item in faq_items:
            q = item["question"].replace("{brand_name}", brand)
            a = item["answer"].replace("{brand_name}", brand)
            entities.append({
                "@type": "Question",
                "name": q,
                "acceptedAnswer": {"@type": "Answer", "text": a},
            })
        data = {"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": entities}
        return json.dumps(data, indent=2, ensure_ascii=False)

    def _head(self, title: str, description: str, canonical: str, lang: str = "en",
              extra_schema: list = None, page: str = "") -> str:
        """Generate the full <head> section."""
        brand = self.site["brand_name"]
        all_kws = self._all_keywords()
        keywords_meta = ", ".join(all_kws[:15])
        hreflang = self._hreflang_links(page)
        og = self._og_tags(title, description, canonical)
        tw = self._twitter_tags(title, description)
        app_schema = self._json_ld_software_app(title, description)
        year = self.site.get("copyright_year", date.today().year)

        schema_blocks = [f'<script type="application/ld+json">\n{app_schema}\n</script>']
        if extra_schema:
            for schema in extra_schema:
                schema_blocks.append(f'<script type="application/ld+json">\n{schema}\n</script>')

        schema_html = "\n  ".join(schema_blocks)

        fonts_heading = self.design.get("fonts", {}).get("heading", "Inter")
        fonts_body = self.design.get("fonts", {}).get("body", "Inter")

        return f"""<!DOCTYPE html>
<html lang="{lang}" dir="ltr">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">

  <!-- Primary SEO -->
  <title>{html.escape(title)}</title>
  <meta name="description" content="{html.escape(description)}">
  <meta name="keywords" content="{html.escape(keywords_meta)}">
  <meta name="author" content="{html.escape(brand)}">
  <meta name="robots" content="index, follow, max-image-preview:large">
  <link rel="canonical" href="{canonical}">

  <!-- Hreflang -->
{hreflang}

  <!-- Open Graph -->
{og}

  <!-- Twitter Card -->
{tw}

  <!-- Favicons -->
  <link rel="icon" type="image/x-icon" href="/assets/images/favicon.ico">
  <link rel="icon" type="image/png" sizes="32x32" href="/assets/images/favicon-32x32.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/assets/images/favicon-16x16.png">
  <link rel="apple-touch-icon" href="/assets/images/apple-touch-icon.png">
  <link rel="manifest" href="/manifest.json">
  <meta name="msapplication-config" content="/browserconfig.xml">
  <meta name="theme-color" content="{self.design.get('colors', {}).get('accent_primary', '#6c5ce7')}">

  <!-- Preload critical fonts -->
  <link rel="preload" href="/assets/fonts/inter-v13-latin/inter-v13-latin-regular.woff2" as="font" type="font/woff2" crossorigin>
  <link rel="preload" href="/assets/fonts/inter-v13-latin/inter-v13-latin-700.woff2" as="font" type="font/woff2" crossorigin>

  <!-- Styles (local — no CDN) -->
  <link rel="stylesheet" href="/assets/fonts/inter-v13-latin/inter-v13-latin.css">
  <link rel="stylesheet" href="/assets/fonts/jetbrains-mono/jetbrains-mono.css">
  <link rel="stylesheet" href="/assets/css/fontawesome.min.css">
  <link rel="stylesheet" href="/assets/css/animations.css">
  <link rel="stylesheet" href="/assets/css/main.css">
  <link rel="stylesheet" href="/assets/css/responsive.css">

  <!-- Structured Data -->
  {schema_html}
</head>"""

    def _nav(self, lang: str = "en") -> str:
        brand = self.site["brand_name"]
        supported = self.languages.get("supported", [])
        default_lang = self.languages.get("default", "en")
        contact_email = self.site.get("contact_email", "")

        # Build language dropdown entries
        lang_items = []
        for l in supported:
            code = l["code"]
            flag = l.get("flag_emoji", "")
            name = l["name"]
            if code == default_lang:
                href = "/"
            else:
                href = f"/lang/{code}/"
            lang_items.append(
                f'      <a href="{href}" data-lang="{code}">{flag} {name}</a>'
            )
        lang_items_html = "\n".join(lang_items)

        # Find current language flag/name
        current = next((l for l in supported if l["code"] == lang), supported[0] if supported else {"flag_emoji": "🌐", "code": lang})
        current_flag = current.get("flag_emoji", "🌐")

        return f"""<nav class="navbar" role="navigation" aria-label="Main navigation">
  <div class="container">
    <a href="/" class="navbar-brand" aria-label="{html.escape(brand)} home">{html.escape(brand)}</a>
    <div class="navbar-links">
      <a href="#features">Features</a>
      <a href="#how-it-works">How It Works</a>
      <a href="#faq">FAQ</a>
      <a href="/about.html">About</a>
    </div>
    <div class="navbar-right">
      <div class="lang-switcher" role="navigation" aria-label="Language selector">
        <button class="lang-switcher-btn" aria-haspopup="true" aria-expanded="false"
                aria-label="Select language">
          <span>{current_flag}</span>
          <i class="fas fa-chevron-down" aria-hidden="true"></i>
        </button>
        <div class="lang-dropdown" role="menu">
{lang_items_html}
        </div>
      </div>
      <a href="#signup" class="btn btn-primary btn-sm">Get Started Free</a>
    </div>
    <button class="hamburger" aria-label="Toggle mobile menu" aria-expanded="false">
      <span></span><span></span><span></span>
    </button>
  </div>
</nav>
<nav class="mobile-nav" aria-label="Mobile navigation">
  <a href="#features">Features</a>
  <a href="#how-it-works">How It Works</a>
  <a href="#faq">FAQ</a>
  <a href="/about.html">About</a>
  <a href="#signup" class="btn btn-primary">Get Started Free</a>
</nav>"""

    def _hero(self) -> str:
        hero_cfg = self.content.get("hero", {})
        headline = hero_cfg.get("headline", "Transform Your Content with AI")
        subheadline = hero_cfg.get("subheadline", "")
        cta_primary_text = hero_cfg.get("cta_primary_text", "Get Started Free")
        cta_primary_url = hero_cfg.get("cta_primary_url", "#signup")
        cta_secondary_text = hero_cfg.get("cta_secondary_text", "Watch Demo")
        cta_secondary_url = hero_cfg.get("cta_secondary_url", "#demo")
        rotating_texts = hero_cfg.get("rotating_texts", ["Content"])
        show_prompt = hero_cfg.get("show_prompt_input", True)
        brand_logos = hero_cfg.get("brand_logos", [])
        primary_kw = self._primary_keyword()

        logos_html = ""
        if brand_logos:
            logo_items = "".join(
                f'<span class="brand-logo-item">{html.escape(l["name"])}</span>'
                for l in brand_logos
            )
            logos_html = f"""
      <div class="brand-logos wow fadeInUp" data-wow-delay="0.6s">
        <div class="brand-logos-label">Trusted by innovative teams</div>
        <div class="brand-logos-list">{logo_items}</div>
      </div>"""

        prompt_html = ""
        if show_prompt:
            prompt_html = """
      <div class="hero-prompt-wrapper wow fadeInUp" data-wow-delay="0.5s">
        <input class="hero-prompt-input typing-cursor" type="text"
               placeholder="Describe your content..." aria-label="AI content prompt">
        <button class="hero-prompt-btn" type="button">Generate <i class="fas fa-arrow-right" aria-hidden="true"></i></button>
      </div>"""

        first_rotating = rotating_texts[0] if rotating_texts else "Content"

        return f"""<section class="hero" id="hero" aria-label="Hero section">
  <div class="hero-orb hero-orb-1" aria-hidden="true"></div>
  <div class="hero-orb hero-orb-2" aria-hidden="true"></div>
  <div class="container">
    <div class="hero-content">
      <div class="hero-badge wow fadeInDown" data-wow-delay="0.1s">
        <span class="hero-badge-dot" aria-hidden="true"></span>
        <span>{html.escape(primary_kw)} — Now Live</span>
      </div>
      <h1 class="wow fadeInUp" data-wow-delay="0.2s">
        {html.escape(headline)}<br>
        <span class="gradient-text rotating-wrapper">
          <span class="rotating-text">{html.escape(first_rotating)}</span>
        </span>
      </h1>
      <p class="hero-subtitle wow fadeInUp" data-wow-delay="0.3s">
        {html.escape(subheadline)}
      </p>
      <div class="hero-cta wow fadeInUp" data-wow-delay="0.4s">
        <a href="{html.escape(cta_primary_url)}" class="btn btn-primary btn-lg">
          {html.escape(cta_primary_text)} <i class="fas fa-arrow-right" aria-hidden="true"></i>
        </a>
        <a href="{html.escape(cta_secondary_url)}" class="btn btn-secondary btn-lg">
          <i class="fas fa-play" aria-hidden="true"></i> {html.escape(cta_secondary_text)}
        </a>
      </div>
{prompt_html}
{logos_html}
    </div>
  </div>
</section>"""

    def _features(self) -> str:
        feat_cfg = self.content.get("features", {})
        section_title = feat_cfg.get("section_title", "Powerful Features")
        section_subtitle = feat_cfg.get("section_subtitle", "")
        tabs = feat_cfg.get("tabs", [])

        tab_nav = []
        tab_panels = []
        for i, tab in enumerate(tabs):
            active = "active" if i == 0 else ""
            tab_nav.append(
                f'      <button class="feature-tab {active}" data-tab="{i}" '
                f'aria-selected="{str(i == 0).lower()}" role="tab">'
                f'<i class="fas {html.escape(tab.get("icon", "fa-star"))}" aria-hidden="true"></i>'
                f' {html.escape(tab.get("title", ""))} </button>'
            )
            bullets_html = "".join(
                f"<li>{html.escape(b)}</li>"
                for b in tab.get("bullets", [])
            )
            img_alt = html.escape(tab.get("image_alt", f"Feature {i + 1}"))
            tab_panels.append(f"""    <div class="feature-panel {active}" data-tab="{i}" role="tabpanel">
      <div class="wow fadeInLeft" data-wow-delay="0.1s">
        <h3 class="feature-heading gradient-text">{html.escape(tab.get("heading", ""))}</h3>
        <p class="feature-description">{html.escape(tab.get("description", ""))}</p>
        <ul class="feature-bullets">{bullets_html}</ul>
      </div>
      <div class="feature-image-placeholder wow fadeInRight" data-wow-delay="0.2s">
        <img data-src="/assets/images/placeholder-feature-{i}.svg"
             src="/assets/images/placeholder-feature-{i}.svg"
             alt="{img_alt}" loading="lazy" class="lazy">
      </div>
    </div>""")

        return f"""<section class="features section" id="features" aria-label="Features">
  <div class="container">
    <div class="section-header wow fadeInUp">
      <h2 class="gradient-text">{html.escape(section_title)}</h2>
      <p>{html.escape(section_subtitle)}</p>
    </div>
    <div class="feature-tabs" role="tablist" aria-label="Feature categories">
{chr(10).join(tab_nav)}
    </div>
{chr(10).join(tab_panels)}
  </div>
</section>"""

    def _how_to(self) -> str:
        how_cfg = self.content.get("how_to", {})
        section_title = how_cfg.get("section_title", "How It Works")
        section_subtitle = how_cfg.get("section_subtitle", "")
        steps = how_cfg.get("steps", [])

        step_cards = []
        for i, step in enumerate(steps):
            num = step.get("number", i + 1)
            title = step.get("title", f"Step {num}")
            desc = step.get("description", "")
            img_alt = html.escape(step.get("image_alt", f"Step {num}"))
            delay = f"0.{i * 2}s"
            step_cards.append(f"""    <div class="step-card wow fadeInUp" data-wow-delay="{delay}">
      <div class="step-number" aria-hidden="true">{num}</div>
      <h3 class="step-title">{html.escape(title)}</h3>
      <p class="step-description">{html.escape(desc)}</p>
      <div class="step-image-placeholder">
        <img data-src="/assets/images/placeholder-step-{num}.svg"
             src="/assets/images/placeholder-step-{num}.svg"
             alt="{img_alt}" loading="lazy" class="lazy">
      </div>
    </div>""")

        return f"""<section class="how-to section" id="how-it-works" aria-label="How it works">
  <div class="container">
    <div class="section-header wow fadeInUp">
      <h2 class="gradient-text">{html.escape(section_title)}</h2>
      <p>{html.escape(section_subtitle)}</p>
    </div>
    <div class="steps-grid">
{chr(10).join(step_cards)}
    </div>
  </div>
</section>"""

    def _faq(self) -> str:
        faq_cfg = self.content.get("faq", {})
        section_title = faq_cfg.get("section_title", "Frequently Asked Questions")
        items = faq_cfg.get("items", [])
        brand = self.site["brand_name"]

        item_blocks = []
        for i, item in enumerate(items):
            q = item["question"].replace("{brand_name}", brand)
            a = item["answer"].replace("{brand_name}", brand)
            item_blocks.append(f"""    <div class="faq-item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question">
      <button class="faq-question" aria-expanded="false" id="faq-q-{i}">
        <span itemprop="name">{html.escape(q)}</span>
        <span class="faq-icon" aria-hidden="true">+</span>
      </button>
      <div class="faq-answer" role="region" aria-labelledby="faq-q-{i}"
           itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer">
        <div class="faq-answer-inner" itemprop="text">{html.escape(a)}</div>
      </div>
    </div>""")

        return f"""<section class="faq section" id="faq" aria-label="FAQ"
         itemscope itemtype="https://schema.org/FAQPage">
  <div class="container">
    <div class="section-header wow fadeInUp">
      <h2 class="gradient-text">{html.escape(section_title)}</h2>
    </div>
    <div class="faq-list">
{chr(10).join(item_blocks)}
    </div>
  </div>
</section>"""

    def _footer(self, lang: str = "en") -> str:
        footer_cfg = self.content.get("footer", {})
        columns = footer_cfg.get("columns", [])
        social_links = footer_cfg.get("social_links", [])
        brand = self.site["brand_name"]
        primary_kw = self._primary_keyword()
        year = self.site.get("copyright_year", date.today().year)
        contact_email = self.site.get("contact_email", "")

        col_html_parts = []
        for col in columns:
            links_html = "".join(
                f'<li><a href="{html.escape(l["url"])}">{html.escape(l["text"])}</a></li>'
                for l in col.get("links", [])
            )
            col_html_parts.append(
                f"""    <div class="footer-col">
      <div class="footer-col-title">{html.escape(col["title"])}</div>
      <ul>{links_html}</ul>
    </div>"""
            )

        social_html = "".join(
            f'<a href="{html.escape(l["url"])}" class="social-link" '
            f'aria-label="{html.escape(l["platform"])}" target="_blank" rel="noopener noreferrer">'
            f'<i class="{html.escape(l["icon"])}" aria-hidden="true"></i></a>'
            for l in social_links
        )

        supported = self.languages.get("supported", [])
        default_lang = self.languages.get("default", "en")
        footer_lang_links = "".join(
            f'<a href="{"/" if l["code"] == default_lang else "/lang/" + l["code"] + "/"}" '
            f'data-lang="{l["code"]}" class="footer-lang-item" aria-label="Switch to {l["name"]}">'
            f'{l.get("flag_emoji", "")} {l["name"]}</a>'
            for l in supported
        )

        return f"""<footer aria-label="Site footer">
  <div class="container">
    <div class="footer-grid">
      <div class="footer-brand">
        <a href="/" class="navbar-brand">{html.escape(brand)}</a>
        <p class="footer-brand-desc">
          {html.escape(brand)} — the leading {html.escape(primary_kw)}.
          {html.escape("Trusted by thousands of creators and marketers worldwide.")}
        </p>
        <div class="social-links" style="margin-top:1.5rem">{social_html}</div>
      </div>
{chr(10).join(col_html_parts)}
    </div>
    <div class="footer-bottom">
      <p class="footer-copyright">
        &copy; {year} {html.escape(brand)}. All rights reserved.
        {('<a href="mailto:' + html.escape(contact_email) + '">' + html.escape(contact_email) + '</a>') if contact_email else ''}
      </p>
      <div class="footer-lang" aria-label="Language selector">
        {footer_lang_links}
      </div>
    </div>
  </div>
</footer>"""

    def _cookie_banner(self) -> str:
        gdpr = self.gdpr
        if not gdpr.get("cookie_banner", True):
            return ""
        message = gdpr.get("cookie_message", "We use cookies to enhance your experience.")
        privacy_url = gdpr.get("privacy_policy_url", "/privacy.html")
        categories = gdpr.get("cookie_categories", [])

        cat_html_parts = []
        for cat in categories:
            required = cat.get("required", False)
            default_on = cat.get("default", False) or required
            disabled_attr = ' disabled' if required else ''
            checked_attr = ' checked' if default_on else ''
            cat_html_parts.append(
                f"""    <label class="cookie-category">
      <span class="toggle-switch">
        <input type="checkbox" id="cookie-cat-{html.escape(cat['name'])}"
               name="cookie-cat-{html.escape(cat['name'])}"{checked_attr}{disabled_attr}>
        <span class="toggle-slider"></span>
      </span>
      {html.escape(cat.get('label', cat['name']))}
      {"(required)" if required else ""}
    </label>"""
            )

        return f"""<div id="cookie-banner" class="cookie-banner" role="dialog"
     aria-label="Cookie consent" aria-live="polite">
  <div class="container">
    <p class="cookie-message">
      {html.escape(message)}
      <a href="{html.escape(privacy_url)}">Learn more</a>
    </p>
    <div class="cookie-buttons">
      <button id="cookie-accept" class="btn btn-primary btn-sm">Accept All</button>
      <button id="cookie-customize" class="btn btn-secondary btn-sm">Customize</button>
      <button id="cookie-reject" class="btn btn-secondary btn-sm">Reject</button>
    </div>
    <div id="cookie-categories" class="cookie-categories" role="group" aria-label="Cookie categories">
{chr(10).join(cat_html_parts)}
      <button id="cookie-save" class="btn btn-primary btn-sm" style="margin-top:0.5rem">Save Preferences</button>
    </div>
  </div>
</div>"""

    def _back_to_top(self) -> str:
        return """<button class="back-to-top" aria-label="Back to top" title="Back to top">
  <i class="fas fa-arrow-up" aria-hidden="true"></i>
</button>"""

    def _scripts(self) -> str:
        brand = self.site["brand_name"]
        analytics_id = self.site.get("analytics_id", "")
        analytics_html = ""
        if analytics_id:
            analytics_html = f"""  <!-- Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id={html.escape(analytics_id)}"></script>
  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){{dataLayer.push(arguments);}}
    gtag('js', new Date());
    gtag('config', '{html.escape(analytics_id)}');
  </script>"""

        return f"""  <script src="/assets/js/wow.min.js"></script>
  <script src="/assets/js/main.js"></script>
  <script src="/assets/js/hero-animations.js"></script>
  <script src="/assets/js/language-switcher.js"></script>
  <script src="/assets/js/cookie-consent.js"></script>
  <script>new WOW({{ offset: 80 }}).init();</script>
{analytics_html}"""

    # ── Page generators ────────────────────────────────────────────────────

    def generate_index(self, lang: str = "en", is_lang_version: bool = False) -> str:
        brand = self.site["brand_name"]
        domain = self.site["domain"]
        base = f"https://{domain}"
        primary_kw = self._primary_keyword()
        title = self._meta_title()
        description = self._meta_description(
            extra=self.content.get("hero", {}).get("subheadline", "")
        )

        if is_lang_version:
            canonical = f"{base}/lang/{lang}/"
        else:
            canonical = f"{base}/"

        extra_schemas = []
        if self.seo_cfg.get("generate_breadcrumbs", True):
            extra_schemas.append(
                self._json_ld_breadcrumbs([(brand, f"{base}/"), ("Home", f"{base}/")])
            )
        if self.seo_cfg.get("generate_faq_schema", True):
            extra_schemas.append(self._json_ld_faq())

        head = self._head(title, description, canonical, lang=lang,
                          extra_schema=extra_schemas)
        nav = self._nav(lang=lang)
        hero = self._hero()
        features = self._features()
        how_to = self._how_to()
        faq = self._faq()
        footer = self._footer(lang=lang)
        cookie = self._cookie_banner()
        back_to_top = self._back_to_top()
        scripts = self._scripts()

        if is_lang_version:
            lang_note = f"""<div style="display:none" aria-hidden="true" data-lang="{lang}"></div>"""
        else:
            lang_note = ""

        return f"""{head}
<body>
{lang_note}
{nav}
<main id="main-content">
{hero}
{features}
{how_to}
{faq}
</main>
{footer}
{cookie}
{back_to_top}
{scripts}
</body>
</html>"""

    def generate_about(self) -> str:
        brand = self.site["brand_name"]
        domain = self.site["domain"]
        base = f"https://{domain}"
        title = self._meta_title(page="About")
        description = self._meta_description(extra=f"Learn more about {brand} and our mission.")
        canonical = f"{base}/about.html"
        primary_kw = self._primary_keyword()
        all_kws = self.keywords.get("secondary", [])

        extra_schemas = [
            self._json_ld_breadcrumbs([
                (brand, f"{base}/"),
                ("About", canonical),
            ])
        ]
        head = self._head(title, description, canonical, extra_schema=extra_schemas, page="about.html")
        nav = self._nav()
        footer = self._footer()
        scripts = self._scripts()
        back_to_top = self._back_to_top()

        body_content = f"""<main id="main-content" style="padding-top:6rem">
  <div class="container section">
    <h1 class="gradient-text wow fadeInUp">About {html.escape(brand)}</h1>
    <p class="wow fadeInUp" data-wow-delay="0.1s" style="margin-top:1.5rem;max-width:700px">
      {html.escape(brand)} is a next-generation {html.escape(primary_kw)} platform built for
      marketers, content creators, and businesses of all sizes. We leverage cutting-edge
      {html.escape(", ".join(all_kws[:3]))} technology to help you create compelling,
      SEO-optimized content in seconds.
    </p>
    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:3rem">Our Mission</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s" style="max-width:700px">
      We believe great content should be accessible to everyone, not just large enterprises
      with dedicated copywriting teams. Our mission is to democratize high-quality content
      creation through AI.
    </p>
    <h2 class="wow fadeInUp" data-wow-delay="0.4s" style="margin-top:3rem">Our Technology</h2>
    <p class="wow fadeInUp" data-wow-delay="0.5s" style="max-width:700px">
      Built on advanced {html.escape(", ".join(all_kws[:4]))} models, {html.escape(brand)}
      understands context, tone, and SEO best practices to deliver content that resonates
      with both readers and search engines.
    </p>
    <div class="wow fadeInUp" data-wow-delay="0.6s" style="margin-top:3rem">
      <a href="/" class="btn btn-primary">Back to Home</a>
      <a href="/#features" class="btn btn-secondary" style="margin-left:1rem">See Features</a>
    </div>
  </div>
</main>"""

        return f"""{head}
<body>
{nav}
{body_content}
{footer}
{back_to_top}
{scripts}
</body>
</html>"""

    def generate_privacy(self) -> str:
        brand = self.site["brand_name"]
        domain = self.site["domain"]
        base = f"https://{domain}"
        contact_email = self.site.get("contact_email", "")
        year = self.site.get("copyright_year", date.today().year)
        title = self._meta_title(page="Privacy Policy")
        description = f"Privacy Policy for {brand}. Learn how we collect, use, and protect your personal data."
        canonical = f"{base}/privacy.html"

        extra_schemas = [
            self._json_ld_breadcrumbs([
                (brand, f"{base}/"),
                ("Privacy Policy", canonical),
            ])
        ]
        head = self._head(title, description, canonical, extra_schema=extra_schemas, page="privacy.html")
        nav = self._nav()
        footer = self._footer()
        scripts = self._scripts()
        back_to_top = self._back_to_top()

        body_content = f"""<main id="main-content" style="padding-top:6rem">
  <div class="container section">
    <h1 class="gradient-text wow fadeInUp">Privacy Policy</h1>
    <p class="wow fadeInUp" data-wow-delay="0.1s" style="color:var(--text-secondary);margin-top:0.5rem">
      Last updated: {date.today().isoformat()}
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">1. Information We Collect</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      We collect information you provide directly to us, such as when you create an account,
      use our services, or contact us for support. This may include your name, email address,
      and usage data.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">2. How We Use Your Information</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      We use the information we collect to provide, maintain, and improve our services,
      process transactions, send you technical notices and support messages, and respond
      to your comments and questions.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">3. Cookies</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      We use cookies and similar tracking technologies to track activity on our service and
      hold certain information. You can instruct your browser to refuse all cookies or to
      indicate when a cookie is being sent. See our
      <a href="/cookies.html" style="color:var(--accent)">Cookie Policy</a> for details.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">4. Data Sharing</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      We do not sell, trade, or otherwise transfer your personally identifiable information
      to outside parties without your consent, except as described in this policy.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">5. Data Security</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      We implement appropriate technical and organizational measures to protect your personal
      data against unauthorized access, alteration, disclosure, or destruction.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">6. Your Rights (GDPR)</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      If you are located in the European Economic Area, you have certain data protection
      rights. You may request access to, correction of, or deletion of your personal data
      by contacting us at
      {('<a href="mailto:' + html.escape(contact_email) + '" style="color:var(--accent)">' + html.escape(contact_email) + '</a>') if contact_email else 'our support email'}.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">7. Contact Us</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      If you have any questions about this Privacy Policy, please contact us at
      {('<a href="mailto:' + html.escape(contact_email) + '" style="color:var(--accent)">' + html.escape(contact_email) + '</a>') if contact_email else 'our support email'}.
    </p>

    <div class="wow fadeInUp" style="margin-top:3rem">
      <a href="/" class="btn btn-secondary">Back to Home</a>
    </div>
  </div>
</main>"""

        return f"""{head}
<body>
{nav}
{body_content}
{footer}
{back_to_top}
{scripts}
</body>
</html>"""

    def generate_terms(self) -> str:
        brand = self.site["brand_name"]
        domain = self.site["domain"]
        base = f"https://{domain}"
        contact_email = self.site.get("contact_email", "")
        title = self._meta_title(page="Terms of Service")
        description = f"Terms of Service for {brand}. Read our terms and conditions."
        canonical = f"{base}/terms.html"

        extra_schemas = [
            self._json_ld_breadcrumbs([
                (brand, f"{base}/"),
                ("Terms of Service", canonical),
            ])
        ]
        head = self._head(title, description, canonical, extra_schema=extra_schemas, page="terms.html")
        nav = self._nav()
        footer = self._footer()
        scripts = self._scripts()
        back_to_top = self._back_to_top()

        body_content = f"""<main id="main-content" style="padding-top:6rem">
  <div class="container section">
    <h1 class="gradient-text wow fadeInUp">Terms of Service</h1>
    <p class="wow fadeInUp" data-wow-delay="0.1s" style="color:var(--text-secondary);margin-top:0.5rem">
      Last updated: {date.today().isoformat()}
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">1. Acceptance of Terms</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      By accessing and using {html.escape(brand)}, you accept and agree to be bound by
      the terms and provisions of this agreement.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">2. Use License</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      Permission is granted to temporarily use {html.escape(brand)} for personal,
      non-commercial transitory viewing only. This is the grant of a license, not a transfer
      of title.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">3. Disclaimer</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      The materials on {html.escape(brand)} are provided on an "as is" basis.
      {html.escape(brand)} makes no warranties, expressed or implied, and hereby disclaims
      and negates all other warranties including, without limitation, implied warranties or
      conditions of merchantability, fitness for a particular purpose.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">4. Limitations</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      In no event shall {html.escape(brand)} or its suppliers be liable for any damages
      arising out of the use or inability to use the materials on {html.escape(brand)}'s
      website.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">5. Governing Law</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      These terms and conditions are governed by and construed in accordance with applicable
      laws, and you irrevocably submit to the exclusive jurisdiction of the courts in that
      jurisdiction.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">6. Contact</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      Questions about the Terms of Service should be sent to us at
      {('<a href="mailto:' + html.escape(contact_email) + '" style="color:var(--accent)">' + html.escape(contact_email) + '</a>') if contact_email else 'our support email'}.
    </p>

    <div class="wow fadeInUp" style="margin-top:3rem">
      <a href="/" class="btn btn-secondary">Back to Home</a>
    </div>
  </div>
</main>"""

        return f"""{head}
<body>
{nav}
{body_content}
{footer}
{back_to_top}
{scripts}
</body>
</html>"""

    def generate_cookies(self) -> str:
        brand = self.site["brand_name"]
        domain = self.site["domain"]
        base = f"https://{domain}"
        contact_email = self.site.get("contact_email", "")
        title = self._meta_title(page="Cookie Policy")
        description = f"Cookie Policy for {brand}. Learn how we use cookies."
        canonical = f"{base}/cookies.html"

        extra_schemas = [
            self._json_ld_breadcrumbs([
                (brand, f"{base}/"),
                ("Cookie Policy", canonical),
            ])
        ]
        head = self._head(title, description, canonical, extra_schema=extra_schemas, page="cookies.html")
        nav = self._nav()
        footer = self._footer()
        scripts = self._scripts()
        back_to_top = self._back_to_top()

        body_content = f"""<main id="main-content" style="padding-top:6rem">
  <div class="container section">
    <h1 class="gradient-text wow fadeInUp">Cookie Policy</h1>
    <p class="wow fadeInUp" data-wow-delay="0.1s" style="color:var(--text-secondary);margin-top:0.5rem">
      Last updated: {date.today().isoformat()}
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">What Are Cookies</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      Cookies are small text files that are placed on your computer by websites that you
      visit. They are widely used to make websites work, or work more efficiently, as well
      as to provide information to the owners of the site.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">How We Use Cookies</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      {html.escape(brand)} uses cookies for the following purposes:
    </p>
    <ul class="wow fadeInUp" data-wow-delay="0.4s" style="margin-top:1rem;padding-left:1.5rem;color:var(--text-secondary)">
      <li style="margin-bottom:0.5rem"><strong>Necessary cookies:</strong> Required for the website to function properly. These include session management and language preference cookies.</li>
      <li style="margin-bottom:0.5rem"><strong>Analytics cookies:</strong> Help us understand how visitors interact with our website by collecting and reporting information anonymously.</li>
      <li style="margin-bottom:0.5rem"><strong>Marketing cookies:</strong> Used to track visitors across websites to display relevant advertisements.</li>
    </ul>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">Managing Cookies</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      You can control and/or delete cookies as you wish. You can delete all cookies that are
      already on your computer and you can set most browsers to prevent them from being
      placed. Use the cookie consent panel at the bottom of this page to manage your
      preferences.
    </p>

    <h2 class="wow fadeInUp" data-wow-delay="0.2s" style="margin-top:2.5rem">Contact</h2>
    <p class="wow fadeInUp" data-wow-delay="0.3s">
      For questions about our cookie policy, contact us at
      {('<a href="mailto:' + html.escape(contact_email) + '" style="color:var(--accent)">' + html.escape(contact_email) + '</a>') if contact_email else 'our support email'}.
    </p>

    <div class="wow fadeInUp" style="margin-top:3rem">
      <a href="/" class="btn btn-secondary">Back to Home</a>
    </div>
  </div>
</main>"""

        return f"""{head}
<body>
{nav}
{body_content}
{footer}
{back_to_top}
{scripts}
</body>
</html>"""
