"""Build the bilingual (English + Kiswahili) S.E.W.F static site into dist/. One folder per route => clean URLs, no .html."""
import os, re, json, shutil, html
import content as EN, content_sw as SW
from assets_src import CSS, JS

SITE = os.environ.get("SITE_URL", "https://example.org").rstrip("/")
NAME = "Social and Economic Welfare Foundation (S.E.W.F)"
HERE = os.path.dirname(os.path.abspath(__file__)); OUT = os.path.join(HERE, "dist")
E = html.escape

UI = {
 "en": dict(skip="Skip to content", menu="Menu", home="Home", overview="overview", search="Search", who="Who we serve", contact="Contact", insec="In this section",
            related="Related", crumb="Breadcrumb", more="More", other="Kiswahili", ocode="sw", ohint="Soma kwa Kiswahili",
            fine="Registered under the Non-Governmental Organizations Act, No. 24 of 2002, as amended. Head office: Nyangoto Street, Matongo ward, Tarime District, Mara Region · P.O. Box 291"),
 "sw": dict(skip="Nenda kwenye maudhui", menu="Menyu", home="Mwanzo", overview="muhtasari", search="Tafuta", who="Tunaowahudumia", contact="Wasiliana", insec="Katika sehemu hii",
            related="Yanayohusiana", crumb="Njia ya kurasa", more="Zaidi", other="English", ocode="en", ohint="Read in English",
            fine="Imesajiliwa chini ya Sheria ya Mashirika Yasiyo ya Kiserikali, Na. 24 ya 2002, kama ilivyorekebishwa. Ofisi kuu: Mtaa wa Nyangoto, kata ya Matongo, Wilaya ya Tarime, Mkoa wa Mara · S.L.P. 291"),
}
CTX = {
 "en": dict(pages=EN.PAGES, order=EN.ORDER, prefix="", groups=[("About", "/about"), ("Programs", "/programs"), ("Get involved", "/get-involved")], foot=("Policies", "/policies"),
            legal=["/news", "/who-we-serve", "/contact", "/faq", "/search", "/sitemap"]),
 "sw": dict(pages=SW.PAGES, order=SW.ORDER, prefix="/sw", groups=[("Kuhusu", "/sw/about"), ("Programu", "/sw/programs"), ("Shiriki", "/sw/get-involved")], foot=("Sera", "/sw/policies"),
            legal=["/sw/news", "/sw/who-we-serve", "/sw/contact", "/sw/faq", "/sw/search", "/sw/sitemap"]),
}
HOME = {
 "en": dict(title=f"{NAME} – Tarime, Mara, Tanzania", nk="Announcements", nh="Latest news", nall="All announcements →", desc="S.E.W.F is a Tanzanian NGO in Tarime, Mara working on legal aid, gender equality, human rights, health, environment, agriculture and fair community–investor relations.",
   eyebrow="Tarime, Mara · Working nationwide", h1="Justice, dignity and a livelihood for every community.",
   lead="S.E.W.F is a Tanzanian non-governmental organization. We provide legal aid, advance gender equality and human rights, and support health, education, environment, agriculture and fair relations between communities and investors.",
   b1="Our programs", b2="Get involved", facts=[("Area of work", "Nationwide"), ("Head office", "Tarime, Mara"), ("Program areas", "11"), ("Registered under", "NGO Act, 2002")],
   k1="What we do", h2a="Eleven connected programs", p2a="Problems in our communities feed each other, so our work joins rights, health, education, environment and livelihoods.", all="See all 11 programs",
   k2="Why we exist", h2b="Six problems, one community", probs=["Harmful mining and environmental damage", "Domestic and gender-based violence", "Early and forced marriages", "Low agricultural productivity", "Harmful cultural practices", "Weak trust between communities and investors"], story="Read the full story",
   k3="Who we stand with", h2c="People most at risk come first", serve=["Women", "Children", "Youth", "Disabled people", "The elderly", "Small-scale farmers"],
   k4="Our vision", vision="A positive-minded society rooted in social, cultural and economic development, where citizens uphold integrity, unity and consistently obey the laws of the land.", vlink="Mission and vision →",
   k5="Get involved", h2d="Be part of the work", gi=[("Become a member", "Anyone aged 18 or over who supports our vision can apply.", "How to join →"), ("Partner with us", "Investors, donors and institutions working for fair, sustainable development.", "Work with us →"), ("Support our work", "Grants, donations and gifts, used only for our objectives.", "Give support →")],
   visit="Visit or write to us", addr="Nyangoto Street, near Nyamongo Plaza building, Matongo ward, Tarime District, Mara Region · P.O. Box 291", cd="Contact details", art="Abstract illustration of a sun rising over hills"),
 "sw": dict(title=f"{NAME} – Tarime, Mara, Tanzania (Kiswahili)", nk="Matangazo", nh="Habari mpya", nall="Matangazo yote →", desc="S.E.W.F ni shirika lisilo la kiserikali la Tanzania lenye makao Tarime, Mara, linalofanya kazi ya msaada wa kisheria, usawa wa kijinsia, haki za binadamu, afya, mazingira na kilimo.",
   eyebrow="Tarime, Mara · Tunafanya kazi nchi nzima", h1="Haki, utu na maisha bora kwa kila jamii.",
   lead="S.E.W.F ni shirika lisilo la kiserikali la Tanzania. Tunatoa msaada wa kisheria, tunakuza usawa wa kijinsia na haki za binadamu, na tunasaidia afya, elimu, mazingira, kilimo na mahusiano ya haki kati ya jamii na wawekezaji.",
   b1="Programu zetu", b2="Shiriki nasi", facts=[("Eneo la kazi", "Nchi nzima"), ("Ofisi kuu", "Tarime, Mara"), ("Maeneo ya programu", "11"), ("Imesajiliwa chini ya", "Sheria ya NGO, 2002")],
   k1="Tunachofanya", h2a="Programu kumi na moja zinazohusiana", p2a="Matatizo ya jamii zetu hulishana, kwa hiyo kazi yetu inaunganisha haki, afya, elimu, mazingira na kipato.", all="Tazama programu zote 11",
   k2="Kwa nini tupo", h2b="Matatizo sita, jamii moja", probs=["Uchimbaji madini wenye madhara na uharibifu wa mazingira", "Ukatili wa majumbani na wa kijinsia", "Ndoa za utotoni na za kulazimishwa", "Tija ndogo ya kilimo", "Mila zenye madhara", "Kutoaminiana kati ya jamii na wawekezaji"], story="Soma hadithi kamili",
   k3="Tunasimama na nani", h2c="Walio hatarini zaidi hutangulia", serve=["Wanawake", "Watoto", "Vijana", "Watu wenye ulemavu", "Wazee", "Wakulima wadogo"],
   k4="Dira yetu", vision="Jamii yenye mtazamo chanya iliyojengwa katika maendeleo ya kijamii, kiutamaduni na kiuchumi, ambamo wananchi wanazingatia uadilifu, umoja na kutii sheria za nchi daima.", vlink="Dira na dhima →",
   k5="Shiriki", h2d="Kuwa sehemu ya kazi", gi=[("Kuwa mwanachama", "Yeyote mwenye umri wa miaka 18 au zaidi anayeunga mkono dira yetu anaweza kuomba.", "Jinsi ya kujiunga →"), ("Shirikiana nasi", "Wawekezaji, wafadhili na taasisi zinazofanya kazi kwa maendeleo ya haki na endelevu.", "Fanya kazi nasi →"), ("Tuunge mkono", "Ruzuku, michango na zawadi, zinazotumika kwa malengo yetu tu.", "Toa msaada →")],
   visit="Tutembelee au tuandikie", addr="Mtaa wa Nyangoto, karibu na jengo la Nyamongo Plaza, kata ya Matongo, Wilaya ya Tarime, Mkoa wa Mara · S.L.P. 291", cd="Mawasiliano", art="Picha ya jua linalochomoza juu ya vilima"),
}
C = None; T = None; L = "en"
def setlang(l):
    global C, T, L; L = l; C = CTX[l]; T = UI[l]
def P(): return C["pages"]
def children(p):
    d = p.count("/") + 1
    return [c for c in C["order"] if c.startswith(p + "/") and c.count("/") == d]
def hp(): return C["prefix"] or "/"
def alt(path):
    if L == "en": return "/sw" + ("" if path == "/" else path)
    return path[3:] or "/"
def has_alt(path):
    a = alt(path); other = CTX["sw" if L == "en" else "en"]["pages"]
    return a in other or a in ("/", "/sw")
def crumbs(path):
    parts = [x for x in path.strip("/").split("/") if x]
    out = [(T["home"], hp())]
    for i in range(len(parts)):
        c = "/" + "/".join(parts[:i + 1])
        if c in P(): out.append((P()[c]["title"], c))
    return out
def nav(path):
    li = ""
    for i, (label, base) in enumerate(C["groups"]):
        cur = ' aria-current="true"' if path == base or path.startswith(base + "/") else ""
        links = f'<a href="{base}">{E(label)} – {T["overview"]}</a>' + "".join(f'<a href="{c}">{E(P()[c]["title"])}</a>' for c in children(base))
        li += (f'<li class="dd"><button type="button" aria-expanded="false" aria-controls="m{i}"{cur}>{E(label)}</button>'
               f'<div class="panel" id="m{i}" hidden><div class="panel-in">{links}</div></div></li>')
    pre = C["prefix"]
    sw = f'<li><a href="{alt(path)}" hreflang="{T["ocode"]}" lang="{T["ocode"]}" title="{E(T["ohint"])}">{T["other"]}</a></li>' if path != "/404" and has_alt(path) else ""
    return (f'<ul class="main">{li}<li><a href="{pre}/who-we-serve">{T["who"]}</a></li><li><a href="{pre}/search">{T["search"]}</a></li>{sw}'
            f'<li><a class="cta" href="{pre}/contact">{T["contact"]}</a></li></ul>')
def footer():
    cols = ""
    for label, base in C["groups"] + [C["foot"]]:
        cols += f'<details class="fcol" open><summary>{E(label)}</summary>' + "".join(f'<a href="{c}">{E(P()[c]["title"])}</a>' for c in children(base)) + "</details>"
    legal = "".join(f'<a href="{p}">{E(P()[p]["title"])}</a>' for p in C["legal"])
    return (f'<footer><div class="wrap"><div class="fcols">{cols}<details class="fcol" open><summary>{T["more"]}</summary>{legal}</details></div>'
            f'<div class="fbrand"><img src="/assets/logo-192.png" width="84" height="84" alt="S.E.W.F logo" loading="lazy"><p class="fine"><strong>{NAME}</strong><br><a href="mailto:info@sewf.or.tz">info@sewf.or.tz</a><br>{T["fine"]}</p></div></div></footer>')
def head(title, desc, path, noindex=False):
    url = SITE + ("" if path == "/" else path)
    robots = '<meta name="robots" content="noindex,follow">' if noindex else ""
    hl = ""
    if path != "/404" and has_alt(path):
        en, sw = (path, alt(path)) if L == "en" else (alt(path), path)
        f = lambda p: SITE + ("" if p == "/" else p)
        hl = f'<link rel="alternate" hreflang="en" href="{f(en)}"><link rel="alternate" hreflang="sw" href="{f(sw)}"><link rel="alternate" hreflang="x-default" href="{f(en)}">'
    loc = "sw_TZ" if L == "sw" else "en"
    return f'''<!DOCTYPE html><html lang="{L}"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>{E(title)}</title><meta name="description" content="{E(desc)}">{robots}
<link rel="canonical" href="{url}">{hl}
<meta property="og:type" content="website"><meta property="og:site_name" content="{E(NAME)}"><meta property="og:title" content="{E(title)}">
<meta property="og:description" content="{E(desc)}"><meta property="og:url" content="{url}"><meta property="og:locale" content="{loc}"><meta property="og:image" content="{SITE}/assets/og.png"><meta name="twitter:card" content="summary_large_image">
<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,800&family=Public+Sans:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/assets/site.css"><link rel="icon" href="/assets/favicon-32.png" sizes="32x32" type="image/png"><link rel="icon" href="/assets/favicon-64.png" sizes="64x64" type="image/png"><link rel="apple-touch-icon" href="/assets/apple-touch-icon.png"><meta name="theme-color" content="#0a3328">
'''
def shell(path, title, desc, main, noindex=False, extra=""):
    return (head(title, desc, path, noindex) + extra + f'</head><body><a class="skip" href="#main">{T["skip"]}</a>'
            f'<header class="top"><div class="wrap bar"><a class="brand" href="{hp()}" aria-label="S.E.W.F"><img class="logo" src="/assets/logo-96.png" width="46" height="46" alt=""><span>S.E.W.F<small>Social and Economic Welfare Foundation</small></span></a>'
            f'<button id="menu" type="button" aria-expanded="false" aria-controls="nav">{T["menu"]}</button>'
            f'<nav id="nav" aria-label="Main">{nav(path)}</nav></div></header><main id="main" tabindex="-1">{main}</main>{footer()}{mbar(path)}'
            '<script src="/assets/site.js" defer></script></body></html>')
def mbar(path):
    if path in ("/404",) or path.endswith(("/join", "/contact")): return ""
    pre = C["prefix"]; j = "Jiunge" if L == "sw" else "Apply to join"; c = T["contact"]
    return f'<div class="mbar"><a class="btn p" href="{pre}/get-involved/join">{j}</a><a class="btn s" href="{pre}/contact">{c}</a></div>'
def write(path, content):
    d = OUT if path == "/" else os.path.join(OUT, path.strip("/"))
    os.makedirs(d, exist_ok=True); open(os.path.join(d, "index.html"), "w", encoding="utf-8").write(content)

def page(p):
    path = p["path"]; ch = children(path); bc = crumbs(path)
    bc_html = f'<nav class="crumbs" aria-label="{T["crumb"]}"><ol>' + "".join(
        f'<li><a href="{u}">{E(t)}</a></li>' if i < len(bc) - 1 else f'<li aria-current="page">{E(t)}</li>' for i, (t, u) in enumerate(bc)) + "</ol></nav>"
    body = p["body"]
    row = lambda c: f'<li><a href="{c}"><strong>{E(P()[c]["title"])}</strong><span>{E(P()[c]["desc"])}</span></a></li>'
    if ch: body += f'<h2>{T["insec"]}</h2><ul class="rows">' + "".join(row(c) for c in ch) + "</ul>"
    depth = path.count("/") - (1 if L == "sw" else 0)
    rel = (p["related"] or [c for c in children(os.path.dirname(path)) if c != path][:4]) if depth >= 2 else []
    rel = [r for r in rel if r in P()][:4]
    if rel: body += f'<h2>{T["related"]}</h2><ul class="rows">' + "".join(row(c) for c in rel) + "</ul>"
    main = (f'<div class="phead"><div class="wrap">{bc_html}<h1>{E(p["title"])}</h1><p class="lead">{E(p["desc"])}</p></div><div class="strip" aria-hidden="true"></div></div>'
            f'<div class="wrap prose">{body}</div>')
    ld = json.dumps({"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [
        {"@type": "ListItem", "position": i + 1, "name": t, "item": SITE + ("" if u == "/" else u)} for i, (t, u) in enumerate(bc)]})
    write(path, shell(path, f'{p["title"]} – S.E.W.F', p["desc"], main, p["noindex"], f'<script type="application/ld+json">{ld}</script>'))

def home():
    H = HOME[L]; pre = C["prefix"]
    progs = [c for c in C["order"] if c.startswith(pre + "/programs/")]
    cards = "".join(f'<li class="card c{i%3}"><a href="{c}"><span class="n">{i+1:02d}</span><strong>{E(P()[c]["title"])}</strong><span class="d">{E(P()[c]["desc"])}</span><span class="go">→</span></a></li>' for i, c in enumerate(progs[:6]))
    pb = "".join(f"<li><span>{i+1}</span>{t}</li>" for i, t in enumerate(H["probs"]))
    serve = "".join(f'<li><a href="{pre}/who-we-serve">{t}</a></li>' for t in H["serve"])
    facts = "".join(f"<div><dt>{a}</dt><dd>{b}</dd></div>" for a, b in H["facts"])
    gi = "".join(f'<li class="card c{i}"><a href="{pre}/get-involved/{u}"><strong>{t}</strong><span class="d">{d}</span><span class="go">{g}</span></a></li>' for i, ((t, d, g), u) in enumerate(zip(H["gi"], ["membership", "partner-with-us", "support-our-work"])))
    art = f'<img src="/assets/logo-512.png" width="420" height="420" alt="S.E.W.F logo" fetchpriority="high">'
    main = f'''<div class="hero"><div class="wrap hgrid"><div class="htext"><p class="eyebrow">{H["eyebrow"]}</p><h1>{H["h1"]}</h1><p class="lead">{H["lead"]}</p>
<div class="btns"><a class="btn p" href="{pre}/programs">{H["b1"]}</a><a class="btn s" href="{pre}/get-involved">{H["b2"]}</a></div></div><div class="hart">{art}</div></div></div>
<div class="facts-strip"><div class="wrap"><dl>{facts}</dl></div></div>
<section id="news-home" class="sec wrap" hidden><div class="shead"><p class="eyebrow dk">{H["nk"]}</p><h2>{H["nh"]}</h2></div><div id="news-app" data-home data-limit="3"></div><p style="margin-top:1rem"><a href="{pre}/news">{H["nall"]}</a></p></section>
<section class="sec wrap"><div class="shead"><p class="eyebrow dk">{H["k1"]}</p><h2>{H["h2a"]}</h2><p>{H["p2a"]}</p></div><ul class="cards">{cards}</ul><p class="center"><a class="btn dkb" href="{pre}/programs">{H["all"]}</a></p></section>
<section class="band dark prob"><div class="wrap"><div class="shead"><p class="eyebrow">{H["k2"]}</p><h2>{H["h2b"]}</h2></div><ol class="probs">{pb}</ol><p class="center"><a class="btn s" href="{pre}/about/why-we-exist">{H["story"]}</a></p></div></section>
<section class="sec wrap"><div class="shead"><p class="eyebrow dk">{H["k3"]}</p><h2>{H["h2c"]}</h2></div><ul class="pills">{serve}</ul></section>
<section class="vis"><div class="wrap"><p class="eyebrow dk">{H["k4"]}</p><blockquote>{H["vision"]}</blockquote><a href="{pre}/about/mission-vision">{H["vlink"]}</a></div></section>
<section class="sec wrap"><div class="shead"><p class="eyebrow dk">{H["k5"]}</p><h2>{H["h2d"]}</h2></div><ul class="cards three">{gi}</ul></section>
<section class="band dark"><div class="wrap center"><h2 style="margin-top:0">{H["visit"]}</h2><p style="margin-inline:auto">{H["addr"]}</p><a class="btn p" href="{pre}/contact">{H["cd"]}</a></div></section>'''
    ld = json.dumps({"@context": "https://schema.org", "@type": "NGO", "name": NAME, "url": SITE, "inLanguage": ["en", "sw"], "email": "info@sewf.or.tz", "logo": SITE + "/assets/logo-512.png",
        "address": {"@type": "PostalAddress", "streetAddress": "Nyangoto Street, near Nyamongo Plaza building, P.O. Box 291", "addressLocality": "Matongo ward, Tarime District", "addressRegion": "Mara", "addressCountry": "TZ"}})
    write(hp(), shell(hp(), H["title"], H["desc"], main, False, f'<script type="application/ld+json">{ld}</script>'))

def notfound():
    main = ('<div class="phead"><div class="wrap"><h1>Page not found / Ukurasa haujapatikana</h1><p class="lead">That address does not match a page on this site. Anwani hiyo haipo kwenye tovuti hii.</p></div><div class="strip" aria-hidden="true"></div></div>'
            '<div class="wrap prose"><p><a href="/">Home</a> · <a href="/sw">Mwanzo (Kiswahili)</a> · <a href="/search">Search</a> · <a href="/sitemap">Site map</a></p></div>')
    open(os.path.join(OUT, "404.html"), "w", encoding="utf-8").write(shell("/404", "Page not found – S.E.W.F", "Page not found.", main, True))

def main():
    if os.path.isdir(OUT): shutil.rmtree(OUT)
    os.makedirs(os.path.join(OUT, "assets"))
    for f in ("logo-96.png", "logo-192.png", "logo-512.png", "favicon-32.png", "favicon-64.png", "apple-touch-icon.png", "og.png"):
        shutil.copy(os.path.join(HERE, "brand", f), os.path.join(OUT, "assets", f))
    open(os.path.join(OUT, "assets/site.css"), "w").write(CSS); open(os.path.join(OUT, "assets/site.js"), "w").write(JS)
    BE = os.path.join(HERE, "backend")
    for sub in ("api", "admin", "lib"): shutil.copytree(os.path.join(BE, sub), os.path.join(OUT, sub), ignore=shutil.ignore_patterns("config.php"))
    os.makedirs(os.path.join(OUT, "uploads", "announcements")); shutil.copy(os.path.join(BE, "uploads", ".htaccess"), os.path.join(OUT, "uploads", ".htaccess"))
    for f in (".htaccess", "router.php", "install.php", "schema.sql", "config.sample.php"): shutil.copy(os.path.join(BE, f), os.path.join(OUT, f))
    urls = []
    for l in ("en", "sw"):
        setlang(l); home(); urls.append(hp())
        for c in C["order"]: page(P()[c])
        idx = [{"url": hp(), "title": T["home"], "desc": "S.E.W.F", "text": ""}]
        for c in C["order"]:
            if P()[c]["noindex"]: continue
            urls.append(c)
            if not c.endswith("/sitemap"): idx.append({"url": c, "title": P()[c]["title"], "desc": P()[c]["desc"], "text": re.sub(r"<[^>]+>", " ", P()[c]["body"])})
        json.dump(idx, open(os.path.join(OUT, "assets", "search-index" + ("-sw" if l == "sw" else "") + ".json"), "w"), ensure_ascii=False)
    notfound()
    open(os.path.join(OUT, "sitemap.xml"), "w").write('<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n' +
        "".join(f"<url><loc>{SITE}{'' if u == '/' else u}</loc></url>\n" for u in urls) + "</urlset>\n")
    open(os.path.join(OUT, "robots.txt"), "w").write(f"User-agent: *\nAllow: /\nDisallow: /search\nDisallow: /sw/search\nSitemap: {SITE}/sitemap.xml\n")
    open(os.path.join(OUT, "_redirects"), "w").write("/*  /404.html  404\n")
    print("built", len(urls), "indexable routes (en+sw) + 404")
if __name__ == "__main__":
    main()
