"""Gera o site da Besides Informática.
Uso: python3 build.py            -> pasta dist/ (produção, para subir na hospedagem)
     python3 build.py --previa   -> pasta previa/ (links relativos, para visualizar)"""
import os, sys, shutil, json
from PIL import Image, ImageDraw, ImageFont
import dados as D
from base import Ctx, documento
from paginas import PAGINAS

AQUI = os.path.dirname(os.path.abspath(__file__))
MODO = "previa" if "--previa" in sys.argv else "producao"
SAIDA = os.path.join(AQUI, "previa" if MODO == "previa" else "dist")
IMG_ORIGEM = os.path.join(AQUI, "origem")

def escrever(rel, texto):
    p = os.path.join(SAIDA, rel)
    os.makedirs(os.path.dirname(p), exist_ok=True)
    with open(p, "w", encoding="utf-8") as f:
        f.write(texto)

def imagens():
    dst = os.path.join(SAIDA, "assets/img"); os.makedirs(dst, exist_ok=True)
    for n in ["logo-besides.png", "logo-besides-negativo.png", "simbolo-besides.png"]:
        shutil.copy(os.path.join(IMG_ORIGEM, n), dst)
    sim = Image.open(os.path.join(IMG_ORIGEM, "simbolo-besides.png")).convert("RGBA")
    def quadrado(lado, fundo=None, margem=0.08):
        tela = Image.new("RGBA", (lado, lado), fundo or (0, 0, 0, 0))
        m = int(lado * margem); w = lado - 2 * m
        s = sim.copy(); s.thumbnail((w, w), Image.LANCZOS)
        tela.alpha_composite(s, ((lado - s.width) // 2, (lado - s.height) // 2))
        return tela
    quadrado(180, (247, 246, 249, 255)).convert("RGB").save(os.path.join(dst, "apple-touch-icon.png"))
    quadrado(192).save(os.path.join(dst, "favicon-192.png"))
    quadrado(512).save(os.path.join(dst, "favicon-512.png"))
    quadrado(64, margem=0.02).save(os.path.join(SAIDA, "favicon.ico"), sizes=[(16, 16), (32, 32), (48, 48)])
    # imagem de compartilhamento 1200x630
    og = Image.new("RGB", (1200, 630), (25, 20, 36)); d = ImageDraw.Draw(og)
    neg = Image.open(os.path.join(IMG_ORIGEM, "logo-besides-negativo.png")).convert("RGBA")
    neg = neg.resize((760, int(760 * neg.height / neg.width)), Image.LANCZOS)
    og.paste(neg, (80, 150), neg)
    f = ImageFont.truetype(_fonte("Inter Display", "SemiBold"), 40)
    f2 = ImageFont.truetype(_fonte("Inter", "Regular"), 28)
    d.text((80, 420), "Suporte de TI e assistência técnica em Criciúma", font=f, fill=(242, 239, 247))
    d.text((80, 478), "Desde 2004 · besidesinfo.com.br", font=f2, fill=(184, 175, 201))
    # traço de circuito
    d.line((80, 560, 1120, 560), fill=(44, 201, 206), width=3)
    for x in (80, 1120):
        d.ellipse((x - 9, 551, x + 9, 569), outline=(79, 224, 138), width=3, fill=(25, 20, 36))
    og.save(os.path.join(dst, "og-besides.png"), optimize=True)

def _fonte(familia, estilo):
    import subprocess
    out = subprocess.run(["fc-match", "-f", "%{file}", f"{familia}:style={estilo}"], capture_output=True, text=True).stdout
    return out

def main():
    if os.path.exists(SAIDA): shutil.rmtree(SAIDA)
    shutil.copytree(os.path.join(AQUI, "static"), SAIDA)
    imagens()
    urls = []
    for fn in PAGINAS:
        caminho_ctx = None
        pg = fn(Ctx(MODO, ""))  # primeira passada para descobrir o caminho
        c = Ctx(MODO, "" if pg["caminho"].endswith(".html") else pg["caminho"])
        pg = fn(c)
        arq = pg["caminho"] if pg["caminho"].endswith(".html") else pg["caminho"] + "index.html"
        escrever(arq, documento(c, pg))
        if pg.get("indexar", True) and not pg["caminho"].endswith(".html"):
            urls.append(pg["caminho"])
    # sitemap e robots
    itens = "".join(f"  <url><loc>{D.SITE}/{u}</loc><lastmod>{D.DATA_PUBLICACAO}</lastmod></url>\n" for u in urls)
    escrever("sitemap.xml", f'<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n{itens}</urlset>\n')
    escrever("robots.txt", f"""# Besides Informática
# Buscadores e buscas de assistentes de IA: liberados nas páginas públicas.
User-agent: *
Disallow: /suporte/
Allow: /

# Coleta para TREINAMENTO de modelos de IA: bloqueada por padrão.
# Remova o bloco de um robô se a empresa decidir autorizar.
User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: Google-Extended
Disallow: /

User-agent: Applebot-Extended
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: meta-externalagent
Disallow: /

# Robôs de BUSCA de assistentes de IA (OAI-SearchBot, Claude-SearchBot, PerplexityBot)
# seguem a regra geral acima e podem acessar as páginas públicas.

Sitemap: {D.SITE}/sitemap.xml
""")
    escrever("site.webmanifest", json.dumps({
        "name": D.NOME, "short_name": "Besides", "start_url": "/", "display": "browser",
        "background_color": "#f7f6f9", "theme_color": "#191424", "lang": "pt-BR",
        "icons": [{"src": "/assets/img/favicon-192.png", "sizes": "192x192", "type": "image/png"},
                  {"src": "/assets/img/favicon-512.png", "sizes": "512x512", "type": "image/png"}]},
        ensure_ascii=False, indent=2))
    if MODO == "producao":
        escrever(".htaccess", HTACCESS)
    print(MODO, "->", SAIDA, len(urls), "URLs no sitemap")

HTACCESS = r"""# Besides Informática — servidor LiteSpeed/Apache
Options -Indexes
DirectoryIndex index.html index.php
ErrorDocument 404 /404.html

<IfModule mod_rewrite.c>
RewriteEngine On
# HTTPS e domínio sem www
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://besidesinfo.com.br%{REQUEST_URI} [L,R=301]

# Endereço antigo da página inicial
RewriteRule ^index\.(php|html?)$ / [L,R=301]
</IfModule>

<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set X-Frame-Options "SAMEORIGIN"
<FilesMatch "\.(css|js|png|jpg|webp|svg|ico|woff2)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
<FilesMatch "\.(html|xml|txt)$">
Header set Cache-Control "public, max-age=0, must-revalidate"
</FilesMatch>
</IfModule>

AddType application/manifest+json .webmanifest
"""

if __name__ == "__main__":
    main()
