import json, re, zipfile
from pathlib import Path
from datetime import date

ROOT = Path(__file__).parent
PUBLIC = ROOT / "public"
OUT = ROOT.parents[1] / "outputs" / "aimars-premium-hub-v3.zip"
SITE = "https://aimars.online"
TODAY = date.today().isoformat()

TOOLS = json.loads((PUBLIC / "tools.json").read_text(encoding="utf-8"))

NAV = """<nav class="nav nav-premium"><div class="wrap nav-inner"><a class="brand" href="index.html"><span class="mark">AI</span><span>AIMars</span></a><button class="nav-toggle" aria-label="Open menu">Menu</button><div class="links"><a href="models.html">Models</a><a href="tools.html">Tools</a><a href="rankings.html">Rankings</a><a href="compare.html">Compare</a><a href="categories.html">Categories</a><a href="best-free-ai-tools.html">Free Tools</a><a href="ai-image-generator.html">Image Generator</a><a href="blog.html">Blog</a><a class="btn primary unlock-nav" href="unlock-free-ai-tools.html" data-track="cta_unlock_click">Unlock</a></div></div></nav>"""
NAV_SUB = NAV.replace('href="index.html"', 'href="../index.html"').replace('href="models.html"', 'href="../models.html"').replace('href="tools.html"', 'href="../tools.html"').replace('href="rankings.html"', 'href="../rankings.html"').replace('href="compare.html"', 'href="../compare.html"').replace('href="categories.html"', 'href="../categories.html"').replace('href="best-free-ai-tools.html"', 'href="../best-free-ai-tools.html"').replace('href="ai-image-generator.html"', 'href="../ai-image-generator.html"').replace('href="blog.html"', 'href="../blog.html"').replace('href="unlock-free-ai-tools.html"', 'href="../unlock-free-ai-tools.html"')

def esc(s):
    return str(s).replace("&","&amp;").replace("<","&lt;").replace(">","&gt;").replace('"',"&quot;")

def slug(s):
    return re.sub(r"[^a-z0-9]+", "-", s.lower()).strip("-")

def schema(obj):
    return '<script type="application/ld+json">' + json.dumps(obj, separators=(",",":")) + "</script>"

def write(rel, text):
    p = PUBLIC / rel
    p.parent.mkdir(parents=True, exist_ok=True)
    p.write_text(text, encoding="utf-8")

def head(path, title, desc, extra=()):
    url = SITE + ("/" if path == "index.html" else "/" + path)
    return f"""<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><title>{esc(title)}</title><meta name="description" content="{esc(desc)}"><meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large"><link rel="canonical" href="{url}"><meta property="og:title" content="{esc(title)}"><meta property="og:description" content="{esc(desc)}"><meta property="og:type" content="website"><meta property="og:url" content="{url}"><meta property="og:image" content="{SITE}/og-image.svg"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="{esc(title)}"><meta name="twitter:description" content="{esc(desc)}"><meta name="twitter:image" content="{SITE}/og-image.svg"><meta name="theme-color" content="#050816"><link rel="preload" href="css/style.css" as="style"><link rel="stylesheet" href="css/style.css"><link rel="icon" href="og-image.svg" type="image/svg+xml">{''.join(schema(x) for x in extra)}</head>"""

def footer():
    return """<a class="btn primary floating" href="unlock-free-ai-tools.html" data-track="cta_unlock_click">Free AI Tools</a><div class="mobile-cta"><a class="btn primary" href="unlock-free-ai-tools.html" data-track="cta_unlock_click">Unlock Free AI List</a></div><div class="modal" id="exitModal"><div class="modal-box glass-card"><button class="x" data-close-modal aria-label="Close">x</button><span class="tag">Free resource</span><h2>Unlock the curated free AI tools list</h2><p class="muted">Get recommended free tools, trial links, and alternatives before you leave.</p><form class="form" data-email-form data-source-cta="exit-intent"><input type="email" required placeholder="Email address"><button class="btn primary" type="submit">Get the list</button></form><p class="notice">Some links may be sponsored. We may earn from qualifying actions.</p></div></div><footer class="footer"><div class="wrap footer-grid"><div><p><strong>AIMars</strong></p><p class="notice">Discover, compare, rank, and unlock AI tools and models.</p></div><p class="notice">Disclosure: Some links may be sponsored. We may earn from qualifying actions.</p></div></footer><script src="config.js"></script><script src="js/app.js" defer></script>"""

def page(path, title, desc, body, extra=()):
    return f'<!doctype html><html lang="en">{head(path,title,desc,extra)}<body>{NAV}{body}{footer()}</body></html>'

def tool_card(t, rank=None):
    badge = f'<span class="rank-badge">#{rank}</span>' if rank else '<span class="rank-badge soft">Featured</span>'
    return f"""<article class="card glass-card tool-card premium-tool" data-tool-card><div class="tool-top"><div class="avatar">{esc(t['name'][:2].upper())}</div><div><h3>{esc(t['name'])}</h3><span class="tag">{esc(t['category'])}</span></div>{badge}</div><p class="muted">{esc(t['short_description'])}</p><div class="tool-metrics"><span>{t.get('rating',0)}/5</span><span>{esc(t.get('free_plan','Unknown'))}</span><span>Verified {esc(t.get('last_verified',''))}</span></div><div class="card-actions"><a class="btn secondary" href="tools/{t['slug']}.html">Details</a><a class="btn primary" href="{esc(t['official_url'])}" rel="sponsored noopener" target="_blank" data-track="tool_visit_click">Visit</a></div></article>"""

def dev_table(items):
    rows = "".join(f"""<tr><td><span class="rank-badge">#{i}</span></td><td><strong>{esc(t['name'])}</strong><small>{esc(t['category'])}</small></td><td>{esc(t['best_for'])}</td><td>{esc(t['free_plan'])}</td><td>{t.get('rating',0)}/5</td><td><a href="tools/{t['slug']}.html">Open</a></td></tr>""" for i,t in enumerate(items,1))
    return f"""<div class="table-wrap dev-table"><table><thead><tr><th>Rank</th><th>Tool</th><th>Best for</th><th>Free</th><th>Score</th><th></th></tr></thead><tbody>{rows}</tbody></table></div>"""

def premium_css():
    css = PUBLIC / "css/style.css"
    add = r"""
/* Premium discovery hub layer */
:root{--bg:#050816;--panel:#0a1020;--panel2:#0f172a;--glass:rgba(255,255,255,.065);--glass2:rgba(255,255,255,.04);--line:rgba(148,163,184,.18);--text:#f8fafc;--muted:#94a3b8;--soft:#dbeafe;--cyan:#67e8f9;--pink:#c084fc;--lime:#86efac;--amber:#fbbf24;--blue:#60a5fa;--shadow:0 24px 90px rgba(0,0,0,.34)}body{background:linear-gradient(180deg,#050816 0%,#070b16 45%,#050816 100%);font-size:15px}.nav-premium{background:rgba(5,8,22,.78);border-bottom:1px solid rgba(148,163,184,.14)}.nav-inner{height:74px}.brand{font-size:15px;letter-spacing:.2px}.mark{background:linear-gradient(135deg,#67e8f9,#a78bfa 52%,#f0abfc);box-shadow:0 0 26px rgba(103,232,249,.16)}.links{gap:6px}.links a{padding:9px 10px;border-radius:8px;color:#b6c2d6;font-size:13px}.links a:hover{background:rgba(255,255,255,.06);color:#fff}.unlock-nav{margin-left:4px}.glass-card{background:linear-gradient(180deg,rgba(255,255,255,.075),rgba(255,255,255,.035));border:1px solid rgba(148,163,184,.16);box-shadow:0 20px 70px rgba(0,0,0,.24);backdrop-filter:blur(16px)}.hero-premium{padding:86px 0 38px;position:relative;overflow:hidden}.hero-premium:before{content:"";position:absolute;inset:-20%;background:radial-gradient(circle at 18% 18%,rgba(96,165,250,.18),transparent 28rem),radial-gradient(circle at 80% 20%,rgba(192,132,252,.14),transparent 24rem);animation:premiumDrift 12s ease-in-out infinite alternate;pointer-events:none}.hero-premium .wrap{position:relative}.hero-panel{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(340px,.92fr);gap:22px;align-items:stretch}.hero-copy{padding:12px 0}.hero-copy h1{max-width:900px;font-size:clamp(42px,6vw,82px);line-height:.96}.hero-copy .lead{max-width:780px;color:#cbd5e1}.hero-search{margin:30px 0 18px;max-width:820px;background:rgba(15,23,42,.72);border:1px solid rgba(148,163,184,.18);border-radius:8px;padding:10px;display:flex;gap:10px;box-shadow:0 22px 80px rgba(0,0,0,.28)}.hero-search input{flex:1;background:transparent;border:0;outline:0;color:var(--text);font-size:18px;padding:12px}.hero-visual{min-height:430px;padding:16px;position:relative;overflow:hidden}.matrix-lines{position:absolute;inset:0;background:linear-gradient(rgba(255,255,255,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.035) 1px,transparent 1px);background-size:42px 42px;mask-image:linear-gradient(to bottom,#000,transparent);opacity:.7}.model-stack{position:relative;display:grid;gap:12px;margin-top:26px}.model-row{display:grid;grid-template-columns:42px 1fr auto;gap:12px;align-items:center;padding:13px;border-radius:8px;background:rgba(2,6,23,.54);border:1px solid rgba(148,163,184,.14);animation:floatIn 600ms ease both}.model-row:nth-child(2){animation-delay:90ms}.model-row:nth-child(3){animation-delay:180ms}.model-row:nth-child(4){animation-delay:270ms}.model-icon{width:42px;height:42px;border-radius:8px;display:grid;place-items:center;background:linear-gradient(135deg,rgba(103,232,249,.9),rgba(192,132,252,.9));color:#06101a;font-weight:950}.score{font-family:ui-monospace,Menlo,Consolas,monospace;color:#86efac}.stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-top:22px}.stat-card{padding:16px}.stat-card strong{display:block;font-size:28px;line-height:1}.stat-card span{color:var(--muted);font-size:13px}.hub-section{padding:44px 0}.section-kicker{color:var(--cyan);font-size:12px;text-transform:uppercase;letter-spacing:.16em;font-weight:900}.section-head h2{font-size:clamp(25px,3vw,42px)}.tools-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.premium-tool{min-height:270px}.rank-badge{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:28px;border-radius:999px;background:rgba(134,239,172,.13);border:1px solid rgba(134,239,172,.28);color:#bbf7d0;font-weight:900;font-size:12px}.rank-badge.soft{background:rgba(96,165,250,.12);border-color:rgba(96,165,250,.28);color:#bfdbfe}.tool-metrics{display:flex;gap:8px;flex-wrap:wrap}.tool-metrics span{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;color:#cbd5e1;background:rgba(15,23,42,.72);border:1px solid rgba(148,163,184,.12);border-radius:999px;padding:5px 8px}.card-actions{display:flex;gap:8px;margin-top:auto}.dev-table table{font-family:ui-sans-serif,system-ui}.dev-table th{font-family:ui-monospace,Menlo,Consolas,monospace;color:#94a3b8}.dev-table td small{display:block;color:#64748b;margin-top:2px}.category-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.category-card{min-height:150px}.comparison-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:14px}.cta-premium{background:linear-gradient(135deg,rgba(96,165,250,.14),rgba(192,132,252,.12));border-block:1px solid rgba(148,163,184,.14)}.generator-preview{display:grid;grid-template-columns:1fr 1fr;gap:12px}.preview-art{min-height:260px;border-radius:8px;background:radial-gradient(circle at 30% 25%,rgba(103,232,249,.55),transparent 12rem),radial-gradient(circle at 75% 70%,rgba(192,132,252,.55),transparent 13rem),#08111f;border:1px solid rgba(148,163,184,.16);position:relative;overflow:hidden}.preview-art:after{content:"";position:absolute;inset:18px;border:1px solid rgba(255,255,255,.12);border-radius:8px;background:linear-gradient(135deg,transparent,rgba(255,255,255,.06));animation:pulseFrame 3s ease-in-out infinite}.faq-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.footer-grid{display:flex;justify-content:space-between;gap:20px}.floating,.mobile-cta .btn{box-shadow:0 12px 42px rgba(96,165,250,.18)}@keyframes premiumDrift{to{transform:translate3d(2%,1%,0) scale(1.02)}}@keyframes floatIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}@keyframes pulseFrame{50%{opacity:.55;transform:scale(.985)}}@media(max-width:1080px){.tools-grid,.category-grid{grid-template-columns:repeat(2,1fr)}.hero-panel,.comparison-grid,.generator-preview{grid-template-columns:1fr}.hero-visual{min-height:330px}.stats-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:880px){.nav-inner{height:66px}.links{gap:8px}.links a{width:100%;padding:10px 12px}.hero-premium{padding-top:54px}.hero-search{flex-direction:column}.hero-search .btn{width:100%}.faq-grid{grid-template-columns:1fr}.footer-grid{display:block}}@media(max-width:560px){.tools-grid,.category-grid,.stats-grid{grid-template-columns:1fr}.hero-copy h1{font-size:42px}.hero-visual{min-height:300px;padding:12px}.model-row{grid-template-columns:36px 1fr}.score{display:none}.card-actions{flex-direction:column}.card-actions .btn{width:100%}}
"""
    path = PUBLIC / "css/style.css"
    s = path.read_text(encoding="utf-8")
    if "Premium discovery hub layer" not in s:
        path.write_text(s + "\n" + add, encoding="utf-8")

def update_navs():
    for f in PUBLIC.rglob("*.html"):
        if f.name == "admin.html":
            continue
        s = f.read_text(encoding="utf-8")
        nav = NAV_SUB if f.parent.name == "tools" else NAV
        s = re.sub(r'<nav class="nav.*?</nav>', nav, s, count=1, flags=re.S)
        f.write_text(s, encoding="utf-8")

def homepage():
    featured = TOOLS[:8]
    rankings = sorted(TOOLS, key=lambda x: x.get("rating", 0), reverse=True)[:8]
    cats = [
        ("AI Models", "Language, research, reasoning and multimodal assistants.", "models.html"),
        ("Image Generators", "Prompt-to-image tools, design assistants and creative APIs.", "best-ai-image-generators.html"),
        ("Coding Assistants", "Editors, copilots and codebase-aware agents.", "best-ai-tools-for-coding.html"),
        ("Business AI", "Automation, marketing, research and operations tools.", "ai-tools-for-business.html"),
        ("Student Tools", "Study, notes, research and presentation workflows.", "best-ai-tools-for-students.html"),
        ("Video Tools", "AI video generators and creator production tools.", "best-ai-video-generators.html"),
        ("No Signup", "Fast-access tools and public demos.", "best-ai-tools-without-signup.html"),
        ("Alternatives", "Compare ChatGPT, Midjourney, Canva AI and more.", "chatgpt-alternatives.html"),
    ]
    faqs = [
        ("What is AIMars?", "AIMars is a premium AI discovery hub for finding, comparing, ranking, and unlocking AI tools and AI models."),
        ("Does AIMars include free tools?", "Yes. AIMars highlights free plans, trials, no-signup options, and curated free AI tool lists."),
        ("Are links sponsored?", "Some links may be sponsored. We disclose monetization and keep ranking criteria focused on usefulness, freshness, and product fit."),
    ]
    body = f"""<main><section class="hero-premium"><div class="wrap"><div class="hero-panel"><div class="hero-copy"><span class="eyebrow">AIMars - premium AI discovery hub</span><h1>Discover, Compare & Unlock the Best AI Tools</h1><p class="lead">Explore free AI tools, AI models, image generators, coding assistants, video tools, and ChatGPT alternatives in one premium AI discovery hub.</p><div class="hero-search"><input data-search placeholder="Search AI tools, models, alternatives..." aria-label="Search AI tools, models, alternatives"><a class="btn primary" href="#featured">Search</a></div><div class="hero-actions"><a class="btn primary" href="tools.html">Explore AI Tools</a><a class="btn secondary" href="unlock-free-ai-tools.html" data-track="cta_unlock_click">Unlock Free AI List</a></div><div class="stats-grid"><div class="stat-card glass-card"><strong>100+</strong><span>AI tools indexed</span></div><div class="stat-card glass-card"><strong>50+</strong><span>free tools</span></div><div class="stat-card glass-card"><strong>20+</strong><span>categories</span></div><div class="stat-card glass-card"><strong>Daily</strong><span>updated signals</span></div></div></div><div class="hero-visual glass-card"><div class="matrix-lines"></div><div class="model-stack">{''.join(f'<div class="model-row"><div class="model-icon">{esc(t["name"][:2].upper())}</div><div><strong>{esc(t["name"])}</strong><p class="muted">{esc(t["category"])}</p></div><span class="score">{t.get("rating",0)}/5</span></div>' for t in rankings[:4])}</div></div></div></div></section><section class="hub-section" id="featured"><div class="wrap"><div class="section-head"><div><span class="section-kicker">Featured</span><h2>Featured AI tools and models</h2><p class="muted">A curated, search-first directory with rankings, free-plan signals and verified tool pages.</p></div><a class="btn ghost" href="tools.html">View all tools</a></div><div class="tools-grid">{''.join(tool_card(t) for t in featured)}</div></div></section><section class="hub-section"><div class="wrap"><div class="section-head"><div><span class="section-kicker">Rankings</span><h2>Rankings preview</h2><p class="muted">Developer-style tables for quick comparison without noisy affiliate clutter.</p></div><a class="btn ghost" href="rankings.html">Open rankings</a></div>{dev_table(rankings)}</div></section><section class="hub-section"><div class="wrap"><div class="section-head"><div><span class="section-kicker">Categories</span><h2>Explore AI by category</h2></div><a class="btn ghost" href="categories.html">All categories</a></div><div class="category-grid">{''.join(f'<a class="card glass-card category-card" href="{href}"><h3>{esc(name)}</h3><p class="muted">{esc(desc)}</p></a>' for name,desc,href in cats)}</div></div></section><section class="hub-section"><div class="wrap comparison-grid"><div class="card glass-card"><span class="section-kicker">Compare</span><h2>Comparison preview</h2><p class="muted">Compare general assistants, image generators, coding tools and business AI by free plan, best use case, score, and official destination.</p>{dev_table(rankings[:5])}</div><div class="card glass-card"><span class="section-kicker">Unlock</span><h2>Free AI tools list</h2><p class="muted">Unlock a curated list of free AI tools and trial links without the cheap CPA look. The flow stays honest: value first, disclosure always.</p><form class="form" data-email-form data-source-cta="homepage-free-list"><input type="email" required placeholder="Email address"><button class="btn primary" type="submit">Unlock Free AI List</button></form><p class="notice">Some links may be sponsored. We may earn from qualifying actions.</p></div></div></section><section class="hub-section"><div class="wrap generator-preview"><div><span class="section-kicker">Generator</span><h2>AI image generator preview</h2><p class="muted">Try demo generation with provider-ready hooks for OpenAI Images, Stability AI, Hugging Face and Replicate.</p><a class="btn primary" href="ai-image-generator.html">Open Image Generator</a></div><div class="preview-art"></div></div></section><section class="hub-section"><div class="wrap"><div class="split"><div class="card glass-card"><span class="section-kicker">Trust</span><h2>Why trust AIMars</h2><p class="muted">AIMars separates discovery from monetization. We track free plans, pricing, launch metadata, public activity signals, and verified tool pages before recommending a click.</p></div><div class="card glass-card"><span class="section-kicker">Method</span><h2>How rankings work</h2><ol class="list rank-box"><li>Usefulness of the free plan or trial.</li><li>Quality and fit for the target workflow.</li><li>Freshness from public product, model and repository signals.</li><li>Clear official links and transparent monetization disclosure.</li></ol></div></div></div></section><section class="hub-section"><div class="wrap"><div class="section-head"><div><span class="section-kicker">FAQ</span><h2>Questions before you pick a tool</h2></div></div><div class="faq-grid">{''.join(f'<details class="glass-card"><summary>{esc(q)}</summary><p class="muted">{esc(a)}</p></details>' for q,a in faqs)}</div></div></section><section class="hub-section cta-premium"><div class="wrap split"><div><span class="section-kicker">Start</span><h2>Build your AI stack from one premium hub</h2><p class="muted">Search tools, scan rankings, compare alternatives and unlock curated free trials.</p></div><div class="hero-actions"><a class="btn primary" href="tools.html">Explore AI Tools</a><a class="btn secondary" href="unlock-free-ai-tools.html" data-track="cta_unlock_click">Unlock Free AI List</a></div></div></section></main>"""
    extra = [
        {"@context":"https://schema.org","@type":"WebSite","name":"AIMars","url":SITE,"description":"Premium AI discovery hub for AI tools, models, rankings, comparisons and free AI lists.","potentialAction":{"@type":"SearchAction","target":SITE+"/?q={search_term_string}","query-input":"required name=search_term_string"}},
        {"@context":"https://schema.org","@type":"ItemList","name":"Featured AI tools and models","itemListElement":[{"@type":"ListItem","position":i+1,"name":t["name"],"url":SITE+"/tools/"+t["slug"]+".html"} for i,t in enumerate(featured)]},
        {"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":q,"acceptedAnswer":{"@type":"Answer","text":a}} for q,a in faqs]},
    ]
    write("index.html", page("index.html", "AIMars - Discover, Compare & Unlock the Best AI Tools", "Explore free AI tools, AI models, image generators, coding assistants, video tools and ChatGPT alternatives in one premium AI discovery hub.", body, extra))

def simple_pages():
    rankings = sorted(TOOLS, key=lambda x: x.get("rating", 0), reverse=True)
    cats = {}
    for t in TOOLS:
        cats.setdefault(t["category"], []).append(t)
    pages = {
        "models.html": ("AI Models | AIMars", "Discover AI models and assistants ranked by use case, free plan and verified status.", "Models", "Language models, research assistants and multimodal AI systems.", [t for t in TOOLS if any(k in t["category"].lower() for k in ("writing","research","students"))]),
        "tools.html": ("AI Tools Directory | AIMars", "Browse AIMars AI tools directory with search-first cards, rankings and official links.", "Tools", "Browse the full AIMars discovery directory.", TOOLS),
        "rankings.html": ("AI Tool Rankings | AIMars", "Rank AI tools by score, free plan, use case and verified metadata.", "Rankings", "A developer-style ranking table for fast AI tool decisions.", rankings),
    }
    for file, (title, desc, h1, lead, items) in pages.items():
        body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">AIMars hub</span><h1>{h1}</h1><p class="lead">{lead}</p><div class="hero-search"><input data-search placeholder="Search AI tools, models, alternatives..."><a class="btn primary" href="#directory">Search</a></div></div></section><section class="hub-section" id="directory"><div class="wrap"><div class="section-head"><div><span class="section-kicker">{h1}</span><h2>{len(items)} indexed entries</h2></div></div>{dev_table(items[:16])}<div class="tools-grid" style="margin-top:16px">{''.join(tool_card(t) for t in items[:12])}</div></div></section></main>"""
        write(file, page(file, title, desc, body, [{"@context":"https://schema.org","@type":"ItemList","name":h1,"itemListElement":[{"@type":"ListItem","position":i+1,"name":t["name"],"url":SITE+"/tools/"+t["slug"]+".html"} for i,t in enumerate(items[:16])]}]))
    compare_body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Compare</span><h1>Compare AI tools side by side</h1><p class="lead">Scan free plans, ratings, best-for signals and official destinations before you commit to a tool.</p></div></section><section class="hub-section"><div class="wrap">{dev_table(rankings[:12])}<div class="category-grid" style="margin-top:16px"><a class="card glass-card" href="chatgpt-alternatives.html"><h3>ChatGPT alternatives</h3><p class="muted">Compare assistants for writing, research and reasoning.</p></a><a class="card glass-card" href="midjourney-alternatives.html"><h3>Midjourney alternatives</h3><p class="muted">Compare image generation workflows.</p></a><a class="card glass-card" href="canva-ai-alternatives.html"><h3>Canva AI alternatives</h3><p class="muted">Compare design and marketing AI tools.</p></a><a class="card glass-card" href="best-ai-tools-for-coding.html"><h3>Coding assistants</h3><p class="muted">Compare code editors and copilots.</p></a></div></div></section></main>"""
    write("compare.html", page("compare.html", "Compare AI Tools | AIMars", "Compare AI tools, models, alternatives, ratings and free plans.", compare_body))
    cat_body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Categories</span><h1>Explore AI categories</h1><p class="lead">Find tools by workflow: models, coding, image generation, video, business, student productivity and alternatives.</p></div></section><section class="hub-section"><div class="wrap"><div class="category-grid">{''.join(f'<a class="card glass-card category-card" href="tools.html"><h3>{esc(cat)}</h3><p class="muted">{len(items)} indexed tools. Open the directory and search this category.</p></a>' for cat,items in cats.items())}</div></div></section></main>"""
    write("categories.html", page("categories.html", "AI Tool Categories | AIMars", "Browse AI tool categories for models, image generators, coding assistants, business AI and more.", cat_body))
    blog_cards = [
        ("best-free-ai-tools.html","Best Free AI Tools","Free-plan picks and trial links."),
        ("best-ai-image-generators.html","Best AI Image Generators","Image tools by quality, workflow and safety."),
        ("chatgpt-alternatives.html","ChatGPT Alternatives","Assistants and specialists worth comparing."),
        ("best-ai-tools-for-coding.html","Best AI Tools for Coding","Editors, copilots and agents."),
        ("ai-tools-for-business.html","AI Tools for Business","Operational and marketing AI stacks."),
        ("best-ai-tools-for-students.html","AI Tools for Students","Research, study and presentation tools."),
    ]
    blog_body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Blog</span><h1>AI guides and rankings</h1><p class="lead">Original AIMars guides for free tools, alternatives, AI models and workflow-specific discovery.</p></div></section><section class="hub-section"><div class="wrap"><div class="tools-grid">{''.join(f'<a class="card glass-card" href="{href}"><span class="tag">Guide</span><h3>{esc(title)}</h3><p class="muted">{esc(desc)}</p></a>' for href,title,desc in blog_cards)}</div></div></section></main>"""
    write("blog.html", page("blog.html", "AI Guides & Blog | AIMars", "Read AIMars guides to free AI tools, alternatives, image generators, coding assistants and business AI.", blog_body))

def sitemap():
    sm = PUBLIC / "sitemap.xml"
    s = sm.read_text(encoding="utf-8")
    for file in ["models.html","tools.html","rankings.html","compare.html","categories.html","blog.html"]:
        loc = SITE + "/" + file
        if loc not in s:
            s = s.replace("</urlset>", f'<url><loc>{loc}</loc><lastmod>{TODAY}</lastmod><changefreq>weekly</changefreq><priority>0.9</priority></url>\n</urlset>')
    sm.write_text(s, encoding="utf-8")

def package():
    if OUT.exists():
        OUT.unlink()
    with zipfile.ZipFile(OUT, "w", zipfile.ZIP_DEFLATED) as z:
        for base in ("public","scripts"):
            root = ROOT / base
            if root.exists():
                for f in root.rglob("*"):
                    if f.is_file():
                        z.write(f, f.relative_to(ROOT))
        for name in ("SETUP_GUIDE.md","build_upgrade.py","phase2_upgrade.py","phase3_premium_hub.py"):
            f = ROOT / name
            if f.exists():
                z.write(f, f.relative_to(ROOT))

def main():
    premium_css()
    update_navs()
    homepage()
    simple_pages()
    sitemap()
    package()
    print(OUT)

if __name__ == "__main__":
    main()
