# -*- coding: utf-8 -*-
"""
Gerador estático do site ThermoKraft.
  python3 build.py            -> dist/     (produção: URLs limpos /empresa/, formulários para /enviar.php)
  python3 build.py --preview  -> preview/  (links relativos com index.html, formulários simulados)
"""
import os, sys, json, shutil, math, html, datetime
from content import SERVICES, AREAS
import svgs

BASE = "https://thermokraft.pt"          # domínio de produção (alterar se necessário)
EMAIL = "geral@thermokraft.pt"
LEGAL = "ThermoKraft | Climatização, Unipessoal, Lda."
TODAY = datetime.date.today().isoformat()
PREVIEW = "--preview" in sys.argv
ROOT = os.path.dirname(os.path.abspath(__file__))
SRC = os.path.join(ROOT, "src")
OUT = os.path.join(ROOT, "preview" if PREVIEW else "dist")
CUR = "/"
PAGES = []
SVC = {s["slug"]: s for s in SERVICES}

def esc(s): return html.escape(s, quote=True)

# ------------------------------------------------------------------ URLs
def u(target):
    """Link para um caminho do site (ex.: '/empresa/', '/assets/css/style.css', '/pedir-orcamento/?servico=x#f')."""
    if target.startswith(("http", "mailto:", "#")):
        return target
    if not PREVIEW:
        return target
    frag = ""
    for sep in ("#", "?"):
        if sep in target:
            i = target.index(sep); frag = target[i:] + frag; target = target[:i]
    if target.endswith("/"):
        target += "index.html"
    curdir = CUR if CUR.endswith("/") else os.path.dirname(CUR) + "/"
    rel = os.path.relpath(target, curdir)
    return rel + frag

def svc_url(s): return s.get("url") or f"/servicos/{s['slug']}/"

# ------------------------------------------------------------------ imagens
def pic(slot, alt, eager=False, w=800, h=560, cls=""):
    for ext in ("webp", "jpg", "jpeg", "png"):
        if os.path.exists(os.path.join(SRC, "assets/img/fotos", f"{slot}.{ext}")):
            src = f"/assets/img/fotos/{slot}.{ext}"; break
    else:
        src = f"/assets/img/ilustracoes/{slot}.svg"
    load = 'fetchpriority="high" decoding="async"' if eager else 'loading="lazy" decoding="async"'
    c = f' class="{cls}"' if cls else ""
    return f'<img src="{u(src)}" alt="{esc(alt)}" width="{w}" height="{h}" {load}{c}>'

# ------------------------------------------------------------------ ícones
def icon(name, size=None):
    P = {
        "arrow": '<path d="M5 12h14M13 6l6 6-6 6"/>',
        "menu": '<path d="M4 7h16M4 12h16M4 17h16"/>',
        "upload": '<path d="M12 16V4M7 9l5-5 5 5M4 20h16"/>',
        "mail": '<rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/>',
        "clock": '<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/>',
        "target": '<circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="5"/><circle cx="12" cy="12" r="1"/>',
        "gauge": '<path d="M4 17a8 8 0 1 1 16 0"/><path d="M12 17l4-5"/><path d="M4 21h16"/>',
        "cube": '<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9z"/><path d="M12 12l8-4.5M12 12v9M12 12L4 7.5"/>',
        "cycle": '<path d="M20 11a8 8 0 0 0-14.9-3M4 13a8 8 0 0 0 14.9 3"/><path d="M5 4v4h4M19 20v-4h-4"/>',
        "pin": '<path d="M12 21s-7-6.2-7-11a7 7 0 0 1 14 0c0 4.8-7 11-7 11z"/><circle cx="12" cy="10" r="2.5"/>',
    }
    return f'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">{P[name]}</svg>'

ARROW = icon("arrow")

# ------------------------------------------------------------------ mapa de Portugal (simplificado)
PT = [(-8.87,41.87),(-8.65,42.05),(-8.2,42.15),(-8.08,42.0),(-7.9,41.9),(-7.6,41.86),(-7.2,41.95),(-6.6,41.95),(-6.2,41.6),(-6.55,41.25),(-6.9,41.0),(-6.8,40.6),(-6.8,40.3),(-7.0,39.7),(-7.5,39.65),(-7.25,39.45),(-7.0,39.1),(-7.2,38.8),(-7.0,38.2),(-7.3,37.9),(-7.5,37.5),(-7.4,37.18),(-7.9,37.0),(-8.6,37.1),(-8.99,37.02),(-8.8,37.5),(-8.8,38.0),(-8.75,38.3),(-8.9,38.45),(-9.2,38.42),(-9.1,38.65),(-9.48,38.71),(-9.5,38.78),(-9.42,39.0),(-9.38,39.36),(-9.07,39.6),(-8.85,40.15),(-8.75,40.6),(-8.65,41.1),(-8.78,41.6)]
def proj(lon, lat, k=96):
    return ((lon + 9.75) * k * 0.77 + 110, (42.35 - lat) * k + 20)
def map_svg():
    pts = " ".join(f"{x:.1f},{y:.1f}" for x, y in (proj(*p) for p in PT))
    ex, ey = proj(-9.40, 38.705)
    lx, ly = proj(-9.14, 38.72)
    W, H = proj(-6.0, 36.85)
    cities = [("Porto", -8.61, 41.15), ("Coimbra", -8.43, 40.2), ("Évora", -7.91, 38.57), ("Faro", -7.93, 37.02)]
    c = "".join(f'<circle cx="{proj(lo,la)[0]:.1f}" cy="{proj(lo,la)[1]:.1f}" r="3" fill="#9DB3BE"/><text x="{proj(lo,la)[0]+8:.1f}" y="{proj(lo,la)[1]+4:.1f}" font-size="12" fill="#5A7380" font-family="Inter,Arial,sans-serif">{n}</text>' for n, lo, la in cities)
    dots = ""
    # grelha de pontos dentro do território — leitura técnica, não decorativa
    return f'''<svg viewBox="0 0 {W:.0f} {H:.0f}" role="img" aria-labelledby="map-t">
<title id="map-t">Mapa de Portugal continental com a sede no Estoril e a Área Metropolitana de Lisboa assinalada</title>
<defs><pattern id="mg" width="10" height="10" patternUnits="userSpaceOnUse"><circle cx="5" cy="5" r="1.1" fill="#B7CAD3"/></pattern>
<linearGradient id="mt" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#1677A6"/><stop offset=".6" stop-color="#39A9DB"/><stop offset="1" stop-color="#69B34C"/></linearGradient></defs>
<polygon points="{pts}" fill="url(#mg)" stroke="#0B2A3A" stroke-width="1.5" stroke-linejoin="round"/>
{c}
<circle cx="{(ex+lx)/2:.1f}" cy="{(ey+ly)/2:.1f}" r="34" fill="rgba(57,169,219,.14)" stroke="url(#mt)" stroke-width="2" stroke-dasharray="4 4"/>
<circle class="pulse" cx="{ex:.1f}" cy="{ey:.1f}" r="6" fill="none" stroke="#1677A6" stroke-width="2"/>
<circle cx="{ex:.1f}" cy="{ey:.1f}" r="6" fill="#0B2A3A" stroke="#fff" stroke-width="2"/>
<path d="M{ex-6:.1f} {ey+8:.1f}L{ex-50:.1f} {ey+60:.1f}H{ex-70:.1f}" fill="none" stroke="#0B2A3A" stroke-width="1"/>
<text x="{ex-74:.1f}" y="{ey+56:.1f}" text-anchor="end" font-size="13" font-weight="700" fill="#0B2A3A" font-family="Manrope,Arial,sans-serif">Estoril</text>
<text x="{ex-74:.1f}" y="{ey+72:.1f}" text-anchor="end" font-size="11" fill="#5A7380" font-family="Inter,Arial,sans-serif">SEDE</text>
</svg>'''

# ------------------------------------------------------------------ esqueleto da página
CURATTR = ' aria-current="page"'
NAV = [("/empresa/", "Empresa"), ("/servicos/", "Serviços"), ("/eficiencia-energetica/", "Eficiência Energética"), ("/assistencia-tecnica/", "Assistência Técnica"), ("/contactos/", "Contactos")]

def header():
    links = "".join(
        f'<a class="nav-link" href="{u(h)}"{CURATTR if CUR.startswith(h) else ""}>{t}</a>' for h, t in NAV)
    return f'''<header class="site-header">
  <div class="wrap bar">
    <a class="brand" href="{u('/')}" aria-label="ThermoKraft — página inicial">
      <img class="logo-light" src="{u('/assets/img/logo-branco.webp')}" alt="ThermoKraft" width="646" height="96">
      <img class="logo-dark" src="{u('/assets/img/logo.webp')}" alt="ThermoKraft" width="646" height="96">
    </a>
    <button class="menu-toggle" type="button" aria-expanded="false" aria-controls="nav" aria-label="Abrir menu">{icon("menu")}</button>
    <nav class="nav" id="nav" aria-label="Navegação principal">
      {links}
      <a class="btn" href="{u('/pedir-orcamento/')}">Pedir orçamento</a>
    </nav>
  </div>
</header>'''

def footer():
    return f'''<footer class="site-footer">
  <div class="wrap">
    <div class="foot-grid">
      <div>
        <a class="brand" href="{u('/')}" aria-label="ThermoKraft — página inicial"><img src="{u('/assets/img/logo-branco.webp')}" alt="ThermoKraft" width="646" height="96" loading="lazy"></a>
        <p class="legalname">ThermoKraft<br>Climatização, Unipessoal, Lda.</p>
        <div class="foot-tags"><span>AVAC</span><span>Climatização</span><span>Bombas de Calor</span><span>Eficiência Energética</span></div>
      </div>
      <div>
        <h2>Contactos</h2>
        <ul>
          <li>Estoril, Portugal</li>
          <li><a href="mailto:{EMAIL}">{EMAIL}</a></li>
          <li>Cobertura em todo o território nacional</li>
        </ul>
      </div>
      <div>
        <h2>Ligações</h2>
        <ul>
          <li><a href="{u('/empresa/')}">Empresa</a></li>
          <li><a href="{u('/servicos/')}">Serviços</a></li>
          <li><a href="{u('/pedir-orcamento/')}">Pedir Orçamento</a></li>
          <li><a href="{u('/contactos/')}">Contactos</a></li>
          <li><a href="{u('/politica-de-privacidade/')}">Política de Privacidade</a></li>
          <li><a href="{u('/politica-de-cookies/')}">Política de Cookies</a></li>
        </ul>
      </div>
    </div>
    <div class="foot-bottom"><span>© <span id="year">2026</span> {esc(LEGAL)}</span><span>Estoril · Portugal</span></div>
  </div>
</footer>'''

ORG = {
    "@context": "https://schema.org", "@type": "HVACBusiness", "@id": BASE + "/#empresa",
    "name": "ThermoKraft", "legalName": LEGAL, "url": BASE + "/",
    "logo": BASE + "/assets/img/logo.png", "image": BASE + "/assets/img/og-thermokraft.jpg",
    "email": EMAIL, "foundingDate": "2026",
    "description": "Empresa portuguesa especializada em climatização, AVAC, bombas de calor, ventilação e eficiência energética, sediada no Estoril.",
    "address": {"@type": "PostalAddress", "addressLocality": "Estoril", "addressRegion": "Lisboa", "addressCountry": "PT"},
    "areaServed": [{"@type": "City", "name": n} for n in AREAS] + [{"@type": "AdministrativeArea", "name": "Área Metropolitana de Lisboa"}, {"@type": "Country", "name": "Portugal"}],
    "knowsAbout": ["Climatização", "AVAC", "Ar condicionado", "Bombas de calor", "Ventilação mecânica controlada", "Eficiência energética"],
}

def page(path, title, desc, body, crumbs=None, schema=None, solid=False, sticky=None, outfile=None, noindex=False):
    global CUR
    CUR = path
    body = body() if callable(body) else body
    full_title = title if "ThermoKraft" in title else f"{title} | ThermoKraft"
    canon = BASE + path
    ld = [ORG] if path == "/" else [{"@context": "https://schema.org", "@type": "WebPage", "name": full_title, "url": canon, "description": desc, "isPartOf": {"@type": "WebSite", "name": "ThermoKraft", "url": BASE + "/"}, "publisher": {"@id": BASE + "/#empresa"}}]
    if path == "/":
        ld.append({"@context": "https://schema.org", "@type": "WebSite", "name": "ThermoKraft", "url": BASE + "/", "inLanguage": "pt-PT", "publisher": {"@id": BASE + "/#empresa"}})
    if crumbs:
        items = [{"@type": "ListItem", "position": 1, "name": "Início", "item": BASE + "/"}]
        for i, (h, t) in enumerate(crumbs, 2):
            items.append({"@type": "ListItem", "position": i, "name": t, "item": BASE + h})
        ld.append({"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": items})
    ld += schema or []
    ldhtml = "\n".join(f'<script type="application/ld+json">{json.dumps(x, ensure_ascii=False)}</script>' for x in ld)
    robots = "noindex, follow" if noindex else "index, follow, max-image-preview:large"
    head = f'''<title>{esc(full_title)}</title>
<meta name="description" content="{esc(desc)}">
<meta name="robots" content="{robots}">
<link rel="canonical" href="{canon}">
<meta name="theme-color" content="#0B2A3A">
<meta property="og:type" content="website">
<meta property="og:locale" content="pt_PT">
<meta property="og:site_name" content="ThermoKraft">
<meta property="og:title" content="{esc(full_title)}">
<meta property="og:description" content="{esc(desc)}">
<meta property="og:url" content="{canon}">
<meta property="og:image" content="{BASE}/assets/img/og-thermokraft.jpg">
<meta property="og:image:width" content="1200"><meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="{u('/favicon.ico')}" sizes="any">
<link rel="icon" type="image/png" href="{u('/assets/img/favicon-32.png')}" sizes="32x32">
<link rel="apple-touch-icon" href="{u('/assets/img/apple-touch-icon.png')}">
<link rel="manifest" href="{u('/site.webmanifest')}">
<link rel="preload" href="{u('/assets/fonts/manrope-latin-wght-normal.woff2')}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{u('/assets/fonts/inter-latin-wght-normal.woff2')}" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="{u('/assets/css/style.css')}">
{ldhtml}'''
    sticky_html = f'<div class="sticky-cta"><a class="btn" href="{u(sticky[0])}">{sticky[1]}</a></div>' if sticky else ""
    main = f'''<a class="skip" href="#conteudo">Saltar para o conteúdo</a>
{header().replace('class="site-header"', 'class="site-header" data-solid' if solid else 'class="site-header"')}
<main id="conteudo">
{body}
</main>
{footer()}
{sticky_html}
<script src="{u('/assets/js/main.js')}" defer></script>'''
    bodycls = ' class="has-sticky"' if sticky else ""
    is_artifact_main = PREVIEW and path == "/"
    if is_artifact_main:
        doc = f'<meta name="claude:viewport-fit-sides" content="cover">\n{head}\n<div{bodycls}>{main}</div>'
        doc = doc.replace("<div class=\"has-sticky\">", "<div>")
    else:
        doc = f'''<!doctype html>
<html lang="pt-PT">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
{head}
</head>
<body{bodycls}>
{main}
</body>
</html>'''
    fn = outfile or (path.strip("/") + "/index.html" if path != "/" else "index.html")
    dest = os.path.join(OUT, fn)
    os.makedirs(os.path.dirname(dest), exist_ok=True)
    with open(dest, "w", encoding="utf-8") as f:
        f.write(doc)
    if not noindex:
        PAGES.append(path)

def crumbs_html(items):
    li = f'<li><a href="{u("/")}">Início</a></li>'
    for i, (h, t) in enumerate(items):
        li += f'<li aria-current="page">{esc(t)}</li>' if i == len(items) - 1 else f'<li><a href="{u(h)}">{esc(t)}</a></li>'
    return f'<nav class="crumbs" aria-label="Localização"><ol>{li}</ol></nav>'

def page_hero(crumbs, eyebrow, h1, lead, buttons="", figure=""):
    inner = f'''{crumbs_html(crumbs)}<p class="eyebrow">{eyebrow}</p><h1>{h1}</h1><p class="lead">{lead}</p>{buttons}'''
    if figure:
        return f'<section class="page-hero"><div class="wrap page-hero-grid"><div>{inner}</div><div class="hero-figure">{figure}</div></div></section>'
    return f'<section class="page-hero"><div class="wrap">{inner}</div></section>'

def cta_final(title="Tem um projecto de climatização?", text="Fale connosco. Analisamos as necessidades da sua instalação e apresentamos uma solução adequada ao espaço, utilização e objectivos de eficiência energética.", btn=("/pedir-orcamento/", "Pedir orçamento")):
    return f'''<section class="section section--tight"><div class="wrap"><div class="cta reveal">
<p class="eyebrow">Fale connosco</p><h2>{title}</h2><p>{text}</p>
<div class="btn-row"><a class="btn btn--light btn--lg" href="{u(btn[0])}">{btn[1]} {ARROW}</a><a class="btn btn--ghost-light btn--lg mail-chip" href="mailto:{EMAIL}">{icon("mail")} {EMAIL}</a></div>
</div></div></section>'''

def svc_cards():
    return "".join(f'''<a class="svc-card" href="{u(svc_url(s))}"><span class="num">{s["n"]}</span><h3>{s["name"]}</h3><p>{s["short"]}</p><span class="go">Saber mais<i>{ARROW}</i></span></a>''' for s in SERVICES)

# ================================================================== PÁGINAS
def home():
    why = [
        ("clock", "Mais de 30 anos de experiência técnica", "A nossa equipa reúne décadas de experiência no sector da climatização e AVAC."),
        ("target", "Rigor técnico", "Cada solução é analisada de acordo com as características e necessidades da instalação."),
        ("gauge", "Eficiência energética", "Privilegiamos tecnologias que ajudam a reduzir o consumo energético."),
        ("cube", "Equipamentos de referência", "Trabalhamos com soluções e equipamentos das principais marcas do mercado."),
        ("cycle", "Acompanhamento", "Mantemos uma relação próxima com os clientes desde o projecto à manutenção."),
        ("pin", "Cobertura nacional", "Estamos sediados no Estoril e prestamos serviços em todo o território nacional."),
    ]
    steps = [
        ("Contacto", "Descreve-nos a sua necessidade por formulário ou email."),
        ("Análise técnica", "Avaliamos o espaço, a utilização e a instalação existente."),
        ("Proposta", "Apresentamos uma solução clara, com âmbito e equipamentos definidos."),
        ("Instalação", "Executamos os trabalhos com rigor, ensaio e arranque do sistema."),
        ("Manutenção", "Acompanhamos o sistema para manter eficiência e fiabilidade."),
    ]
    return f'''
<section class="hero">
  <div class="wrap hero-grid">
    <div>
      <p class="eyebrow">Climatização e AVAC · Lisboa, Cascais e Estoril</p>
      <h1>Conforto e eficiência, <em>em qualquer estação.</em></h1>
      <p class="lead">Soluções profissionais de climatização, AVAC, bombas de calor e eficiência energética para residências, empresas e indústria.</p>
      <div class="btn-row">
        <a class="btn btn--light btn--lg" href="{u('/pedir-orcamento/')}">Pedir orçamento {ARROW}</a>
        <a class="btn btn--ghost-light btn--lg" href="{u('/servicos/')}">Conhecer serviços</a>
      </div>
      <p class="hero-note"><strong>+30</strong><span>Mais de 30 anos de experiência técnica em climatização e AVAC</span></p>
    </div>
    <div class="hero-figure">{pic("hero", "Corte de uma habitação com unidade interior de ar condicionado, distribuição de ar e bomba de calor exterior", eager=True)}</div>
  </div>
</section>

<section class="proof" aria-label="Em resumo">
  <div class="wrap">
    <div class="proof-grid">
      <div class="proof-item"><b>+30 anos</b><span>Experiência técnica da equipa</span></div>
      <div class="proof-item"><b>Portugal</b><span>Cobertura nacional</span></div>
      <div class="proof-item"><b>Residencial</b><span>Comercial e Industrial</span></div>
      <div class="proof-item"><b>Eficiência</b><span>Soluções energeticamente eficientes</span></div>
    </div>
  </div>
</section>

<section class="section">
  <div class="wrap split">
    <div class="reveal">
      <p class="eyebrow">Especialistas em climatização</p>
      <h2>Especialistas em conforto. Rigorosos na eficiência.</h2>
      <div class="prose lead" style="margin-top:28px">
        <p>A ThermoKraft é uma empresa portuguesa especializada em climatização, AVAC, ar condicionado, bombas de calor, ventilação e eficiência energética.</p>
        <p>Fundada em 2026, nasce apoiada na experiência de técnicos com mais de 30 anos de actividade no sector, reunindo conhecimento técnico, rigor e acompanhamento próximo dos clientes.</p>
        <p>Desenvolvemos soluções adaptadas às necessidades de instalações residenciais, comerciais e industriais, privilegiando equipamentos eficientes, fiáveis e tecnologicamente evoluídos.</p>
      </div>
      <div class="btn-row" style="margin-top:32px"><a class="link-arrow" href="{u('/empresa/')}">Conhecer a empresa {ARROW}</a></div>
    </div>
    <div class="reveal">
      <div class="figure">{pic("empresa", "Planta técnica com rede de condutas de climatização")}</div>
      <p class="figcap"><span>Projecto · Instalação · Manutenção</span><span>Estoril</span></p>
    </div>
  </div>
</section>

<section class="section section--mist" id="servicos">
  <div class="wrap">
    <div class="head head--split reveal">
      <div><p class="eyebrow">Serviços</p><h2>Soluções completas de climatização e AVAC</h2></div>
      <p class="lead">Da instalação à manutenção, intervimos em todo o ciclo de vida dos sistemas de climatização, ventilação e produção de águas quentes.</p>
    </div>
    <div class="svc-grid">{svc_cards()}</div>
  </div>
</section>

<section class="section section--dark eff">
  <div class="wrap eff-grid">
    <div class="reveal">
      <p class="eyebrow">Eficiência energética</p>
      <h2>Mais conforto. Menos consumo.</h2>
      <p class="lead" style="color:#B9D0DB;margin-top:24px">A ThermoKraft procura desenvolver soluções que permitam:</p>
      <ul class="checks">
        <li>Reduzir consumos energéticos</li><li>Optimizar custos de exploração</li>
        <li>Melhorar o desempenho dos equipamentos</li><li>Aumentar o conforto térmico</li>
        <li>Prolongar a vida útil das instalações</li><li>Reduzir o impacto ambiental</li>
      </ul>
      <a class="btn btn--light btn--lg" href="{u('/eficiencia-energetica/')}" style="white-space:normal;text-align:center">Descobrir soluções de eficiência energética {ARROW}</a>
    </div>
    <div class="cop reveal">
      <h3>Como funciona uma bomba de calor</h3>
      <p>O coeficiente de desempenho (COP) indica quanta energia térmica é disponibilizada por cada unidade de electricidade consumida.</p>
      <div class="cop-bars" role="img" aria-label="Exemplo: com COP 4, 1 kWh de electricidade resulta em cerca de 4 kWh de energia térmica">
        <div class="cop-row"><span>Electricidade</span><div class="cop-bar cop-bar--in">1 kWh</div></div>
        <div class="cop-row"><span>Energia térmica</span><div class="cop-bar cop-bar--out">≈ 4 kWh</div></div>
      </div>
      <small>Exemplo ilustrativo para um COP de 4. O desempenho real depende do equipamento, da temperatura exterior e das condições de funcionamento.</small>
    </div>
  </div>
</section>

<section class="section">
  <div class="wrap">
    <div class="head reveal"><p class="eyebrow">Para cada tipo de espaço</p><h2>Do apartamento à instalação industrial</h2></div>
    <div class="seg-grid">
      <a class="seg reveal" href="{u('/servicos/ar-condicionado/')}"><div class="media">{pic("residencial", "Moradia contemporânea com unidade exterior de climatização", w=800, h=560)}</div><div class="body"><span class="tag">Residencial</span><h3>Residencial</h3><p>Climatização eficiente para apartamentos, moradias e condomínios.</p></div></a>
      <a class="seg reveal" href="{u('/servicos/ventiloconvectores/')}"><div class="media">{pic("comercial", "Edifícios de escritórios com equipamentos AVAC na cobertura")}</div><div class="body"><span class="tag">Comercial</span><h3>Comercial</h3><p>Soluções AVAC para escritórios, lojas, restauração, hotelaria e espaços comerciais.</p></div></a>
      <a class="seg reveal" href="{u('/assistencia-tecnica/')}"><div class="media">{pic("industrial", "Pavilhão industrial com sistema de climatização")}</div><div class="body"><span class="tag">Industrial</span><h3>Industrial</h3><p>Soluções técnicas dimensionadas para instalações industriais e espaços de maior exigência.</p></div></a>
    </div>
  </div>
</section>

<section class="section section--mist">
  <div class="wrap">
    <div class="head reveal"><p class="eyebrow">Porquê a ThermoKraft?</p><h2>Uma empresa nova, com uma equipa experiente</h2></div>
    <div class="why-grid">
      {"".join(f'<div class="why"><span class="ico">{icon(i)}</span><h3>{t}</h3><p>{d}</p></div>' for i, t, d in why)}
    </div>
  </div>
</section>

<section class="section">
  <div class="wrap">
    <div class="head reveal"><p class="eyebrow">Processo</p><h2>Como trabalhamos</h2></div>
    <ol class="steps">
      {"".join(f'<li class="step"><span class="dot">{i:02d}</span><h3>{t}</h3><p>{d}</p></li>' for i, (t, d) in enumerate(steps, 1))}
    </ol>
  </div>
</section>

<section class="section section--mist">
  <div class="wrap area-grid">
    <div class="reveal">
      <p class="eyebrow">Área de actuação</p>
      <h2>Do Estoril para todo o país.</h2>
      <p class="lead" style="margin-top:24px">A ThermoKraft está sediada no Estoril e tem uma presença especialmente activa na região de Lisboa, Cascais, Estoril, Sintra, Oeiras e restante Área Metropolitana de Lisboa. Prestamos igualmente serviços em todo o território nacional.</p>
      <ul class="chips" aria-label="Zonas de actuação principal">
        <li class="on">Estoril</li>{"".join(f"<li>{a}</li>" for a in AREAS if a != "Estoril")}<li>Área Metropolitana de Lisboa</li><li>Todo o país</li>
      </ul>
    </div>
    <div class="map reveal">{map_svg()}</div>
  </div>
</section>

{cta_final()}
'''

def empresa():
    values = [("Competência", "Conhecimento técnico sólido, actualizado com a evolução do sector."), ("Rigor", "Análise cuidada, execução correcta e atenção ao detalhe."), ("Transparência", "Propostas claras e comunicação honesta em cada fase."), ("Proximidade", "Acompanhamento directo e disponibilidade para o cliente."), ("Eficiência", "Soluções que reduzem consumos e custos de exploração."), ("Responsabilidade", "Compromisso com a segurança, a qualidade e o ambiente.")]
    return page_hero([("/empresa/", "Empresa")], "Empresa", "Uma empresa recente, apoiada em décadas de experiência técnica.", "A ThermoKraft nasce em 2026 no Estoril para fornecer soluções técnicas de elevada qualidade em climatização, AVAC e eficiência energética.") + f'''
<section class="section">
  <div class="wrap split">
    <div class="reveal">
      <p class="eyebrow">Quem somos</p>
      <h2>Engenharia do conforto</h2>
      <div class="prose lead" style="margin-top:28px">
        <p>A ThermoKraft | Climatização, Unipessoal, Lda. foi fundada em 2026 com o objectivo de fornecer soluções técnicas de elevada qualidade nas áreas da climatização, AVAC e eficiência energética.</p>
        <p>Apesar de ser uma empresa recente, a ThermoKraft conta com técnicos com mais de 30 anos de experiência no sector da climatização e do AVAC, garantindo elevados padrões de qualidade, rigor técnico e profissionalismo.</p>
        <p>Acompanhamos a evolução tecnológica do sector e privilegiamos soluções energeticamente eficientes, equipamentos de elevado desempenho e sistemas concebidos para proporcionar conforto, fiabilidade e sustentabilidade.</p>
      </div>
      <dl class="facts">
        <div><dt>Fundação</dt><dd>2026</dd></div>
        <div><dt>Sede</dt><dd>Estoril</dd></div>
        <div><dt>Actuação</dt><dd>Área Metropolitana de Lisboa</dd></div>
        <div><dt>Cobertura</dt><dd>Todo o território nacional</dd></div>
      </dl>
    </div>
    <div class="reveal">
      <div class="figure">{pic("empresa", "Planta técnica com rede de condutas de climatização")}</div>
    </div>
  </div>
</section>

<section class="section section--mist">
  <div class="wrap split">
    <div class="big-stat reveal"><b>+30</b><span>anos de experiência técnica da equipa</span></div>
    <div class="reveal">
      <p class="eyebrow">Experiência</p>
      <h2>A experiência está na equipa</h2>
      <p class="lead" style="margin-top:20px">A empresa foi fundada em 2026. A experiência de mais de três décadas é dos técnicos que a integram: anos de instalações, manutenção e assistência em habitações, edifícios de serviços e instalações industriais, que agora colocamos ao serviço de cada cliente da ThermoKraft.</p>
    </div>
  </div>
</section>

<section class="section">
  <div class="wrap">
    <div class="mv">
      <article class="reveal"><span class="tag">Missão</span><p>Fornecer soluções de climatização eficientes, fiáveis e tecnicamente adequadas às necessidades de cada cliente.</p></article>
      <article class="reveal"><span class="tag">Visão</span><p>Ser uma referência nacional no sector AVAC pela competência técnica, qualidade do serviço e eficiência das soluções.</p></article>
    </div>
  </div>
</section>

<section class="section section--dark">
  <div class="wrap">
    <div class="head reveal"><p class="eyebrow">Valores</p><h2>O que orienta o nosso trabalho</h2></div>
    <div class="values">{"".join(f"<div><b>{t}</b><span>{d}</span></div>" for t, d in values)}</div>
  </div>
</section>
{cta_final()}'''

def servicos():
    idx = "".join(f'<li><a href="#{s["slug"]}"><span>{s["n"]}</span>{s["name"]}</a></li>' for s in SERVICES)
    blocks = ""
    for i, s in enumerate(SERVICES):
        rev = " split--rev" if i % 2 else ""
        more = svc_url(s)
        qs = {"ar-condicionado": "ar-condicionado", "manutencao-preventiva": "manutencao", "manutencao-correctiva": "manutencao", "assistencia-tecnica-avac": "assistencia", "bombas-de-calor": "bombas-de-calor", "ventiloconvectores": "outro", "ventilacao-mecanica-controlada": "ventilacao", "higienizacao-de-equipamentos": "manutencao", "eficiencia-energetica": "eficiencia", "pre-instalacoes": "pre-instalacao"}[s["slug"]]
        blocks += f'''<section class="svc-block" id="{s["slug"]}"><div class="split{rev}">
<div class="reveal"><span class="num">{s["n"]}</span><h2>{s["name"]}</h2><div class="prose"><p class="lead">{s["lead"]}</p><p>{s["body"][0]}</p></div>
<div class="lists"><div class="list-box"><h3>Benefícios</h3><ul>{"".join(f"<li>{b}</li>" for b in s["benefits"])}</ul></div>
<div class="list-box"><h3>Recomendado quando</h3><ul>{"".join(f"<li>{b}</li>" for b in s["when"])}</ul></div></div>
<div class="btn-row"><a class="btn" href="{u('/pedir-orcamento/?servico=' + qs)}">Pedir orçamento {ARROW}</a><a class="btn btn--ghost" href="{u(more)}">Saber mais</a></div></div>
<div class="figure reveal">{pic(s["slug"], s["name"])}</div>
</div></section>'''
    return page_hero([("/servicos/", "Serviços")], "Serviços", "Serviços de climatização, AVAC e eficiência energética", "Instalação, manutenção e assistência técnica para habitações, empresas, condomínios e indústria, em Lisboa, Cascais, Estoril, Sintra, Oeiras e em todo o país.") + f'''
<section class="section section--mist section--tight"><div class="wrap"><ul class="svc-index">{idx}</ul></div></section>
<div class="wrap">{blocks}</div>
{cta_final()}'''

def servico(s):
    qs = {"ar-condicionado": "ar-condicionado", "manutencao-preventiva": "manutencao", "manutencao-correctiva": "manutencao", "bombas-de-calor": "bombas-de-calor", "ventiloconvectores": "outro", "ventilacao-mecanica-controlada": "ventilacao", "higienizacao-de-equipamentos": "manutencao", "pre-instalacoes": "pre-instalacao"}[s["slug"]]
    rel = [x for x in SERVICES if x["slug"] != s["slug"]]
    hero = page_hero([("/servicos/", "Serviços"), (svc_url(s), s["name"])], f'Serviço {s["n"]}', s["h1"], s["lead"],
                     f'<div class="btn-row"><a class="btn btn--light btn--lg" href="{u("/pedir-orcamento/?servico=" + qs)}">Pedir orçamento {ARROW}</a></div>',
                     pic(s["slug"], s["name"], eager=True))
    return hero + f'''
<section class="section">
  <div class="wrap detail-grid">
    <div>
      <h2>{s["name"]}: o que fazemos</h2>
      <div class="prose">{"".join(f"<p>{p}</p>" for p in s["body"])}</div>
      <div class="lists">
        <div class="list-box"><h3>Benefícios</h3><ul>{"".join(f"<li>{b}</li>" for b in s["benefits"])}</ul></div>
        <div class="list-box"><h3>Recomendado quando</h3><ul>{"".join(f"<li>{b}</li>" for b in s["when"])}</ul></div>
      </div>
      <h2 style="margin-top:56px">Onde actuamos</h2>
      <div class="prose"><p>Prestamos este serviço a partir do Estoril, com presença especialmente activa em {", ".join(AREAS[:-1])} e {AREAS[-1]}, e no restante território nacional.</p></div>
    </div>
    <aside class="aside-card" aria-label="O que inclui">
      <h3>O serviço inclui</h3>
      <ol>{"".join(f"<li>{x}</li>" for x in s["includes"])}</ol>
      <a class="btn" href="{u("/pedir-orcamento/?servico=" + qs)}">Pedir orçamento {ARROW}</a>
      <p class="note">Ou escreva para <a href="mailto:{EMAIL}">{EMAIL}</a></p>
    </aside>
  </div>
</section>
<section class="section section--mist section--tight">
  <div class="wrap"><div class="head"><p class="eyebrow">Outros serviços</p><h2>Também podemos ajudar com</h2></div>
  <div class="related">{"".join(f'<a href="{u(svc_url(x))}">{x["name"]} <span>{x["n"]}</span></a>' for x in rel)}</div></div>
</section>
{cta_final()}'''

def eficiencia():
    topics = [
        ("Optimização de sistemas AVAC", "Revemos o funcionamento das instalações existentes: horários, temperaturas de referência, caudais, sequências de arranque e equilíbrio das redes. Pequenos ajustes têm, muitas vezes, um impacto relevante no consumo."),
        ("Escolha de equipamentos eficientes", "Seleccionamos equipamentos com elevados índices de eficiência sazonal (SEER e SCOP), tecnologia inverter e fluidos frigoríficos de menor impacto ambiental, adequados à carga térmica real."),
        ("Bombas de calor", "As bombas de calor aproveitam a energia do ar exterior para aquecimento, arrefecimento e águas quentes sanitárias, consumindo significativamente menos electricidade do que os sistemas por resistência eléctrica."),
        ("Manutenção preventiva", "Filtros colmatados e permutadores sujos aumentam o consumo e reduzem a capacidade. A manutenção periódica mantém o rendimento próximo do original."),
        ("Controlo e regulação", "Termóstatos programáveis, controlo por zonas, sondas de temperatura e sistemas de gestão permitem climatizar apenas quando e onde é necessário."),
        ("Redução de consumos", "Ao combinar o dimensionamento correcto, equipamentos eficientes, regulação e manutenção, reduzimos o consumo de energia e os custos de exploração das instalações."),
        ("Conforto térmico", "Eficiência não significa menos conforto. Temperaturas estáveis, ausência de correntes de ar e níveis de ruído adequados fazem parte de uma instalação bem concebida."),
        ("Sustentabilidade", "Menor consumo de energia significa menores emissões associadas. A integração com produção solar fotovoltaica reforça esse benefício."),
    ]
    return page_hero([("/eficiencia-energetica/", "Eficiência Energética")], "Eficiência energética", "Eficiência energética em sistemas AVAC", "Uma instalação AVAC correctamente dimensionada, bem regulada e mantida consome menos energia e proporciona mais conforto.",
                     f'<div class="btn-row"><a class="btn btn--light btn--lg" href="{u("/pedir-orcamento/?servico=eficiencia")}">Pedir avaliação {ARROW}</a></div>', pic("eficiencia-energetica", "Escala de classes de eficiência energética", eager=True)) + f'''
<section class="section">
  <div class="wrap split">
    <div class="reveal">
      <p class="eyebrow">Porque é importante</p>
      <h2>A eficiência começa no dimensionamento</h2>
      <div class="prose lead" style="margin-top:24px">
        <p>Um equipamento sobredimensionado liga e desliga com frequência, desgasta-se mais e consome mais do que o necessário. Um equipamento subdimensionado trabalha continuamente no limite sem garantir conforto.</p>
        <p>Por isso, cada proposta da ThermoKraft parte de uma análise técnica do espaço, da sua utilização e da instalação existente, para que a solução final seja adequada desde o primeiro dia e se mantenha eficiente ao longo da sua vida útil.</p>
      </div>
    </div>
    <div class="cop reveal" style="background:var(--ink)">
      <h3>COP e SCOP, em termos simples</h3>
      <p>O COP mede a relação entre a energia térmica disponibilizada e a electricidade consumida num dado momento. O SCOP mede essa relação ao longo de toda a estação de aquecimento.</p>
      <div class="cop-bars" role="img" aria-label="Exemplo: com COP 4, 1 kWh de electricidade resulta em cerca de 4 kWh de energia térmica">
        <div class="cop-row"><span>Electricidade</span><div class="cop-bar cop-bar--in">1 kWh</div></div>
        <div class="cop-row"><span>Energia térmica</span><div class="cop-bar cop-bar--out">≈ 4 kWh</div></div>
      </div>
      <small>Exemplo ilustrativo para um COP de 4. Os valores reais dependem do equipamento e das condições de funcionamento.</small>
    </div>
  </div>
</section>
<section class="section section--mist">
  <div class="wrap">
    <div class="head reveal"><p class="eyebrow">Áreas de intervenção</p><h2>Como reduzimos consumos</h2></div>
    <div class="topics">{"".join(f'<article class="topic reveal"><span class="k">{i:02d}</span><h3>{t}</h3><p>{d}</p></article>' for i, (t, d) in enumerate(topics, 1))}</div>
  </div>
</section>
<section class="section">
  <div class="wrap split">
    <div class="reveal"><p class="eyebrow">Resultados que procuramos</p><h2>Mais conforto. Menos consumo.</h2></div>
    <ul class="checks reveal" style="margin:0">
      <li>Reduzir consumos energéticos</li><li>Optimizar custos de exploração</li><li>Melhorar o desempenho dos equipamentos</li>
      <li>Aumentar o conforto térmico</li><li>Prolongar a vida útil das instalações</li><li>Reduzir o impacto ambiental</li>
    </ul>
  </div>
</section>
{cta_final("Quer reduzir o consumo da sua instalação?", "Analisamos o funcionamento dos seus sistemas de climatização e propomos medidas concretas de optimização, adequadas ao espaço e à utilização.", ("/pedir-orcamento/?servico=eficiencia", "Pedir avaliação"))}'''

# ------------------------------------------------------------------ formulários
def form_attrs(kind):
    pv = " data-preview" if PREVIEW else ""
    return f'action="{u("/enviar.php")}" method="post" enctype="multipart/form-data" novalidate data-form="{kind}"{pv}'

def f_text(id, label, req=False, type="text", auto="", hint="", full=False, ph=""):
    r = ' <span class="req" aria-hidden="true">*</span>' if req else ""
    rq = " required" if req else ""
    a = f' autocomplete="{auto}"' if auto else ""
    h = f'<span class="hint" id="{id}-h">{hint}</span>' if hint else ""
    err = {"email": "Indique um email válido.", "tel": "Indique um número de telefone válido."}.get(type, "Campo obrigatório.")
    st = ' style="grid-column:1/-1"' if full else ""
    p = f' placeholder="{ph}"' if ph else ""
    return f'<div class="field"{st}><label for="{id}">{label}{r}</label><input class="input" id="{id}" name="{id}" type="{type}"{a}{rq}{p}>{h}<span class="err">{err}</span></div>'

def f_consent(id="rgpd"):
    return f'''<div class="field"><label class="consent" for="{id}"><input type="checkbox" id="{id}" name="rgpd" value="sim" required><span>Li e aceito a <a href="{u('/politica-de-privacidade/')}">Política de Privacidade</a> e autorizo o tratamento dos meus dados para resposta ao pedido apresentado. <span class="req" aria-hidden="true">*</span></span></label><span class="err">É necessário aceitar a Política de Privacidade.</span></div>'''

def f_files(id="anexos"):
    return f'''<div class="field"><span class="lbl" id="{id}-l">Fotografias ou documentos</span>
<div class="drop" data-list="{id}-lista">{icon("upload")}<b>Arraste ficheiros ou clique para anexar</b><small>Até 5 ficheiros · JPG, PNG, HEIC ou PDF · máx. 8 MB cada</small>
<input type="file" id="{id}" name="anexos[]" multiple accept=".jpg,.jpeg,.png,.webp,.heic,.pdf,image/*,application/pdf" aria-labelledby="{id}-l"></div>
<ul class="files" id="{id}-lista" aria-live="polite"></ul><span class="err">Máximo de 5 ficheiros, 8 MB por ficheiro e 20 MB no total.</span></div>'''

HONEY = '<div class="hp" aria-hidden="true"><label for="website">Website</label><input id="website" name="website" type="text" tabindex="-1" autocomplete="off"></div>'

SERVICE_OPTS = [("ar-condicionado", "Ar condicionado"), ("manutencao", "Manutenção"), ("assistencia", "Assistência técnica"), ("bombas-de-calor", "Bombas de calor"), ("ventilacao", "Ventilação"), ("eficiencia", "Eficiência energética"), ("pre-instalacao", "Pré-instalação"), ("outro", "Outro")]

def orcamento():
    tipos = ["Particular", "Empresa", "Condomínio", "Indústria"]
    form = f'''<form class="form" id="form-orcamento" {form_attrs("orcamento")} data-ok="Obrigado. Recebemos o seu pedido de orçamento e entraremos em contacto brevemente.">
<input type="hidden" name="tipo_formulario" value="orcamento">{HONEY}
<fieldset class="group"><legend>Os seus dados</legend><div class="fields fields--2">
{f_text("nome", "Nome", True, auto="name")}{f_text("empresa", "Empresa", auto="organization")}
{f_text("telefone", "Telefone", True, "tel", "tel")}{f_text("email", "Email", True, "email", "email")}
{f_text("localidade", "Localidade", True, auto="address-level2", hint="Ex.: Cascais, Oeiras, Lisboa", full=True)}
</div></fieldset>
<fieldset class="group"><legend>O seu pedido</legend>
<div class="field" style="margin-bottom:22px"><span class="lbl" id="tc-l">Tipo de cliente <span class="req" aria-hidden="true">*</span></span>
<div class="choice choice--4" role="radiogroup" aria-labelledby="tc-l">{"".join(f'<label><input type="radio" name="tipo_cliente" value="{t}"{" required" if i == 0 else ""}><span>{t}</span></label>' for i, t in enumerate(tipos))}</div>
<span class="err">Seleccione o tipo de cliente.</span></div>
<div class="fields">
<div class="field"><label for="servico">Serviço pretendido <span class="req" aria-hidden="true">*</span></label><select class="input" id="servico" name="servico" required><option value="">Seleccione um serviço</option>{"".join(f'<option value="{v}">{t}</option>' for v, t in SERVICE_OPTS)}</select><span class="err">Seleccione um serviço.</span></div>
<div class="field"><label for="mensagem">Mensagem</label><textarea class="input" id="mensagem" name="mensagem" placeholder="Descreva o espaço, os equipamentos existentes e o que pretende."></textarea></div>
{f_files()}
</div></fieldset>
<div class="group">{f_consent()}
<div class="form-foot"><small><span class="req">*</span> Campos obrigatórios</small><button class="btn btn--lg" type="submit">Pedir orçamento {ARROW}</button></div>
<div class="form-status" role="status" aria-live="polite"></div></div>
</form>'''
    side = f'''<aside class="side">
<div class="side-card side-card--dark"><h3>O que acontece a seguir</h3><ol>
<li><b>01</b><span>Analisamos o seu pedido e a informação enviada.</span></li>
<li><b>02</b><span>Entramos em contacto para esclarecer detalhes e, se necessário, agendar uma visita técnica.</span></li>
<li><b>03</b><span>Apresentamos uma proposta adequada ao espaço, à utilização e aos seus objectivos.</span></li></ol></div>
<div class="side-card"><h3>Prefere escrever-nos?</h3><p><a href="mailto:{EMAIL}">{EMAIL}</a></p><p style="margin-top:10px;color:var(--muted)">Fotografias dos equipamentos, da placa de características e do espaço ajudam-nos a preparar uma resposta mais rigorosa.</p></div>
</aside>'''
    return page_hero([("/pedir-orcamento/", "Pedir Orçamento")], "Pedir orçamento", "Peça um orçamento para a sua instalação", "Indique-nos o que pretende. Analisamos o pedido e respondemos com uma proposta adequada ao seu espaço.") + f'''
<section class="section section--mist"><div class="wrap form-shell">{form}{side}</div></section>'''

def assistencia():
    servs = ["Diagnóstico de avarias", "Reparações", "Manutenção correctiva", "Manutenção preventiva", "Limpeza e higienização", "Verificação de desempenho dos equipamentos"]
    signs = ["O equipamento não arrefece ou não aquece", "Aparecem códigos de erro", "Há fugas de água na unidade interior", "Ruídos ou vibrações anormais", "Cheiros desagradáveis ao ligar", "Consumo de energia invulgarmente elevado", "Formação de gelo na unidade", "O equipamento desliga sozinho"]
    equip = ["Ar condicionado split e multi-split", "Sistemas VRF / VRV", "Bombas de calor", "Ventiloconvectores", "Unidades de tratamento de ar", "Sistemas de ventilação e VMC"]
    form = f'''<form class="form" id="form-assistencia" {form_attrs("assistencia")} data-ok="Obrigado. Recebemos o seu pedido de assistência técnica e entraremos em contacto brevemente.">
<input type="hidden" name="tipo_formulario" value="assistencia"><input type="hidden" name="servico" value="assistencia">{HONEY}
<div class="fields fields--2">
{f_text("a-nome", "Nome", True, auto="name").replace('name="a-nome"', 'name="nome"')}
{f_text("a-telefone", "Telefone", True, "tel", "tel").replace('name="a-telefone"', 'name="telefone"')}
{f_text("a-email", "Email", True, "email", "email").replace('name="a-email"', 'name="email"')}
{f_text("a-localidade", "Localidade", True, auto="address-level2").replace('name="a-localidade"', 'name="localidade"')}
{f_text("a-equipamento", "Equipamento (marca e modelo, se souber)", full=True).replace('name="a-equipamento"', 'name="equipamento"')}
<div class="field" style="grid-column:1/-1"><label for="a-mensagem">Descrição do problema <span class="req" aria-hidden="true">*</span></label><textarea class="input" id="a-mensagem" name="mensagem" required placeholder="O que está a acontecer? Desde quando? Aparece algum código de erro?"></textarea><span class="err">Descreva brevemente o problema.</span></div>
<div style="grid-column:1/-1">{f_files("a-anexos")}</div>
<div style="grid-column:1/-1">{f_consent("a-rgpd")}</div>
</div>
<div class="form-foot"><small><span class="req">*</span> Campos obrigatórios</small><button class="btn btn--lg" type="submit">Pedir assistência técnica {ARROW}</button></div>
<div class="form-status" role="status" aria-live="polite"></div>
</form>'''
    return page_hero([("/assistencia-tecnica/", "Assistência Técnica")], "Assistência técnica AVAC", "Assistência técnica AVAC quando precisa.", "Diagnóstico, reparação e manutenção de sistemas de ar condicionado, bombas de calor, ventiloconvectores e ventilação, em Lisboa, Cascais, Estoril, Sintra, Oeiras e em todo o país.",
                     f'<div class="btn-row"><a class="btn btn--light btn--lg" href="#pedido">Pedir assistência técnica {ARROW}</a><a class="btn btn--ghost-light btn--lg mail-chip" href="mailto:{EMAIL}">{EMAIL}</a></div>',
                     pic("assistencia-tecnica-avac", "Diagnóstico técnico de uma unidade exterior de climatização", eager=True)) + f'''
<section class="section">
  <div class="wrap split">
    <div class="reveal"><p class="eyebrow">Serviços de assistência</p><h2>Intervenção técnica especializada</h2>
      <p class="lead" style="margin-top:20px">Os nossos técnicos, com mais de 30 anos de experiência no sector, identificam a causa do problema antes de propor qualquer reparação.</p></div>
    <div class="reveal"><ul class="checks" style="margin:0">{"".join(f"<li>{x}</li>" for x in servs)}</ul></div>
  </div>
</section>
<section class="section section--mist section--tight">
  <div class="wrap"><div class="head reveal"><p class="eyebrow">Quando pedir assistência</p><h2>Sinais de que o seu sistema precisa de atenção</h2></div>
  <ul class="signs">{"".join(f"<li><i></i>{x}</li>" for x in signs)}</ul></div>
</section>
<section class="section section--tight">
  <div class="wrap split">
    <div class="reveal"><p class="eyebrow">Equipamentos</p><h2>Sistemas em que intervimos</h2></div>
    <div class="lists reveal" style="margin:0"><div class="list-box" style="grid-column:1/-1"><ul style="grid-template-columns:repeat(auto-fill,minmax(220px,1fr))">{"".join(f"<li>{x}</li>" for x in equip)}</ul></div></div>
  </div>
</section>
<section class="section section--mist" id="pedido">
  <div class="wrap form-shell">
    <div><div class="head" style="margin-bottom:32px"><p class="eyebrow">Pedido de assistência</p><h2>Descreva-nos o problema</h2></div>{form}</div>
    <aside class="side" style="align-self:end">
      <div class="side-card side-card--dark"><h3>Como funciona</h3><ol>
        <li><b>01</b><span>Recebemos o pedido e analisamos a descrição e as fotografias.</span></li>
        <li><b>02</b><span>Contactamo-lo para confirmar detalhes e agendar a intervenção.</span></li>
        <li><b>03</b><span>Diagnosticamos e apresentamos a solução antes de avançar.</span></li></ol></div>
      <div class="side-card"><h3>Dica</h3><p style="color:var(--muted)">Uma fotografia da placa de características do equipamento e do código de erro no visor ou comando ajuda a preparar a intervenção.</p></div>
    </aside>
  </div>
</section>'''

def contactos():
    form = f'''<form class="form" id="form-contacto" {form_attrs("contacto")} data-ok="Obrigado pela sua mensagem. Responderemos brevemente.">
<input type="hidden" name="tipo_formulario" value="contacto">{HONEY}
<div class="fields fields--2">
{f_text("c-nome", "Nome", True, auto="name").replace('name="c-nome"', 'name="nome"')}
{f_text("c-email", "Email", True, "email", "email").replace('name="c-email"', 'name="email"')}
{f_text("c-telefone", "Telefone", auto="tel", type="tel").replace('name="c-telefone"', 'name="telefone"')}
{f_text("c-assunto", "Assunto").replace('name="c-assunto"', 'name="assunto"')}
<div class="field" style="grid-column:1/-1"><label for="c-mensagem">Mensagem <span class="req" aria-hidden="true">*</span></label><textarea class="input" id="c-mensagem" name="mensagem" required></textarea><span class="err">Escreva a sua mensagem.</span></div>
<div style="grid-column:1/-1">{f_consent("c-rgpd")}</div>
</div>
<div class="form-foot"><small><span class="req">*</span> Campos obrigatórios</small><button class="btn btn--lg" type="submit">Enviar mensagem {ARROW}</button></div>
<div class="form-status" role="status" aria-live="polite"></div>
</form>'''
    # telefone opcional neste formulário: remover validação de comprimento quando vazio
    form = form.replace('type="tel" autocomplete="tel">', 'type="tel" autocomplete="tel" data-optional>')
    return page_hero([("/contactos/", "Contactos")], "Contactos", "Fale com a ThermoKraft", "Envie-nos a sua questão ou descreva o seu projecto. Respondemos com a maior brevidade possível.") + f'''
<section class="section">
  <div class="wrap form-shell">
    {form}
    <aside class="side">
      <div class="side-card">
        <h3 style="font-size:1rem;letter-spacing:.02em">THERMOKRAFT | CLIMATIZAÇÃO, UNIPESSOAL, LDA.</h3>
        <dl style="margin:0">
          <div class="contact-line"><dt>Localização</dt><dd>Estoril<br>Portugal</dd></div>
          <div class="contact-line"><dt>Email</dt><dd><a href="mailto:{EMAIL}">{EMAIL}</a></dd></div>
          <div class="contact-line"><dt>Área de actuação</dt><dd style="font-size:1rem;font-weight:600">Lisboa, Cascais, Estoril, Sintra, Oeiras, Amadora e restante Área Metropolitana de Lisboa. Todo o território nacional.</dd></div>
        </dl>
      </div>
      <div class="side-card side-card--dark"><h3>Precisa de um orçamento?</h3><p>Use o formulário de pedido de orçamento para nos enviar todos os detalhes e fotografias.</p><a class="btn btn--light" style="margin-top:18px" href="{u('/pedir-orcamento/')}">Pedir orçamento {ARROW}</a></div>
    </aside>
  </div>
</section>'''

def privacidade():
    return page_hero([("/politica-de-privacidade/", "Política de Privacidade")], "Informação legal", "Política de Privacidade", "Como tratamos os dados pessoais que nos confia através deste website.") + f'''
<section class="section"><div class="wrap legal prose">
<p class="upd">Última actualização: {datetime.date.today().strftime("%d/%m/%Y")}</p>
<h2>1. Responsável pelo tratamento</h2>
<p>O responsável pelo tratamento dos dados pessoais recolhidos através deste website é a {esc(LEGAL)}, com sede no Estoril, Portugal. Para qualquer questão relacionada com dados pessoais, pode contactar-nos através do email <a href="mailto:{EMAIL}">{EMAIL}</a>.</p>
<h2>2. Dados recolhidos</h2>
<p>Recolhemos apenas os dados que nos fornece voluntariamente através dos formulários de pedido de orçamento, pedido de assistência técnica e contacto: nome, empresa, telefone, email, localidade, tipo de cliente, serviço pretendido, mensagem e eventuais ficheiros anexados (fotografias ou documentos).</p>
<h2>3. Finalidades e fundamento</h2>
<ul><li>Responder a pedidos de orçamento, assistência técnica ou informação;</li><li>Preparar e apresentar propostas comerciais;</li><li>Agendar visitas técnicas e intervenções.</li></ul>
<p>O tratamento tem como fundamento o seu consentimento e a realização de diligências pré-contratuais a seu pedido, nos termos do artigo 6.º, n.º 1, alíneas a) e b), do Regulamento Geral sobre a Protecção de Dados (RGPD).</p>
<h2>4. Conservação</h2>
<p>Os dados são conservados apenas durante o período necessário para responder ao pedido e, caso venha a existir uma relação contratual, durante o período exigido pelas obrigações legais aplicáveis. Pedidos que não resultem em relação contratual são eliminados num prazo razoável após a resposta.</p>
<h2>5. Partilha de dados</h2>
<p>Não vendemos nem cedemos os seus dados a terceiros para fins comerciais. Os dados podem ser tratados por prestadores de serviços que nos apoiam tecnicamente (por exemplo, alojamento do website e serviço de email), na qualidade de subcontratantes e com garantias adequadas de protecção.</p>
<h2>6. Os seus direitos</h2>
<p>Pode, a qualquer momento, exercer os direitos de acesso, rectificação, apagamento, limitação do tratamento, portabilidade e oposição, bem como retirar o consentimento prestado, através de <a href="mailto:{EMAIL}">{EMAIL}</a>. Tem ainda o direito de apresentar reclamação junto da Comissão Nacional de Protecção de Dados (CNPD).</p>
<h2>7. Segurança</h2>
<p>Adoptamos medidas técnicas e organizativas adequadas para proteger os dados pessoais contra perda, acesso não autorizado ou divulgação indevida, incluindo a transmissão cifrada (HTTPS) dos formulários.</p>
<h2>8. Alterações</h2>
<p>Esta política pode ser actualizada. A versão em vigor está sempre disponível nesta página.</p>
</div></section>'''

def cookies():
    return page_hero([("/politica-de-cookies/", "Política de Cookies")], "Informação legal", "Política de Cookies", "Informação sobre a utilização de cookies e tecnologias semelhantes neste website.") + f'''
<section class="section"><div class="wrap legal prose">
<p class="upd">Última actualização: {datetime.date.today().strftime("%d/%m/%Y")}</p>
<h2>1. O que são cookies</h2>
<p>Cookies são pequenos ficheiros de texto guardados no seu dispositivo quando visita um website. Permitem, por exemplo, memorizar preferências ou recolher informação estatística sobre a utilização do site.</p>
<h2>2. Cookies utilizados neste website</h2>
<p>Este website não utiliza cookies de publicidade, de perfil ou de análise estatística. Os tipos de letra e todos os recursos são alojados no próprio servidor, sem recurso a serviços de terceiros que coloquem cookies.</p>
<p>Poderão ser utilizados apenas cookies estritamente necessários ao funcionamento técnico do website e dos formulários, que não exigem consentimento prévio.</p>
<h2>3. Alterações</h2>
<p>Caso venham a ser utilizadas ferramentas de análise estatística ou outros serviços que recorram a cookies não essenciais, esta política será actualizada e será solicitado o seu consentimento prévio.</p>
<h2>4. Como gerir cookies</h2>
<p>Pode configurar o seu navegador para bloquear ou eliminar cookies. Consulte a ajuda do seu navegador para saber como o fazer.</p>
<h2>5. Contacto</h2>
<p>Para qualquer questão, contacte-nos através de <a href="mailto:{EMAIL}">{EMAIL}</a>.</p>
</div></section>'''

def notfound():
    return page_hero([("/404", "Página não encontrada")], "Erro 404", "Página não encontrada", "A página que procura não existe ou foi movida.", f'<div class="btn-row"><a class="btn btn--light btn--lg" href="{u("/")}">Voltar ao início {ARROW}</a><a class="btn btn--ghost-light btn--lg" href="{u("/servicos/")}">Ver serviços</a></div>')

# ================================================================== BUILD
def svc_schema(s):
    return {"@context": "https://schema.org", "@type": "Service", "name": s["name"], "serviceType": s["name"], "description": s["meta"],
            "url": BASE + svc_url(s), "provider": {"@id": BASE + "/#empresa"},
            "areaServed": [{"@type": "City", "name": n} for n in AREAS] + [{"@type": "Country", "name": "Portugal"}]}

def build():
    if os.path.exists(OUT): shutil.rmtree(OUT)
    shutil.copytree(SRC, OUT, ignore=shutil.ignore_patterns("README*"))
    svgs.write_all(os.path.join(OUT, "assets/img/ilustracoes"))
    if PREVIEW and os.path.exists(os.path.join(OUT, "enviar.php")): os.remove(os.path.join(OUT, "enviar.php"))

    page("/", "ThermoKraft | Climatização, AVAC e Bombas de Calor em Lisboa e Estoril",
         "Empresa de climatização e AVAC no Estoril: instalação de ar condicionado, bombas de calor, ventilação, manutenção e assistência técnica em Lisboa, Cascais, Sintra e Oeiras.", home)
    page("/empresa/", "Empresa de Climatização e AVAC no Estoril", "A ThermoKraft é uma empresa de climatização e AVAC fundada em 2026 no Estoril, com técnicos com mais de 30 anos de experiência no sector.", empresa, [("/empresa/", "Empresa")])
    allsvc = {"@context": "https://schema.org", "@type": "ItemList", "itemListElement": [{"@type": "ListItem", "position": i, "name": s["name"], "url": BASE + svc_url(s)} for i, s in enumerate(SERVICES, 1)]}
    page("/servicos/", "Serviços de Climatização, AVAC e Ar Condicionado em Lisboa", "Instalação de ar condicionado, bombas de calor, VMC, ventiloconvectores, manutenção preventiva e correctiva e assistência técnica AVAC em Lisboa, Cascais e Estoril.", servicos, [("/servicos/", "Serviços")], [allsvc])
    for s in SERVICES:
        if "url" in s: continue
        page(svc_url(s), s["seo_title"], s["meta"], lambda s=s: servico(s), [("/servicos/", "Serviços"), (svc_url(s), s["name"])], [svc_schema(s)])
    ef = dict(SVC["eficiencia-energetica"], meta="Eficiência energética em sistemas AVAC: optimização, bombas de calor, controlo e regulação e manutenção preventiva para reduzir consumos e custos de exploração.")
    page("/eficiencia-energetica/", "Eficiência Energética em Sistemas AVAC", ef["meta"], eficiencia, [("/eficiencia-energetica/", "Eficiência Energética")], [svc_schema(ef)])
    at = dict(SVC["assistencia-tecnica-avac"], meta="Assistência técnica AVAC em Lisboa, Cascais, Estoril e Sintra: diagnóstico de avarias, reparação e manutenção de ar condicionado, bombas de calor e ventilação.")
    page("/assistencia-tecnica/", "Assistência Técnica AVAC e Ar Condicionado em Lisboa", at["meta"], assistencia, [("/assistencia-tecnica/", "Assistência Técnica")], [svc_schema(at)], sticky=("#pedido", "Pedir assistência técnica"))
    page("/pedir-orcamento/", "Pedir Orçamento de Climatização e AVAC", "Peça orçamento para instalação de ar condicionado, bombas de calor, ventilação, manutenção ou assistência técnica AVAC. Resposta por email.", orcamento, [("/pedir-orcamento/", "Pedir Orçamento")])
    page("/contactos/", "Contactos", "Contacte a ThermoKraft, empresa de climatização e AVAC sediada no Estoril. Email: geral@thermokraft.pt.", contactos, [("/contactos/", "Contactos")])
    page("/politica-de-privacidade/", "Política de Privacidade", "Política de privacidade e protecção de dados pessoais da ThermoKraft | Climatização, Unipessoal, Lda.", privacidade, [("/politica-de-privacidade/", "Política de Privacidade")])
    page("/politica-de-cookies/", "Política de Cookies", "Política de cookies do website da ThermoKraft.", cookies, [("/politica-de-cookies/", "Política de Cookies")])
    page("/404.html", "Página não encontrada", "A página que procura não existe.", notfound, outfile="404.html", noindex=True)

    if not PREVIEW:
        prio = lambda p: "1.0" if p == "/" else ("0.9" if p in ("/servicos/", "/pedir-orcamento/", "/assistencia-tecnica/") else ("0.3" if "politica" in p else "0.8"))
        sm = "".join(f"  <url><loc>{BASE}{p}</loc><lastmod>{TODAY}</lastmod><priority>{prio(p)}</priority></url>\n" for p in PAGES)
        open(os.path.join(OUT, "sitemap.xml"), "w").write(f'<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n{sm}</urlset>\n')
        open(os.path.join(OUT, "robots.txt"), "w").write(f"User-agent: *\nAllow: /\nDisallow: /enviar.php\n\nSitemap: {BASE}/sitemap.xml\n")
    print(f"{'preview' if PREVIEW else 'dist'}: {len(PAGES)} páginas indexáveis")

if __name__ == "__main__":
    build()
