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-v4.zip"
SITE = "https://aimars.online"
TODAY = date.today().isoformat()

PROVIDERS = ["OpenAI","Anthropic","Google","Meta","Mistral","DeepSeek","Hugging Face","Stability AI","Runway","ElevenLabs"]

PROVIDER_MAP = {
    "chatgpt": "OpenAI", "dalle": "OpenAI", "claude": "Anthropic", "gemini": "Google",
    "notebooklm": "Google", "midjourney": "Midjourney", "adobe-firefly": "Adobe",
    "canva-ai": "Canva", "runway": "Runway", "pika": "Pika", "cursor": "Cursor",
    "github-copilot": "GitHub", "windsurf": "Windsurf", "elevenlabs": "ElevenLabs",
    "perplexity": "Perplexity", "zapier-ai": "Zapier"
}

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="providers.html">Providers</a><a href="rankings.html">Rankings</a><a href="compare.html">Compare</a><a href="categories.html">Categories</a><a href="pricing.html">Pricing</a><a href="developers.html">Developers</a><a href="ai-tool-finder.html">Finder</a><a href="submit-tool.html">Submit</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"')
for name in ["models","tools","providers","rankings","compare","categories","pricing","developers","ai-tool-finder","submit-tool","best-free-ai-tools","ai-image-generator","blog","unlock-free-ai-tools"]:
    NAV_SUB = NAV_SUB.replace(f'href="{name}.html"', f'href="../{name}.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]+", "-", str(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 read_tools():
    return json.loads((PUBLIC / "tools.json").read_text(encoding="utf-8"))

def save_tools(tools):
    (PUBLIC / "tools.json").write_text(json.dumps(tools, indent=2, ensure_ascii=False), encoding="utf-8")

def infer_type(t):
    c = (t.get("category","") + " " + t.get("best_for","")).lower()
    if any(x in c for x in ["model","research","writing","students"]): return "model"
    if "image" in c: return "image_generator"
    if "video" in c: return "video_tool"
    if "coding" in c or "code" in c: return "coding_assistant"
    if "business" in c or "automation" in c: return "business_tool"
    return "ai_tool"

def pricing_type(t):
    text = (t.get("pricing","") + " " + t.get("free_plan","")).lower()
    if "free" in text and ("paid" in text or "$" in text or "plus" in text or "pro" in text): return "freemium"
    if "free" in text: return "free"
    if "paid" in text or "$" in text: return "paid"
    return "unknown"

def upgrade_tools():
    tools = read_tools()
    for i, t in enumerate(tools, 1):
        p = PROVIDER_MAP.get(t.get("slug"), t.get("provider") or t.get("name","").split()[0])
        t.setdefault("id", i)
        t.setdefault("type", infer_type(t))
        t.setdefault("provider", p)
        t.setdefault("website_url", t.get("official_url") or t.get("affiliate_url") or "")
        t.setdefault("logo", f"assets/logos/{slug(p)}.svg")
        t.setdefault("pricing_type", pricing_type(t))
        t.setdefault("input_price", None)
        t.setdefault("output_price", None)
        t.setdefault("context_length", "Unknown")
        base = int(float(t.get("rating", 0)) * 20)
        if t.get("trending"): base += 5
        if t.get("featured"): base += 4
        t.setdefault("popularity_score", min(100, base))
        t.setdefault("ranking_score", min(100, base + (3 if t.get("free_plan","").lower().startswith("yes") else 0)))
        tags = set(t.get("tags") or [])
        for part in re.split(r"[,/ ]+", t.get("category","")):
            if part and len(part) > 2:
                tags.add(part.lower())
        tags.add(t["type"])
        tags.add(t["provider"].lower().replace(" ", "-"))
        t["tags"] = sorted(tags)
        for key in ("cpa_url","affiliate_url","manual_cpa_url","manual_affiliate_url","pending_review","featured","trending"):
            t.setdefault(key, "" if "url" in key else False)
    save_tools(tools)
    return tools

def head(path, title, desc, extra=()):
    url = SITE + "/" + 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="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 card(t):
    price = t.get("pricing_type","unknown")
    return f"""<article class="card glass-card tool-card premium-tool" data-tool-card data-type="{esc(t.get('type',''))}" data-provider="{esc(t.get('provider',''))}" data-tags="{esc(' '.join(t.get('tags',[])))}"><div class="tool-top"><div class="avatar">{esc(t['name'][:2].upper())}</div><div><h3>{esc(t['name'])}</h3><span class="tag">{esc(t.get('provider','Unknown'))}</span></div><span class="rank-badge">#{int(t.get('ranking_score',0))}</span></div><p class="muted">{esc(t.get('short_description',''))}</p><div class="tool-metrics"><span>{esc(t.get('type','ai_tool'))}</span><span>{esc(price)}</span><span>{esc(t.get('context_length','Unknown'))}</span></div><div class="card-actions"><a class="btn secondary" href="tools/{t['slug']}.html">Details</a><a class="btn primary" href="{esc(t.get('website_url') or t.get('official_url','#'))}" target="_blank" rel="sponsored noopener" data-track="tool_visit_click">Visit</a></div></article>"""

def table(items):
    rows = "".join(f"""<tr><td><span class="rank-badge">#{i}</span></td><td><strong>{esc(t['name'])}</strong><small>{esc(t.get('provider',''))} / {esc(t.get('type',''))}</small></td><td>{esc(t.get('pricing_type',''))}</td><td>{esc(t.get('context_length','Unknown'))}</td><td>{esc(t.get('popularity_score',''))}</td><td>{esc(t.get('ranking_score',''))}</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>Name</th><th>Pricing</th><th>Context</th><th>Popularity</th><th>Score</th><th></th></tr></thead><tbody>{rows}</tbody></table></div>"""

def add_css():
    css = PUBLIC / "css/style.css"
    extra = """
.finder-quiz{display:grid;gap:14px}.quiz-options{display:flex;gap:8px;flex-wrap:wrap}.quiz-options label{border:1px solid rgba(148,163,184,.16);background:rgba(255,255,255,.05);border-radius:8px;padding:10px 12px;cursor:pointer}.submit-card textarea{min-height:120px}.provider-logo{width:42px;height:42px;border-radius:8px;display:grid;place-items:center;background:linear-gradient(135deg,rgba(103,232,249,.18),rgba(192,132,252,.18));border:1px solid rgba(148,163,184,.18);font-weight:950}.pricing-matrix{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.developer-code{font-family:ui-monospace,Menlo,Consolas,monospace;background:rgba(2,6,23,.75);border:1px solid rgba(148,163,184,.16);border-radius:8px;padding:16px;overflow:auto}.security-note{border-color:rgba(251,191,36,.3);background:rgba(251,191,36,.08)}@media(max-width:900px){.pricing-matrix{grid-template-columns:1fr 1fr}.nav-premium .links{max-height:calc(100vh - 84px);overflow:auto}}@media(max-width:560px){.pricing-matrix{grid-template-columns:1fr}.quiz-options{display:grid}.nav-premium .links a{font-size:13px}}
"""
    s = css.read_text(encoding="utf-8")
    if ".finder-quiz" not in s:
        css.write_text(s + "\n" + extra, encoding="utf-8")

def update_nav_all():
    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 rewrite_core_pages(tools):
    rankings = sorted(tools, key=lambda t: t.get("ranking_score", 0), reverse=True)
    pages = {
        "models.html": ("AI Models | AIMars", "Browse AI models and assistants by provider, context, pricing and ranking score.", "AI Models", [t for t in tools if t["type"] == "model"]),
        "tools.html": ("AI Tools Directory | AIMars", "Search the AIMars tool directory by provider, type, pricing, tags and ranking score.", "AI Tools Directory", tools),
        "rankings.html": ("AI Tool Rankings | AIMars", "Rank AI tools and models by popularity, provider, pricing and AIMars ranking score.", "AI Tool Rankings", rankings),
        "compare.html": ("Compare AI Tools & Models | AIMars", "Compare AI tools, providers, pricing, context length and ranking scores.", "Compare AI Tools & Models", rankings[:16]),
    }
    for file, (title, desc, h1, items) in pages.items():
        body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">AIMars data hub</span><h1>{h1}</h1><p class="lead">Search by provider, type, pricing, context length, popularity and ranking score.</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">Directory</span><h2>{len(items)} entries</h2></div><a class="btn ghost" href="ai-tool-finder.html">Use tool finder</a></div>{table(items[:20])}<div class="tools-grid" style="margin-top:16px">{''.join(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[:20])]}]))
    by_cat = {}
    for t in tools:
        by_cat.setdefault(t["category"], []).append(t)
    cat_body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Categories</span><h1>Explore AI categories</h1><p class="lead">Browse by workflow, provider, pricing type and model/tool category.</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"><span class="section-kicker">{len(v)} tools</span><h3>{esc(k)}</h3><p class="muted">Top provider: {esc(v[0].get("provider","Unknown"))}. Pricing types: {esc(", ".join(sorted(set(x.get("pricing_type","unknown") for x in v))))}</p></a>' for k,v in by_cat.items())}</div></div></section></main>"""
    write("categories.html", page("categories.html", "AI Tool Categories | AIMars", "Browse AI tool categories using upgraded provider, type and pricing data.", cat_body))

def provider_pages(tools):
    by_provider = {p: [] for p in PROVIDERS}
    for t in tools:
        p = t.get("provider","")
        if p in by_provider:
            by_provider[p].append(t)
    cards = []
    for p in PROVIDERS:
        items = by_provider[p]
        score = round(sum(x.get("ranking_score",0) for x in items)/len(items), 1) if items else "New"
        cards.append(f"""<article class="card glass-card"><div class="tool-top"><div class="provider-logo">{esc(p[:2].upper())}</div><div><h3>{esc(p)}</h3><p class="muted">{len(items)} indexed entries</p></div><span class="rank-badge soft">{score}</span></div><p class="muted">Provider page logic is ready for dedicated provider pages as the database grows. Current entries are listed below when available.</p>{''.join(f'<a class="btn ghost" href="tools/{x["slug"]}.html">{esc(x["name"])}</a>' for x in items[:3])}</article>""")
    body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Providers</span><h1>AI providers</h1><p class="lead">Explore tools and models by provider across OpenAI, Anthropic, Google, Meta, Mistral, DeepSeek, Hugging Face, Stability AI, Runway and ElevenLabs.</p></div></section><section class="hub-section"><div class="wrap"><div class="tools-grid">{''.join(cards)}</div></div></section></main>"""
    write("providers.html", page("providers.html", "AI Providers | AIMars", "Browse AI providers and their indexed tools, models, pricing and ranking data.", body))

def utility_pages(tools):
    pricing_body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Pricing</span><h1>AI pricing index</h1><p class="lead">Compare free, freemium, paid and unknown pricing models before choosing your AI stack.</p></div></section><section class="hub-section"><div class="wrap"><div class="pricing-matrix">{''.join(f'<div class="card glass-card"><span class="section-kicker">{kind}</span><h2>{sum(1 for t in tools if t.get("pricing_type")==kind)}</h2><p class="muted">Indexed {kind} entries.</p></div>' for kind in ["free","freemium","paid","unknown"])}</div>{table(tools[:16])}</div></section></main>"""
    write("pricing.html", page("pricing.html", "AI Tool Pricing | AIMars", "Compare AI tool pricing types, free plans, model prices and ranking scores.", pricing_body))
    dev_body = """<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Developers</span><h1>AIMars developer data</h1><p class="lead">Use the JSON directory and updater scripts to build provider pages, category pages and comparison surfaces.</p></div></section><section class="hub-section"><div class="wrap split"><div class="card glass-card"><h2>Public data files</h2><p class="muted">tools.json includes provider, type, pricing, context, tags and ranking scores. The update script imports public metadata as pending review.</p><pre class="developer-code">GET /tools.json\npython scripts/update_tools.py</pre></div><div class="card glass-card security-note"><h2>Launch security</h2><p class="muted">Change ADMIN_TOKEN in config.php before going live. Keep storage protected and review pending tools before featuring them.</p></div></div></section></main>"""
    write("developers.html", page("developers.html", "Developers | AIMars", "Developer notes for AIMars tools.json, public metadata updater scripts and API placeholders.", dev_body))

def finder_page(tools):
    body = f"""<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">AI tool finder</span><h1>Find your best AI tool</h1><p class="lead">Answer four quick questions and get recommended tools from the AIMars dataset.</p></div></section><section class="hub-section"><div class="wrap split"><form class="card glass-card finder-quiz" id="finderQuiz"><label>What do you need AI for?</label><select name="need"><option value="writing">Writing or research</option><option value="coding">Coding</option><option value="image">Images</option><option value="video">Video</option><option value="business">Business automation</option></select><label>Do you need a free tool?</label><select name="free"><option value="yes">Yes</option><option value="no">No</option></select><label>Do you want no signup?</label><select name="nosignup"><option value="no">No</option><option value="yes">Yes</option></select><label>Beginner or advanced?</label><select name="level"><option value="beginner">Beginner</option><option value="advanced">Advanced</option></select><button class="btn primary" type="submit">Show recommendations</button></form><div class="card glass-card"><h2>Recommended tools</h2><div id="finderResults"><p class="muted">Your matches will appear here.</p></div><a class="btn primary" href="unlock-free-ai-tools.html" data-track="cta_unlock_click">Unlock full free AI list</a></div></div></section></main><script id="finderData" type="application/json">{json.dumps(tools)}</script>"""
    write("ai-tool-finder.html", page("ai-tool-finder.html", "AI Tool Finder | AIMars", "Answer a short quiz to find recommended AI tools and models from the AIMars dataset.", body))

def submit_page():
    body = """<main><section class="hero-premium"><div class="wrap"><span class="eyebrow">Submit</span><h1>Submit an AI tool</h1><p class="lead">Suggest a tool for editorial review. Submissions are stored for review and do not become featured automatically.</p></div></section><section class="hub-section"><div class="wrap"><form class="card glass-card submit-card form" data-submit-tool-form data-source-cta="submit-tool"><input name="tool_name" required placeholder="Tool name"><input name="website_url" required type="url" placeholder="Website URL"><input name="category" required placeholder="Category"><textarea name="description" required placeholder="Description"></textarea><input name="pricing" placeholder="Pricing"><select name="free_plan"><option value="Yes">Free plan: Yes</option><option value="No">Free plan: No</option><option value="Unknown">Free plan: Unknown</option></select><input name="contact_email" required type="email" placeholder="Contact email"><button class="btn primary" type="submit">Submit for review</button><p class="notice">Submissions are marked for manual review. Sponsored links are disclosed.</p></form></div></section></main>"""
    write("submit-tool.html", page("submit-tool.html", "Submit an AI Tool | AIMars", "Submit an AI tool to AIMars for editorial review.", body))

def update_home_links():
    p = PUBLIC / "index.html"
    s = p.read_text(encoding="utf-8")
    if "Complete the hub" not in s:
        block = """<section class="hub-section"><div class="wrap"><div class="section-head"><div><span class="section-kicker">Explore</span><h2>Complete the hub</h2><p class="muted">Provider research, pricing scans, developer data and a guided finder are now part of AIMars.</p></div></div><div class="category-grid"><a class="card glass-card" href="providers.html"><h3>Providers</h3><p class="muted">Browse AI providers and indexed tools.</p></a><a class="card glass-card" href="pricing.html"><h3>Pricing</h3><p class="muted">Compare free, freemium and paid tools.</p></a><a class="card glass-card" href="developers.html"><h3>Developers</h3><p class="muted">Use tools.json and updater scripts.</p></a><a class="card glass-card" href="ai-tool-finder.html"><h3>AI Tool Finder</h3><p class="muted">Answer a quiz and get recommendations.</p></a><a class="card glass-card" href="submit-tool.html"><h3>Submit Tool</h3><p class="muted">Suggest a tool for review.</p></a></div></div></section>"""
        s = s.replace('<section class="hub-section cta-premium">', block + '<section class="hub-section cta-premium">', 1)
    p.write_text(s, encoding="utf-8")

def update_app_js():
    p = PUBLIC / "js/app.js"
    s = p.read_text(encoding="utf-8")
    if "data-submit-tool-form" not in s:
        s += r"""
document.addEventListener('submit',async e=>{if(!e.target.matches('[data-submit-tool-form]'))return;e.preventDefault();const form=e.target;const payload={type:'submission',date:new Date().toISOString(),page_url:location.href,user_agent:navigator.userAgent};for(const [k,v] of new FormData(form).entries())payload[k]=v;try{await fetch('submissions.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)})}catch(err){const rows=JSON.parse(localStorage.getItem('aimars_submissions_fallback')||'[]');rows.push(payload);localStorage.setItem('aimars_submissions_fallback',JSON.stringify(rows))}track('tool_submission_submit',{source_cta:'submit-tool'});form.innerHTML='<h2>Submission received</h2><p class="muted">Thanks. Your tool is queued for manual review.</p>'});
const finder=document.querySelector('#finderQuiz');if(finder){finder.addEventListener('submit',e=>{e.preventDefault();const data=JSON.parse(document.querySelector('#finderData').textContent);const fd=new FormData(finder);const need=fd.get('need'),free=fd.get('free'),level=fd.get('level');let picks=data.filter(t=>{const hay=(t.type+' '+t.category+' '+(t.tags||[]).join(' ')+' '+t.best_for).toLowerCase();let ok=hay.includes(need)||need==='writing'&&/model|research|writing/.test(hay)||need==='business'&&/business|automation/.test(hay);if(free==='yes')ok=ok&&(String(t.free_plan).toLowerCase().includes('yes')||t.pricing_type==='free'||t.pricing_type==='freemium');if(level==='beginner')ok=ok&&!/api|developer/.test(hay);return ok}).sort((a,b)=>(b.ranking_score||0)-(a.ranking_score||0)).slice(0,4);if(!picks.length)picks=data.slice(0,4);document.querySelector('#finderResults').innerHTML=picks.map(t=>`<article class="card glass-card"><h3>${t.name}</h3><p class="muted">${t.short_description}</p><a class="btn secondary" href="tools/${t.slug}.html">Open details</a></article>`).join('');track('ai_tool_finder_submit',{need,free,level})})}
"""
    p.write_text(s, encoding="utf-8")

def storage_security():
    storage = PUBLIC / "storage"
    storage.mkdir(exist_ok=True)
    for name in ["leads.json","events.json","submissions.json"]:
        old = PUBLIC / name
        new = storage / name
        if old.exists():
            new.write_text(old.read_text(encoding="utf-8"), encoding="utf-8")
        elif not new.exists():
            new.write_text("[]\n", encoding="utf-8")
    write("storage/.htaccess", "Require all denied\nDeny from all\n")
    write(".htaccess", """Options -Indexes
<FilesMatch "^(leads|events|submissions)\\.json$">
Require all denied
Deny from all
</FilesMatch>
<FilesMatch "^(config|admin)\\.php$">
Require all denied
Deny from all
</FilesMatch>
RedirectMatch 403 ^/scripts(/|$)
""")
    leads = PUBLIC / "leads.php"
    if leads.exists():
        s = leads.read_text(encoding="utf-8")
        s = s.replace("__DIR__ . ($type === 'lead' ? '/leads.json' : '/events.json')", "__DIR__ . ($type === 'lead' ? '/storage/leads.json' : '/storage/events.json')")
        leads.write_text(s, encoding="utf-8")
    write("submissions.php", """<?php
header('Content-Type: application/json');
$data = json_decode(file_get_contents('php://input'), true);
if (!$data) { http_response_code(400); echo json_encode(['ok'=>false,'error'=>'Invalid JSON']); exit; }
$email = filter_var($data['contact_email'] ?? '', FILTER_VALIDATE_EMAIL);
$url = filter_var($data['website_url'] ?? '', FILTER_VALIDATE_URL);
if (!$email || !$url || empty($data['tool_name'])) { http_response_code(422); echo json_encode(['ok'=>false,'error'=>'Missing required fields']); exit; }
$file = __DIR__ . '/storage/submissions.json';
$rows = file_exists($file) ? json_decode(file_get_contents($file), true) : [];
if (!is_array($rows)) $rows = [];
$rows[] = [
  'tool_name' => strip_tags($data['tool_name']),
  'website_url' => $url,
  'category' => strip_tags($data['category'] ?? ''),
  'description' => strip_tags($data['description'] ?? ''),
  'pricing' => strip_tags($data['pricing'] ?? ''),
  'free_plan' => strip_tags($data['free_plan'] ?? ''),
  'contact_email' => $email,
  'date' => $data['date'] ?? gmdate('c'),
  'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? ''
];
file_put_contents($file, json_encode($rows, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
echo json_encode(['ok'=>true]);
?>""")
    admin = PUBLIC / "admin.html"
    if admin.exists():
        s = admin.read_text(encoding="utf-8")
        if "Change ADMIN_TOKEN" not in s:
            s = s.replace("<h1>Manage AI tools</h1>", '<h1>Manage AI tools</h1><div class="card security-note"><strong>Security warning:</strong> Change ADMIN_TOKEN in config.php before going live.</div>', 1)
        if 'noindex,nofollow' not in s:
            s = s.replace("<title>AIMars Admin</title>", '<meta name="robots" content="noindex,nofollow"><title>AIMars Admin</title>')
        admin.write_text(s, encoding="utf-8")

def sitemap():
    sm = PUBLIC / "sitemap.xml"
    s = sm.read_text(encoding="utf-8")
    for file in ["providers.html","pricing.html","developers.html","submit-tool.html","ai-tool-finder.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.8</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","phase4_finish_hub.py"):
            f = ROOT / name
            if f.exists():
                z.write(f, f.relative_to(ROOT))

def main():
    tools = upgrade_tools()
    add_css()
    update_nav_all()
    rewrite_core_pages(tools)
    provider_pages(tools)
    utility_pages(tools)
    finder_page(tools)
    submit_page()
    update_home_links()
    update_app_js()
    storage_security()
    sitemap()
    package()
    print(OUT)

if __name__ == "__main__":
    main()
